From f68e7ac2c473084bae2f0125560376c492e3ef1c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 19:17:28 +0000 Subject: [PATCH] Version 3.0.0-beta3 updated. Non-versioned pages untouched --- 3.0.0-beta3/404.html | 3860 ------------ .../docs/comparing-openvidu/index.html | 4227 ------------- .../how-to/index.html | 4482 ------------- .../developing-your-openvidu-app/index.html | 4147 ------------- 3.0.0-beta3/docs/getting-started/index.html | 4380 ------------- .../docs/openvidu-call/docs/index.html | 4621 -------------- 3.0.0-beta3/docs/openvidu-call/index.html | 4146 ------------- .../classes/ParticipantModel.html | 852 --- .../components/ActivitiesPanelComponent.html | 488 -- .../components/AdminDashboardComponent.html | 402 -- .../components/AdminLoginComponent.html | 333 - .../BroadcastingActivityComponent.html | 352 -- .../components/ChatPanelComponent.html | 326 - .../components/LayoutComponent.html | 427 -- .../components/PanelComponent.html | 446 -- .../ParticipantPanelItemComponent.html | 358 -- .../ParticipantsPanelComponent.html | 345 -- .../RecordingActivityComponent.html | 421 -- .../components/StreamComponent.html | 467 -- .../components/ToolbarComponent.html | 600 -- .../components/VideoconferenceComponent.html | 1035 ---- ...iesPanelBroadcastingActivityDirective.html | 686 -- .../directives/ActivitiesPanelDirective.html | 472 -- ...vitiesPanelRecordingActivityDirective.html | 686 -- .../directives/AdditionalPanelsDirective.html | 405 -- ...AdminDashboardRecordingsListDirective.html | 608 -- .../AdminDashboardTitleDirective.html | 608 -- .../directives/AdminLoginErrorDirective.html | 608 -- .../directives/AdminLoginTitleDirective.html | 608 -- .../directives/AudioEnabledDirective.html | 249 - .../directives/ChatPanelDirective.html | 534 -- .../directives/LangDirective.html | 262 - .../directives/LangOptionsDirective.html | 253 - .../directives/LayoutDirective.html | 554 -- .../directives/LivekitUrlDirective.html | 250 - .../directives/MinimalDirective.html | 249 - .../directives/PanelDirective.html | 369 -- .../directives/ParticipantNameDirective.html | 248 - .../ParticipantPanelItemDirective.html | 495 -- ...ParticipantPanelItemElementsDirective.html | 500 -- ...rticipantPanelItemMuteButtonDirective.html | 686 -- .../ParticipantsPanelDirective.html | 530 -- .../directives/PrejoinDirective.html | 249 - .../directives/StreamDirective.html | 489 -- .../StreamDisplayAudioDetectionDirective.html | 681 -- ...StreamDisplayParticipantNameDirective.html | 681 -- .../StreamVideoControlsDirective.html | 681 -- .../directives/TokenDirective.html | 250 - .../directives/TokenErrorDirective.html | 249 - ...ToolbarActivitiesPanelButtonDirective.html | 251 - .../ToolbarAdditionalButtonsDirective.html | 358 -- ...arAdditionalButtonsPossitionDirective.html | 251 - ...oolbarAdditionalPanelButtonsDirective.html | 343 - ...olbarBackgroundEffectsButtonDirective.html | 251 - .../ToolbarBroadcastingButtonDirective.html | 251 - .../ToolbarChatPanelButtonDirective.html | 251 - .../directives/ToolbarDirective.html | 351 -- .../ToolbarDisplayLogoDirective.html | 251 - .../ToolbarDisplayRoomNameDirective.html | 251 - .../ToolbarFullscreenButtonDirective.html | 251 - .../ToolbarLeaveButtonDirective.html | 251 - ...olbarParticipantsPanelButtonDirective.html | 251 - .../ToolbarRecordingButtonDirective.html | 251 - .../ToolbarScreenshareButtonDirective.html | 251 - .../ToolbarSettingsButtonDirective.html | 251 - .../directives/VideoEnabledDirective.html | 249 - .../fonts/ionicons.eot | Bin 112650 -> 0 bytes .../fonts/ionicons.svg | 2090 ------- .../fonts/ionicons.ttf | Bin 112472 -> 0 bytes .../fonts/ionicons.woff | Bin 65912 -> 0 bytes .../fonts/ionicons.woff2 | Bin 50632 -> 0 bytes .../fonts/roboto-v15-latin-300.eot | Bin 16205 -> 0 bytes .../fonts/roboto-v15-latin-300.svg | 314 - .../fonts/roboto-v15-latin-300.ttf | Bin 32664 -> 0 bytes .../fonts/roboto-v15-latin-300.woff | Bin 18520 -> 0 bytes .../fonts/roboto-v15-latin-300.woff2 | Bin 14524 -> 0 bytes .../fonts/roboto-v15-latin-700.eot | Bin 16208 -> 0 bytes .../fonts/roboto-v15-latin-700.svg | 310 - .../fonts/roboto-v15-latin-700.ttf | Bin 32500 -> 0 bytes .../fonts/roboto-v15-latin-700.woff | Bin 18568 -> 0 bytes .../fonts/roboto-v15-latin-700.woff2 | Bin 14552 -> 0 bytes .../fonts/roboto-v15-latin-italic.eot | Bin 17534 -> 0 bytes .../fonts/roboto-v15-latin-italic.svg | 323 - .../fonts/roboto-v15-latin-italic.ttf | Bin 33404 -> 0 bytes .../fonts/roboto-v15-latin-italic.woff | Bin 19880 -> 0 bytes .../fonts/roboto-v15-latin-italic.woff2 | Bin 11500 -> 0 bytes .../fonts/roboto-v15-latin-regular.eot | Bin 16227 -> 0 bytes .../fonts/roboto-v15-latin-regular.svg | 308 - .../fonts/roboto-v15-latin-regular.ttf | Bin 32652 -> 0 bytes .../fonts/roboto-v15-latin-regular.woff | Bin 18520 -> 0 bytes .../fonts/roboto-v15-latin-regular.woff2 | Bin 14584 -> 0 bytes .../graph/dependencies.svg | 1140 ---- .../images/compodoc-vectorise-inverted.png | Bin 21782 -> 0 bytes .../images/compodoc-vectorise-inverted.svg | 201 - .../images/compodoc-vectorise.png | Bin 21325 -> 0 bytes .../images/compodoc-vectorise.svg | 201 - .../images/favicon.ico | Bin 5430 -> 0 bytes .../openvidu-components-angular/index.html | 238 - .../injectables/BroadcastingService.html | 361 -- .../injectables/OpenViduService.html | 470 -- .../injectables/PanelService.html | 618 -- .../injectables/ParticipantService.html | 1145 ---- .../injectables/RecordingService.html | 361 -- .../injectables/TranslateService.html | 522 -- .../ActivitiesPanelStatusEvent.html | 216 - .../interfaces/BroadcastingEvent.html | 277 - .../BroadcastingStartRequestedEvent.html | 276 - .../interfaces/BroadcastingStatusInfo.html | 361 -- .../BroadcastingStopRequestedEvent.html | 276 - .../interfaces/ChatPanelStatusEvent.html | 216 - .../interfaces/LangOption.html | 309 - .../interfaces/PanelStatusEvent.html | 277 - .../interfaces/PanelStatusInfo.html | 436 -- .../interfaces/ParticipantProperties.html | 386 -- .../ParticipantTrackPublication.html | 565 -- .../ParticipantsPanelStatusEvent.html | 216 - .../RecordingDeleteRequestedEvent.html | 216 - .../RecordingDownloadClickedEvent.html | 216 - .../interfaces/RecordingEvent.html | 322 - .../interfaces/RecordingInfo.html | 748 --- .../interfaces/RecordingPlayClickedEvent.html | 216 - .../RecordingStartRequestedEvent.html | 216 - .../interfaces/RecordingStatusInfo.html | 406 -- .../RecordingStopRequestedEvent.html | 216 - .../interfaces/SettingsPanelStatusEvent.html | 216 - .../js/compodoc.js | 14 - .../js/lazy-load-graphs.js | 44 - .../js/libs/EventDispatcher.js | 5 - .../js/libs/bootstrap-native.js | 2 - .../js/libs/clipboard.min.js | 7 - .../js/libs/custom-elements-es5-adapter.js | 15 - .../js/libs/custom-elements.min.js | 38 - .../js/libs/d3.v3.min.js | 2 - .../js/libs/deep-iterator.js | 2 - .../js/libs/es6-shim.min.js | 12 - .../js/libs/htmlparser.js | 23 - .../js/libs/innersvg.js | 9 - .../js/libs/lit-html.js | 1 - .../js/libs/prism.js | 46 - .../js/libs/promise.min.js | 6 - .../js/libs/svg-pan-zoom.min.js | 3 - .../js/libs/tablesort.min.js | 6 - .../js/libs/tablesort.number.min.js | 6 - .../js/libs/vis.min.js | 47 - .../js/libs/zepto.min.js | 2 - .../openvidu-components-angular/js/menu-wc.js | 423 -- .../js/menu-wc_es5.js | 40 - .../openvidu-components-angular/js/menu.js | 269 - .../openvidu-components-angular/js/routes.js | 301 - .../js/search/lunr.min.js | 6 - .../js/search/search-lunr.js | 65 - .../js/search/search.js | 273 - .../js/search/search_index.js | 4 - .../js/sourceCode.js | 58 - .../js/svg-pan-zoom.controls.js | 53 - .../openvidu-components-angular/js/tabs.js | 21 - .../openvidu-components-angular/js/tree.js | 147 - .../openvidu-components-angular/license.html | 353 -- .../miscellaneous/enumerations.html | 495 -- .../miscellaneous/typealiases.html | 234 - .../miscellaneous/variables.html | 226 - .../openvidu-components-angular/modules.html | 216 - .../modules/ApiDirectiveModule.html | 1271 ---- .../ApiDirectiveModule/dependencies.svg | 834 --- .../OpenViduComponentsDirectiveModule.html | 641 -- .../dependencies.svg | 330 - .../openvidu-components-angular/overview.html | 1394 ----- .../pipes/RemoteParticipantTracksPipe.html | 295 - .../properties.html | 182 - .../styles/bootstrap-card.css | 219 - .../styles/bootstrap.min.css | 6 - .../styles/compodoc.css | 1124 ---- .../styles/dark.css | 121 - .../styles/ionicons.min.css | 11 - .../styles/laravel.css | 113 - .../styles/material.css | 131 - .../styles/original.css | 51 - .../styles/postmark.css | 238 - .../styles/prism.css | 301 - .../styles/readthedocs.css | 117 - .../styles/reset.css | 129 - .../styles/stripe.css | 106 - .../styles/style.css | 110 - .../styles/tablesort.css | 33 - .../styles/vagrant.css | 130 - 3.0.0-beta3/docs/releases/index.html | 4548 -------------- .../configuration/changing-config/index.html | 4246 ------------- .../configuration/in-depth/index.html | 4101 ------------ .../configuration/reference/index.html | 4557 -------------- .../self-hosting/deployment-types/index.html | 4341 ------------- .../self-hosting/elastic/aws/admin/index.html | 4361 ------------- .../elastic/aws/install/index.html | 4442 ------------- .../docs/self-hosting/elastic/index.html | 3984 ------------ .../elastic/on-premises/admin/index.html | 4278 ------------- .../elastic/on-premises/install/index.html | 4646 -------------- 3.0.0-beta3/docs/self-hosting/faq/index.html | 4119 ------------ .../docs/self-hosting/ha/aws/admin/index.html | 4366 ------------- .../self-hosting/ha/aws/install/index.html | 4474 ------------- 3.0.0-beta3/docs/self-hosting/ha/index.html | 3985 ------------ .../ha/on-premises/admin/index.html | 4280 ------------- .../ha/on-premises/install-dlb/index.html | 4702 -------------- .../ha/on-premises/install-nlb/index.html | 4718 -------------- .../index.html | 4133 ------------ .../enable-disable-modules/index.html | 4006 ------------ .../how-to-guides/enable-webhooks/index.html | 4133 ------------ .../how-to-guides/external-s3/index.html | 4196 ------------- .../how-to-guides/force-443-tls/index.html | 4098 ------------ .../self-hosting/how-to-guides/index.html | 3982 ------------ .../docs/self-hosting/local/index.html | 4395 ------------- .../fault-tolerance/index.html | 4270 ------------- .../self-hosting/production-ready/index.html | 4009 ------------ .../observability/grafana-stack/index.html | 4324 ------------- .../production-ready/observability/index.html | 3984 ------------ .../openvidu-dashboard/index.html | 4268 ------------- .../production-ready/performance/index.html | 4290 ------------- .../production-ready/scalability/index.html | 4154 ------------- .../single-node/aws/admin/index.html | 4156 ------------- .../single-node/aws/install/index.html | 4324 ------------- .../docs/self-hosting/single-node/index.html | 3984 ------------ .../single-node/on-premises/admin/index.html | 4175 ------------- .../on-premises/install/index.html | 4414 ------------- .../tutorials/advanced-features/index.html | 3979 ------------ .../recording-advanced/index.html | 5135 --------------- .../recording-basic/index.html | 5520 ----------------- .../tutorials/angular-components/index.html | 3997 ------------ .../openvidu-additional-panels/index.html | 4793 -------------- .../openvidu-admin-dashboard/index.html | 4687 -------------- .../index.html | 4720 -------------- .../openvidu-custom-chat-panel/index.html | 4797 -------------- .../openvidu-custom-layout/index.html | 4812 -------------- .../openvidu-custom-panels/index.html | 4741 -------------- .../index.html | 4737 -------------- .../index.html | 4759 -------------- .../index.html | 4774 -------------- .../openvidu-custom-stream/index.html | 4728 -------------- .../openvidu-custom-toolbar/index.html | 4734 -------------- .../openvidu-custom-ui/index.html | 4716 -------------- .../openvidu-toggle-hand/index.html | 4773 -------------- .../openvidu-toolbar-buttons/index.html | 4745 -------------- .../openvidu-toolbar-panel-buttons/index.html | 4730 -------------- .../application-client/android/index.html | 5091 --------------- .../application-client/angular/index.html | 5005 --------------- .../application-client/electron/index.html | 4822 -------------- .../tutorials/application-client/index.html | 4002 ------------ .../application-client/ionic/index.html | 5213 ---------------- .../application-client/ios/index.html | 4940 --------------- .../application-client/javascript/index.html | 4863 --------------- .../application-client/react/index.html | 4965 --------------- .../application-client/vue/index.html | 4956 --------------- .../application-server/dotnet/index.html | 4870 --------------- .../application-server/go/index.html | 4734 -------------- .../tutorials/application-server/index.html | 3995 ------------ .../application-server/java/index.html | 4701 -------------- .../application-server/node/index.html | 4721 -------------- .../application-server/php/index.html | 4748 -------------- .../application-server/python/index.html | 4754 -------------- .../application-server/ruby/index.html | 4718 -------------- .../application-server/rust/index.html | 4880 --------------- .../angular-components/index.html | 4255 ------------- .../ui-components/react-components/index.html | 4212 ------------- 3.0.0-beta3/index.html | 4201 +------------ 3.0.0-beta3/overrides/home.html | 61 - 3.0.0-beta3/overrides/main.html | 133 - 3.0.0-beta3/overrides/partials/footer.html | 121 - 3.0.0-beta3/overrides/partials/header.html | 158 - 3.0.0-beta3/search/search_index.json | 2 +- 3.0.0-beta3/sitemap.xml | 28 - 3.0.0-beta3/sitemap.xml.gz | Bin 931 -> 911 bytes sitemap_index.xml | 4 + 269 files changed, 18 insertions(+), 423420 deletions(-) delete mode 100644 3.0.0-beta3/404.html delete mode 100644 3.0.0-beta3/docs/comparing-openvidu/index.html delete mode 100644 3.0.0-beta3/docs/developing-your-openvidu-app/how-to/index.html delete mode 100644 3.0.0-beta3/docs/developing-your-openvidu-app/index.html delete mode 100644 3.0.0-beta3/docs/getting-started/index.html delete mode 100644 3.0.0-beta3/docs/openvidu-call/docs/index.html delete mode 100644 3.0.0-beta3/docs/openvidu-call/index.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/classes/ParticipantModel.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ActivitiesPanelComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminDashboardComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminLoginComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/BroadcastingActivityComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ChatPanelComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/LayoutComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/PanelComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantPanelItemComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantsPanelComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/RecordingActivityComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/StreamComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ToolbarComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/VideoconferenceComponent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelBroadcastingActivityDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelRecordingActivityDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdditionalPanelsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardRecordingsListDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardTitleDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginErrorDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginTitleDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AudioEnabledDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ChatPanelDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangOptionsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LayoutDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LivekitUrlDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/MinimalDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PanelDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantNameDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemElementsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemMuteButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantsPanelDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PrejoinDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayAudioDetectionDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayParticipantNameDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamVideoControlsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenErrorDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarActivitiesPanelButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsPossitionDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalPanelButtonsDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBackgroundEffectsButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBroadcastingButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarChatPanelButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayLogoDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayRoomNameDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarFullscreenButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarLeaveButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarParticipantsPanelButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarRecordingButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarScreenshareButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarSettingsButtonDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/VideoEnabledDirective.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.eot delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.ttf delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.woff delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.woff2 delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.eot delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.ttf delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.woff delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.woff2 delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.eot delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.ttf delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.woff delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.woff2 delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.eot delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.ttf delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.woff delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.woff2 delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.eot delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.ttf delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.woff delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.woff2 delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/graph/dependencies.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise-inverted.png delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise-inverted.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise.png delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/favicon.ico delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/index.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/BroadcastingService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/OpenViduService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/PanelService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/ParticipantService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/RecordingService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/TranslateService.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ActivitiesPanelStatusEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStartRequestedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStatusInfo.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStopRequestedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ChatPanelStatusEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/LangOption.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusInfo.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantProperties.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantTrackPublication.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantsPanelStatusEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDeleteRequestedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDownloadClickedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingInfo.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingPlayClickedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStartRequestedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStatusInfo.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStopRequestedEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/SettingsPanelStatusEvent.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/compodoc.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/lazy-load-graphs.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/EventDispatcher.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/bootstrap-native.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/clipboard.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements-es5-adapter.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/d3.v3.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/deep-iterator.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/es6-shim.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/htmlparser.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/innersvg.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/lit-html.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/prism.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/promise.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/svg-pan-zoom.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/tablesort.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/tablesort.number.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/vis.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/zepto.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc_es5.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/routes.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/lunr.min.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search-lunr.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search_index.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/sourceCode.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/svg-pan-zoom.controls.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tabs.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tree.js delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/license.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/enumerations.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/typealiases.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/variables.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule/dependencies.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule/dependencies.svg delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/overview.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/pipes/RemoteParticipantTracksPipe.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/properties.html delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap-card.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap.min.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/compodoc.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/dark.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/ionicons.min.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/laravel.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/material.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/original.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/postmark.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/prism.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/readthedocs.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/reset.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/stripe.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/style.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/tablesort.css delete mode 100644 3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/vagrant.css delete mode 100644 3.0.0-beta3/docs/releases/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/configuration/changing-config/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/configuration/in-depth/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/configuration/reference/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/deployment-types/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/elastic/aws/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/elastic/aws/install/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/elastic/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/faq/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/aws/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/aws/install/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/enable-disable-modules/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/how-to-guides/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/local/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/observability/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/performance/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/production-ready/scalability/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/single-node/aws/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/single-node/aws/install/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/single-node/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/index.html delete mode 100644 3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/advanced-features/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/android/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/angular/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/electron/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/ionic/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/ios/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/javascript/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/react/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-client/vue/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/dotnet/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/go/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/java/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/node/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/php/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/python/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/ruby/index.html delete mode 100644 3.0.0-beta3/docs/tutorials/application-server/rust/index.html delete mode 100644 3.0.0-beta3/docs/ui-components/angular-components/index.html delete mode 100644 3.0.0-beta3/docs/ui-components/react-components/index.html delete mode 100644 3.0.0-beta3/overrides/home.html delete mode 100644 3.0.0-beta3/overrides/main.html delete mode 100644 3.0.0-beta3/overrides/partials/footer.html delete mode 100644 3.0.0-beta3/overrides/partials/header.html diff --git a/3.0.0-beta3/404.html b/3.0.0-beta3/404.html deleted file mode 100644 index 2d43f682..00000000 --- a/3.0.0-beta3/404.html +++ /dev/null @@ -1,3860 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- -

404 - Not found

- -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/comparing-openvidu/index.html b/3.0.0-beta3/docs/comparing-openvidu/index.html deleted file mode 100644 index e6647062..00000000 --- a/3.0.0-beta3/docs/comparing-openvidu/index.html +++ /dev/null @@ -1,4227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Comparing OpenVidu - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Comparing OpenVidu

- -

This section compares OpenVidu to other videoconference/streaming solutions, to better understand what it is, what it is not, and what advantages and disadvantages it may have over them.

-

OpenVidu vs LiveKit#

-

First of all, and perhaps the most obvious question, how does OpenVidu differ from LiveKit, and what kind of relationship is there between them? This can be answer with four simple points:

-
    -
  • OpenVidu is a fork of LiveKit. It is 100% compatible with LiveKit: any application built for LiveKit is compatible with OpenVidu.
  • -
  • OpenVidu is a superset of LiveKit. It provides all of the open source features of LiveKit and supports all of its SDKs, but it also extends LiveKit with extra features, APIs and internal enhancements, most notably integration with mediasoup.
  • -
  • OpenVidu is a production-ready self-hosted solution. It offers an easy deployment process to self-host a high performance, fault tolerant, scalable and observable cluster. OpenVidu provides an interactive installer that manages all of the complexities, so you can quickly host a production deployment that would otherwise require advanced devops/SRE expertise.
  • -
  • OpenVidu is a support team for self-hosted deployments. The OpenVidu team is made up of real-time experts with over a decade of experience in the field. We specialize in customer support and are always ready to help you bring your ideas to life.
  • -
-
-

OpenVidu vs LiveKit -

-
OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your cluster.
-
-

LiveKit comes in two flavors: LiveKit Open Source and LiveKit Cloud.

-

OpenVidu COMMUNITY vs LiveKit Open Source#

-

LiveKit Open Source is probably the most advanced and feature-rich open source WebRTC stack available today. It has a simple but very versatile API design, and has a large collection of SDKs to integrate into your application on both the frontend and backend. Regardless of your technology stack, there is sure to be a LiveKit Open Source SDK available for you! This is why OpenVidu is fully compatible with LiveKit protocols. You can use any LiveKit SDK to build your application, and it will work seamlessly with an OpenVidu deployment.

-

What does OpenVidu Community bring over LiveKit Open Source?

-

With OpenVidu Community you get a handful of features on top of LiveKit Open Source that will help with the development of your application:

-
    -
  • Egress and Ingress services already integrated with a Redis instance: LiveKit allows you to export media from a Room (for example recording it) or import media into a Room (for example ingesting a video file), using Egress and Ingress services respectively. These modules are independent of LiveKit Server and must be correctly configured and connected via a shared Redis. When running OpenVidu Community you will have all these services properly integrated, so you can focus on developing your app without worrying about anything else.
  • -
  • S3 compatible storage for Egress recordings: OpenVidu Community comes with an S3 compatible storage already configured to store Egress recordings (Minio).
  • -
  • Administration dashboard to monitor your Rooms: OpenVidu comes with an administration dashboard that allows you to monitor the status of your Rooms. Not only in real time, but also historically: the number of participants, the number of published tracks, Egress and Ingress processes... This is a great tool to have when developing your app, as it can help spotting issues and debugging your application's logic. See more.
  • -
  • OpenVidu Call: a fully-fledged videoconference application that you can customize and adapt to your needs. See more.
  • -
  • Powerful and easy to use local development environment: OpenVidu provides a Docker Compose based deployment designed for development and testing devices on your local network. It comes with automatic certificate management that makes it easy to test mobile devices in your LAN. See more.
  • -
-

OpenVidu PRO vs LiveKit Open Source#

-

Deploying LiveKit Open Source in production requires devops/SRE experience to operate your own network of media servers, load balance between them, maintain high uptime and monitor the health of your deployment. OpenVidu Pro makes this an easy process, hiding most of the complexities of such an advanced deployment. With OpenVidu Pro you can self-host a fault-tolerant, scalable and observable cluster, while doubling the original LiveKit Open Source performance to handle twice as many media streams with the same hardware.

-

OpenVidu PRO vs LiveKit Cloud#

-

LiveKit Cloud is the official SaaS solution for LiveKit. They manage the infrastructure, with a pricing model based on the total bandwidth consumed by your application. It offers certain advantages over LiveKit Open Source:

-
    -
  • Analytics and telemetry dashboard. LiveKit Open Source does not export any metrics or logs out-of-the-box.
  • -
  • Massive Rooms for livestreams, where a theoretically unlimited number of viewers can be established for published tracks. In LiveKit Open Source one Room must fit in a single server. LiveKit Cloud overcomes this limitation with a mesh architecture where one media server can connect to other media servers to distribute the load.
  • -
-

Where does OpenVidu Pro stand in relation to LiveKit Cloud? OpenVidu Pro aims to deliver the same advanced benefits as LiveKit Cloud, but as a self-hosted solution. We intend to provide a performant, fault tolerant, scalable and observable cluster that is easy to deploy, configure and administrate in your own infrastructure. For now, OpenVidu Pro brings:

-
    -
  • OpenVidu Pro provides a complete observability stack with Grafana, Loki, Promtail and Mimir, as well as OpenVidu Dashboard to visualize the data. See more.
  • -
  • We are currently working on supporting the same scalability as LiveKit Cloud to support big videoconferences and massive live streams. See more.
  • -
-

OpenVidu vs SaaS solutions#

-

This includes many services like Agora, GetStream, Daily, Vonage, Jitsi as a Service, Whereby, Zoom SDK, Dolby Millicast, Amazon Chime SDK.

-

The main difference between OpenVidu and these services is who owns the infrastructure, and where your users' data flows. All these SaaS solutions provide:

-
    -
  • A public endpoint that your application connects to, so all media is routed through their servers.
  • -
  • Different sets of SDKs to integrate with your application. Some more complete than others, and maybe some low-code options.
  • -
  • A pricing model usually based on one of this two options: minutes-per-participant or total GBs of bandwidth consumed.
  • -
-

Using a SaaS provider is a great option for some use cases, but not all. OpenVidu is designed to be self-hosted. This allows you to have full control over your infrastructure and data, taking the most out of your own resources and complying with the most strict regulations. While having the best features provided by SaaS: scalability, fault tolerance, observability. See Production ready for more information.

-

OpenVidu vs SFUs#

-

This includes projects such as Kurento, mediasoup, Pion, Janus, Jitsi Videobridge or Medooze.

-

These are all media servers. More specifically, they fall under the umbrella of the so-called SFUs (Selective Forwarding Units): they are able to receive media streams from different clients and selectively forward them to other clients, usually without transcoding or mixing the media.

-

SFUs are generally low-level tools. Using them directly to implement real-time applications requires a deep understanding of signaling protocols, codecs, networking and other low-level concepts. OpenVidu is a higher-level abstraction compared to SFUs. It internally uses SFUs to rely the media streams (more specifically Pion and mediasoup), but hides all complexities to offer a simpler way to develop videoconferencing and live streaming applications.

-

OpenVidu vs mediasoup#

-

mediasoup is a WebRTC SFU. It is a minimalist media server with a super low level API that allows building custom real-time applications. Compared to other SFUs, mediasoup is well known for its outstanding performance.

-

OpenVidu uses mediasoup internally to transmit media streams. We have embedded mediasoup as the WebRTC engine right at the core of LiveKit Open Source, which allows OpenVidu to offer the fantastic APIs and SDKs of LiveKit while providing the cutting-edge performance of mediasoup. Learn more about mediasoup integration in section Performance.

-

OpenVidu vs Microsoft Teams, Google Meet, Zoom#

-

All these well-known video conferencing tools are final applications that provide little to no customization at all. They are proprietary, closed-source apps designed to be used as-is, and they are not intended to be integrated into other systems.

-

OpenVidu is inherently different, as it provides a set of APIs and SDKs to integrate real-time video capabilities into your own application. In other words: with OpenVidu you can easily build your own custom Microsoft Teams, Google Meet or Zoom-like application. See Use cases for some examples of what you can build with OpenVidu.

- - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/index.html b/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/index.html deleted file mode 100644 index 3bc1e8a5..00000000 --- a/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/index.html +++ /dev/null @@ -1,4482 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - How to develop your OpenVidu app - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

How to develop your OpenVidu application#

-

This page is a collection of the most common operations you may want to perform in your application while integrating OpenVidu. Depending on the scope of the operation, these operations will be performed on the client side using a LiveKit Client SDK, or on the server side using a LiveKit Server SDK (or directly using the HTTP server API). Consider the architecture of an OpenVidu application:

-
-

OpenVidu app architecture

-
-

You can use this page as a cheat sheet to know at a glance how to do something, and you have links to the LiveKit reference documentation of each operation for a more detailed explanation.

-
-

All client side operations are exemplified using the LiveKit JS Client SDK. For other client SDKs, refer to the corresponding LiveKit reference documentation.

-
-

Generate access tokens#

-

The application client needs an access token to connect to a Room. This token must be generated by the application server. Visit LiveKit reference documentation to learn how to generate access tokens:

-
-

Reference docs

-
-

Manage Rooms#

-

Connect to a Room#

-

To connect to a Room you need the URL of your OpenVidu deployment (which is a WebSocket URL) and the access token generated by your application server.

-
import { Room } from "livekit-client";
-
-const room = new Room();
-await room.connect(wsUrl, token);
-
-
-

Reference docs

-
-
-

Disconnect from a Room#

-
await room.disconnect();
-
-
-

Reference docs

-
-
-

Publish a Track#

-

You can directly publish the default camera and microphone of the device using methods setCameraEnabled and setMicrophoneEnabled of the LocalParticipant object:

-
// Publish a video track from the default camera
-await room.localParticipant.setCameraEnabled(true);
-// Publish an audio track from the default microphone
-await room.localParticipant.setMicrophoneEnabled(true);
-
-

It is also possible to publish both of them at the same time using method LocalParticipant.enableCameraAndMicrophone, which has the advantage of showing a single permission dialog to the user:

-
// Publish both default video and audio tracks triggering a single permission dialog
-await room.localParticipant.enableCameraAndMicrophone();
-
-

To craft a custom Track, you can use the LocalParticipant.createTracks method and publish them with LocalParticipant.publishTrack:

-
var tracks = await room.localParticipant.createTracks({
-  audio: {
-    deviceId: "default",
-    autoGainControl: true,
-    echoCancellation: true,
-    noiseSuppression: true
-  },
-  video: {
-    deviceId: 'frontcamera';
-    facingMode: 'user'
-  },
-});
-await Promise.all([
-    room.localParticipant.publishTrack(tracks[0]),
-    room.localParticipant.publishTrack(tracks[1]),
-]);
-
-
-

Reference docs

-
-
-

Mute/Unmute a Track#

-

To mute the default camera and microphone Tracks:

-
await room.localParticipant.setCameraEnabled(false);
-await room.localParticipant.setMicrophoneEnabled(false);
-
-

To mute/unmute a custom Track:

-
// Mute the track
-await track.mute();
-
-// Unmute the track
-await track.unmute();
-
-
-

Reference docs

-
-
-

Unpublish a Track#

-

To completely stop sending a Track to the Room, you must unpublish it:

-
await room.localParticipant.unpublishTrack(track, true);
-
-

The second boolean parameter indicates if the local Track should be stopped. This usually means freeing the device capturing it (switching off the camera LED, for example).

-
-

Reference docs

-
-
-

Send messages#

-

You can share information between Participants of a Room in different ways.

-

First of all, you can set Room metadata that will be available for all clients in the Room object. You do so in your application server when calling the CreateRoom API (available for all LiveKit Server SDKs and the HTTP Server API). The Room metadata will be available in the client side like this:

-
console.log(room.metadata);
-
-

You can update the Room metadata at any time from your application server with the UpdateRoomMetadata API (available for all LiveKit Server SDKs and the HTTP Server API). The client side will be notified of the change with the roomMetadataChanged event of the Room object:

-
room.on('roomMetadataChanged', (metadata) => {
-  console.log('New room metadata', metadata);
-});
-
-

Secondly, you can also set Participant metadata. You do so when creating an access token in your application server, setting metadata field of the JWT.

-

Participants can also update their own metadata from the client side, if their access token was created with grant canUpdateOwnMetadata.

-
room.localParticipant.setMetadata('new metadata');
-
-

The client side will be notified of the change with the participantMetadataChanged event of the Room and/or Participant object:

-
// To handle all metadata changes of all participants
-room.on(RoomEvent.ParticipantMetadataChanged, (previousMetadata: string, participant) => {
-  console.log('New metadata for participant', participant.identity, participant.metadata);
-});
-
-// To handle only metadata changes of a specific participant
-participant.on(ParticipantEvent.ParticipantMetadataChanged, (previousMetadata) => {
-    console.log('New metadata for participant', participant.identity, participant.metadata);
-});
-
-

Finally, you can send messages to Participants in the Room using the LocalParticipant.publishData method:

-
const data: Uint8Array = new TextEncoder().encode(JSON.stringify(''));
-room.localParticipant.publishData(data, { reliable: true, topic: 'chat', destinationIdentities: ['participant-identity'] });
-
-

The DataPublishOptions allow setting the reliability of the message (depending on the nature of the message it can be sent as a reliable or lossy message), a topic to easily filter messages, and the participants that will receive the message.

-

The client side will be notified of the message with the dataReceived event of the Room and/or Participant object:

-
// To receive all messages from the Room
-room.on(RoomEvent.DataReceived, (payload: Uint8Array, participant: Participant, kind: DataPacket_Kind) => {
-  const strData = new TextDecoder().decode(payload);
-  console.log('Received data from', participant.identity, strData);
-});
-
-// To receive messages only from a specific participant
-participant.on(ParticipantEvent.DataReceived, (payload: Uint8Array, kind: DataPacket_Kind) => {
-  const strData = new TextDecoder().decode(payload);
-  console.log('Received data from', participant.identity, strData);
-});
-
-
-

Reference docs

-
-
-

From your application server#

-

Except for the generation of access tokens, it is possible for all the logic of your application to be contained entirely on the client side. Nonetheless, some use cases may require the management of the Rooms from the server side.

-

These operations are only available in the server SDKs, and not in the client SDKs:

-
    -
  • Closing a Room. From the client side, a user can only leave his own Room.
  • -
  • Removing any Participant from a Room. From the client side, a user can only leave his own Room.
  • -
  • Muting any Track of any Participant. From the client side, a user can only mute/unmute his own Tracks.
  • -
  • Updating the metadata of any Participant. From the client side, a user can only update his own metadata.
  • -
  • Updating the metadata of the Room. From the client side this is not possible.
  • -
  • Egress operations. Egress cannot be started and stopped on demand by users from the client side.
  • -
  • Ingress operations. Ingress cannot be started and stopped on demand by users from the client side.
  • -
-

You have here the complete list of the server-side operations, documented for the HTTP Server API. All the LiveKit Server SDKs have the same operations.

-
    -
  • RoomService: to manage Rooms and Participants.
  • -
  • Egress: to manage egress operations.
  • -
  • Ingress: to manage ingress operations.
  • -
-

Screen Sharing#

-

To quickly publish a screen sharing Track:

-
await room.localParticipant.setScreenShareEnabled(true);
-
-

You can also create custom screen tracks, for example capturing the audio of the screen and fine-tuning the video capture options (checkout the ScreenTrackOptions interface for detailed information):

-
const screenTracks = await room.localParticipant.createScreenTracks({
-    audio: true,
-    contentHint: "detail",
-    preferCurrentTab: true,
-    video: {
-        displaySurface: "window"
-    }
-});
-await Promise.all([
-    room.localParticipant.publishTrack(screenTracks[0]),
-    room.localParticipant.publishTrack(screenTracks[1]),
-]);
-
-
-

Reference docs

-
-

Virtual Background#

-

It is possible to apply a virtual background to video tracks. In this way you can blur the background or replace it with an image.

-

It is necessary to install an additional dependency to use this feature:

-
npm add @livekit/track-processors
-
-

To blur the background:

-
import { BackgroundBlur } from '@livekit/track-processors';
-
-const videoTrack = await createLocalVideoTrack();
-const blur = BackgroundBlur(10);
-await videoTrack.setProcessor(blur);
-
-

To replace the background with an image:

-
import { VirtualBackground } from '@livekit/track-processors';
-
-const videoTrack = await createLocalVideoTrack();
-const image = VirtualBackground('https://picsum.photos/400');
-await videoTrack.setProcessor(image);
-
-
-

GitHub Repository

-
-

Recording#

-

You can record your Rooms using the Egress module. Egress allows exporting media from a Room in different formats, including

-
    -
  • Room Composite Egress: a single video output with all the Tracks of a Room composited in a layout. You can even create your custom layouts.
  • -
  • Track Composite Egress: a single video output combining an audio Track and a video Track.
  • -
  • Track Egress: individual outputs for each Track of a Room.
  • -
-

Visit the LiveKit reference documentation for a detailed explanation of Egress:

-
-

Reference docs

-
-

Webhooks#

-

Your application server may receive webhooks coming from the OpenVidu deployment. These webhooks inform about events happening in the Rooms, including when a Room is created and finished, when a Participant joins and leaves a Room, when a Track is published and unpublished, and when Egress/Ingress operations take place in a Room.

-

Every application server tutorial here is ready to receive webhooks: Application Server Tutorials.

-

Visit the LiveKit reference documentation for a detailed explanation of each webhook event:

-
-

Reference docs

-
- - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/developing-your-openvidu-app/index.html b/3.0.0-beta3/docs/developing-your-openvidu-app/index.html deleted file mode 100644 index f9fb54e6..00000000 --- a/3.0.0-beta3/docs/developing-your-openvidu-app/index.html +++ /dev/null @@ -1,4147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Developing your OpenVidu app - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Developing your OpenVidu application#

-

Here's a high-level overview of the steps involved in building an OpenVidu application:

-
    -
  1. Launch an OpenVidu deployment
  2. -
  3. Use LiveKit Server SDK in your application server
  4. -
  5. Build the UI of your client application
  6. -
  7. Deploy OpenVidu and your application
  8. -
-

1. Launch an OpenVidu deployment#

-

The quickest way is to use OpenVidu local deployment.

-

2. Use LiveKit Server SDK in your application server#

-

OpenVidu is fully compatibly with LiveKit APIs. This means that any LiveKit Server SDK can be used in your application server.

-

The only mandatory task to perform in your application server is:

-
    -
  • Creating access tokens. Your Participants will only be able to connect to your Rooms by using a valid access token. Visit the official documentation about Authentication to learn how to generate access tokens and which permissions you can assign to them.
  • -
-

There are also other optional tasks that you can perform from your application server, depending on your requirements:

-
    -
  • Manage your Rooms and Participants: although most of your application logic will be in the frontend, you can also manage the logic of your Rooms and Participants from the security of your application backend. You can list, create, update and destroy Rooms and Participants. This is the official LiveKit documentation with all the available methods of the RoomServiceClient exposed by the Server API. These methods are also available in all LiveKit Server SDKs.
  • -
  • Manage Egress and Ingress: if your application needs some kind of recording, broadcasting or media ingestion, this operations must all be performed by your application server.
  • -
  • Receive Webhook events: you can also listen to Webhook events in your application backend. In this way you can react to events happening in your Rooms: a Room has started, a Room has finished, a Participant has joined a Room, a Track has been published... Visit the official documentation about Webhooks.
  • -
  • Publish Tracks from your backend: this is only for advanced applications that require server-side media publishing. Publishing media from your backend is possible by using LiveKit CLI, Python SDK, Go SDK, Node SDK or Rust SDK.
  • -
-

To get you started, here is a list of all available LiveKit Server SDKs and an application server tutorial using them. These tutorials are all set up to generate access tokens and receive webhook events, so they are perfect starting points for your application server.

-
-
- - - - - - - -
-

.NET Tutorial

-
-

There is no .NET SDK for LiveKit available. Visit the tutorial to learn how to create tokens and receive Webhook events directly from your .NET application server.

-
-
-
-

If your backend technology does not have its own SDK, you have two different options:

-
    -
  1. -

    Consume the Server API directly: Reference Docs

    -
  2. -
  3. -

    Use the livekit-cli: GitHub Repository

    -
  4. -
-
-
-
-

3. Build the UI of your client application#

-

There are two main strategies to build the UI of your client application:

-
    -
  • Use a high-level UI Components library: you can use Angular Components and React Components to quickly set up your UI with building blocks that manage the events and state of the Room for you.
  • -
  • Use a low-level client SDK: if you want extensive control and maximum flexibility when designing your UI, use any of the LiveKit Client SDKs.
  • -
-

The table below summarizes the key differences between these two strategies to help you make an informed decision:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
UI ComponentsLow-level client SDKs
What is it?Frontend libraries offering videoconferencing components to build your own application. There are Angular Components or React ComponentsIntegrate OpenVidu from scratch in your web, mobile or desktop application using LiveKit Client SDKs
Pros
  • Very flexible components: adapt, extend or replace any component
  • Have your first version running in minutes, work on your customizations from there
  • Easily keep your client code up to date with the latest features
  • Unlimited level of customization: build your own UI from scratch as you please
  • Available for all client platforms: browsers, iOS, Android, Flutter, React Native, Unity...
Cons
  • Only available for Angular and React web apps
  • Higher complexity, although there are plenty of tutorials to smooth the learning curve
TutorialsAngular Components tutorialsApplication client tutorials
-

Whatever strategy you choose to build the UI of your application, most common steps to perform are:

-
    -
  • Connect to a Room with an access token: the application client will connect to a Room with an access token generated by your application server. Once connected, the client becomes a Participant of the Room.
  • -
  • Publish Tracks to the Room: the application client may create Tracks of any kind (audio from the microphone, video from the camera device, screen sharing from an application...) and publish them to the Room.
  • -
  • Subscribe to Tracks from other Participants: the application client may receive the Tracks published by other Participants in the Room. It is possible to perform selective subscription, so the client can choose which Tracks to specifically subscribe to.
  • -
  • Mute and unmute Tracks: the application client may mute and unmute its own Tracks, and also may disable the reception of any Track published by other Participants.
  • -
-

Of course, depending on the use case, this may not be necessary for all users, or other additional steps may need to be taken. For example, in a live streaming application, only presenters will publish Tracks, while all other viewers will only subscribe to them. Or it is possible that users may need exchange messages through a chat. Each specific application will need to refine its use of the UI Components or client SDKs to meet its requirements.

-

Here is the list of all LiveKit Client SDKs: LiveKit Client SDKs. Below is a list of application client tutorials, which are perfect starting points for your client application.

- -

4. Deploy OpenVidu and your application#

-

You have different options to deploy OpenVidu in a production-ready environment, depending on the level of scalability, fault tolerance and observability you need. See Deployment types for more information.

- - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/getting-started/index.html b/3.0.0-beta3/docs/getting-started/index.html deleted file mode 100644 index bb5a59af..00000000 --- a/3.0.0-beta3/docs/getting-started/index.html +++ /dev/null @@ -1,4380 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Getting started - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Getting started

- -

What is OpenVidu?#

-

OpenVidu is a platform that allows you to implement real-time applications. You can build your brand new OpenVidu app from scratch, but it is also very easy to integrate OpenVidu in your already existing application.

-

OpenVidu is based on WebRTC technology and allows developing any kind of use case you can imagine: one-to-one calls, video conference rooms, massive live streaming events, management and processing of drones and camera feeds...

-

OpenVidu is built on the best open source technologies: LiveKit, from which it inherits all its amazing SDKs to integrate it into your front-end and back-end applications, and mediasoup, from which it inherits the best performance and optimization for media routing.

-
-

OpenVidu vs LiveKit - OpenVidu vs LiveKit -

-
OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your self-hosted, production-grade cluster.
-
-

Use cases#

-

OpenVidu is a super versatile platform that can be used to build just about any kind of real-time application you can think of. Most common use cases can be classified into one of the following categories:

-

Video conferencing#

-
-
-OpenVidu videoconference use case -
-
-

Video conferencing rooms are virtual spaces where two or more users can send video and audio and interact with each other in real-time. They can scale in size, from a simple 1-to-1 call to a massive video conference with thousands of participants. For example:

-
    -
  • A 1-to-1 video-call center to attend your customers face to face.
  • -
  • An e-health application where doctors can treat their patients directly from it, in a private and secure manner using end-to-end encryption.
  • -
  • A banking application where customers may sign a contract, live and recording the call as proof of it.
  • -
  • A webinar platform where speakers can give their talks to large audiences, with the possibility of viewers temporarily turning their cameras to ask questions.
  • -
-
-
-

Live streaming#

-
-
-

Live streaming applications allow one publisher to broadcast video to many viewers. It can be a single video feed, multiple video feeds (webcam and screen share) or there could be even multiple publishers. The general rule is that the ratio of viewers to publishers is very high, in the order of thousands.

-

Ultra-low latency live streaming (below 300ms) allows for actual real-time interaction between the viewers and the publishers. This differs from traditional live streaming platforms where the latency is usually in the order of seconds. In this way you can build applications like:

-
    -
  • A TEDx-like application, where a speaker can give a talk to a massive audience of thousands of viewers, which may communicate through a chat. Real time subtitles and translations can be added to the stream.
  • -
  • An application to stream sport events, where viewers can switch between different cameras to watch the game from different angles to increase fan engagement.
  • -
  • A global live auction platform where the auctioneer can be seen by the bidders in real-time with sub-second latency all around the world.
  • -
-
-
-OpenVidu livestream use case -
-
-

Robotics and embedded systems#

-
-
-OpenVidu robotics use case -
-
-

The future lies in the integration of cameras and sensors in all kinds of devices, everywhere: industry, homes, public spaces, emergency services... OpenVidu can be used to receive and process video and audio streams from these devices, and doing so in real-time. For example:

-
    -
  • A security system to receive the feed of IP cameras and sending an alert when detecting a person.
  • -
  • A drone control system to receive the video feed from each drone camera and securely record it. Any other sensor reading could also be sent to be synchronized later with the recorded video feed.
  • -
  • A real-time translation app that uses the latest AI models to provide high-quality translations of spoken language in real time.
  • -
-
-
-

OpenVidu application architecture#

-
-

OpenVidu app architecture

-
-

Any OpenVidu application has 3 different parts:

-
    -
  • Your OpenVidu deployment: provides all the necessary infrastructure for streaming real-time audio and video. It is built upon LiveKit server and mediasoup server. It can usually be treated as a black box in which its internal aspects are not important: you just deploy it and connect your application to it. It can be a single server or a cluster, deployed on premises or in your cloud provider.
  • -
  • Your Application client: runs in your user devices and interacts with the OpenVidu server through any LiveKit client SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit client SDK in your Application client. Your users will join rooms as participants to send and receive real-time audio and video tracks. It needs a token generated by the Application server to join a room.
  • -
  • Your Application server: interacts with the OpenVidu deployment through any LiveKit server SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit server SDK in your application server. At a minimum, it is responsible for the generation of tokens for the Application client to join a room. But you can implement your own business logic managing rooms, participants and tracks from the safety of your Application server.
  • -
-

Basic concepts#

-

Room#

-

A Room is a virtual space where Participants can connect to send and receive media Tracks. Two Participants can only communicate if they are connected to the same Room.

-

Participant#

-

A Participant is a user connected to a specific Room. Each Participant can publish as many video and audio Tracks as needed, and subscribe to any other Participant's Tracks, as long as they are connected to the same Room.

-

Track#

-

A Track is a data flow of audio or video. Participants create them from a local media source (a webcam, a microphone, a screen share) and publish them into a Room. Other Participants of the same Room can subscribe to them.

-

With these three concepts you can build any kind of real-time application you can think of. The figure below shows two simple examples.

-
-
-
-

Basic concepts -

-
Room "Daily meeting" has 2 Participants: "Alice" is publishing Track "Webcam" and "Mic" and is receiving Track "Screen" from "Bob". "Bob" is publishing Track "Screen" and receiving Tracks "Webcam" and "Mic" from "Alice".
-
-
-
-
-

Basic concepts -

-
Room "Remote support" has 3 Participants: Participant "Dan" is not publishing any Track, but receiving all Tracks in the Room. Participant "Erin" is only receiving Track "Mic" from Participant "Carol", but not Track "Screen".
-
-
-
-

OpenVidu Editions#

-

OpenVidu is available in two editions:

-
    -
  • OpenVidu COMMUNITY: free to use. It is a single-server deployment and provides a custom LiveKit distribution with Egress, Ingress, S3 storage and monitoring. Ideal for development and testing, but also for medium-scale production deployments. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community in a sufficiently powerful server!
  • -
  • OpenVidu PRO: OpenVidu commercial edition. It is a multi-server deployment with all the features of OpenVidu Community plus 2x performance, scalability, fault tolerance and improved monitoring and observability. Ideal for large-scale production deployments with heavy traffic that require the highest standards. You can start with OpenVidu Community and upgrade to OpenVidu Pro when needed.
  • -
-


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Type of deploymentOpenVidu
Local (development)
OpenVidu
Single Node
OpenVidu
Elastic
OpenVidu
High Availability
OpenVidu EditionCOMMUNITY PROCOMMUNITYPROPRO
SuitabilityFor local development in your laptopFor applications with medium user loadFor applications with dynamic user load that require scalabilityFor applications where both scalability and fault tolerance are critical
FeaturesFriendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your networkCustom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observabilitySame benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observabilitySame benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance
Number of serversYour laptop1 Node1 Master Node +
N Media Nodes
4 Master Nodes +
N Media Nodes
Installation instructionsInstallInstallInstallInstall
- - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/openvidu-call/docs/index.html b/3.0.0-beta3/docs/openvidu-call/docs/index.html deleted file mode 100644 index dd93c283..00000000 --- a/3.0.0-beta3/docs/openvidu-call/docs/index.html +++ /dev/null @@ -1,4621 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Call Docs - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

OpenVidu Call Documentation#

-

Source code

-

Introducing OpenVidu Call, the premier videoconference application that showcases the full potential of the OpenVidu platform. OpenVidu Call is not just any videoconferencing tool; it’s the default and flagship app built with the robust and versatile OpenVidu Components.

-
-

OpenVidu Call -

-
OpenVidu Call
-
-

Run OpenVidu Call#

-

1. Run OpenVidu Server#

-
-
-
-
    -
  1. -

    Download OpenVidu

    -
    git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
    -
    -
  2. -
  3. -

    Configure the local deployment

    -
    -
    -
    -
    cd openvidu-local-deployment/community
    -.\configure_lan_private_ip_windows.bat
    -
    -
    -
    -
    cd openvidu-local-deployment/community
    -./configure_lan_private_ip_macos.sh
    -
    -
    -
    -
    cd openvidu-local-deployment/community
    -./configure_lan_private_ip_linux.sh
    -
    -
    -
    -
    -
  4. -
  5. -

    Run OpenVidu

    -
    docker compose up
    -
    -
  6. -
-
-
-

To use a production-ready OpenVidu deployment, visit the official deployment guide.

-
-

Configure Webhooks

-

OpenVidu Call have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

-
-
-
-
-
-

Accessible via openvidu-local-deployment

-

A pre-built OpenVidu Call application is launched as part of the openvidu-local-deployment and it can be accessible by visiting http://localhost:7880/openvidu-call/.

-

If you want to explore and run the OpenVidu Call code locally, follow the instructions below.

-
-

2. Download OpenVidu Call code#

-
git clone https://github.com/OpenVidu/openvidu-call.git -b 3.0.0-beta3
-
-

3. Run the OpenVidu Call backend#

-
    -
  1. -

    Navigate to the backend directory:

    -
    cd openvidu-call/backend
    -
    -
  2. -
  3. -

    Install the dependencies:

    -
    npm install
    -
    -
  4. -
  5. -

    Start the application:

    -
    npm run dev:start
    -
    -
  6. -
-

4. Run the OpenVidu Call frontend#

-

Launching another terminal, under the openvidu-call directory:

-
    -
  1. -

    Navigate to the frontend directory:

    -
    cd openvidu-call/frontend
    -
    -
  2. -
  3. -

    Install the dependencies:

    -
    npm install
    -
    -
  4. -
  5. -

    Start the application:

    -
    npm run dev:start
    -
    -
  6. -
-

The application will be available at http://localhost:5080.

-

Architecture#

-

The OpenVidu Call architecture is divided into two main components:

-
    -
  • frontend: which is the client-side application built with Angular and OpenVidu Components.
  • -
  • backend: which is the server-side application built with Node.js and Express and uses the LiveKit Server SDK library to interact with the OpenVidu Server.
  • -
-
-

OpenVidu Call Architecture -

-
OpenVidu Call Architecture
-
-
-
-
-

The client-side application built with Angular that provides the user interface for the videoconference. It uses the OpenVidu Components library to create the videoconference layout with ease.

-

The project architecture is divided into the following directories:

-
    -
  • guards: Contains the guards that handle the authentication.
  • -
  • models: Contains the models that define the data structures.
  • -
  • pages: Contains the components that define the different pages of the application.
  • -
  • services: Contains the services that interact with the backend in a RESTful manner.
  • -
-

Additionally, the project hosts the following files:

-
    -
  • app.component.ts: The main file that initializes the Angular application.
  • -
  • app-routes.ts: Contains the routes that define the application navigation.
  • -
  • app,config.ts: Contains the configuration settings for the application. This file is where import for the OpenVidu Angular Components are defined.
  • -
-
-
-

The server-side application built with Node.js and Express that manages the communication between the OpenVidu Server and the frontend.

-

It uses the LiveKit Server SDK library to interact with the OpenVidu Server and handle the authentication, videoconference rooms, recordings, broadcasts, and other features.

-

The project architecture is divided into the following directories:

-
    -
  • controllers: Contains the controllers that handle the HTTP requests.
  • -
  • services: Contains the services that interact with the OpenVidu Server.
  • -
  • models: Contains the models that define the data structures.
  • -
  • helpers: Contains the helper functions.
  • -
-

Additionally, the project hosts the following files:

-
    -
  • server.ts: The main file that initializes the Express application.
  • -
  • routes.ts: Contains the routes that define the API endpoints.
  • -
  • config.ts: Contains the configuration settings for the application.
  • -
-
-
-
-

Features#

-

Authentication#

-

OpenVidu Call provides user authentication to ensure that only authorized users can access the videoconference rooms. The authentication process is handled by the backend, which uses Basic Authentication to verify the user credentials.

-

Video conferencing#

-

Essential Features#

-

OpenVidu Call offers essential features that make video conferencing simple and intuitive for users. These features include:

-
-
    -
  • -

    Multilingual

    -
    -

    Supports for multiple languages, allowing users to select their preferred language for the interface

    -
  • -
  • -

    Device Selection

    -
    -

    Users can choose their preferred audio and video devices before and during the call

    -
  • -
  • -

    Fullscreen Mode

    -
    -

    Offers a fullscreen mode for users to focus on the videoconference without any distractions

    -
  • -
  • -

    Screen Sharing

    -
    -

    Allow users to share their screen and their camera at the same time with other participants in the call

    -
  • -
  • -

    Powerful Layout

    -
    -

    Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

    -
  • -
  • -

    Chat Integration

    -
    -

    Built-in chat functionality enabling participants to send text messages to the group

    -
  • -
-
-


-

Advanced Features#

-

The advanced features of OpenVidu Call enhance the video conferencing experience by providing additional functionalities that improve collaboration and productivity.

-
-
    -
  • -

    Speaker Detection

    -
    -

    Highlights the active speaker automatically, making it easier for participants to follow the conversation

    -
  • -
  • -

    Automatic Reconnection

    -
    -

    Ensures that users are automatically reconnected to the call in case of temporary network issues

    -
  • -
  • -

    Recording

    -
    -

    Supports recording of video conferences for later playback

    -
  • -
  • -

    Broadcasting (Live Streaming)

    -
    -

    Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

    -
  • -
  • -

    Virtual Backgrounds

    -
    -

    Enables users to use virtual backgrounds during the call, enhancing privacy and professionalism

    -
  • -
-
-

Admin Dashboard#

-

An admin dashboard is integrated into OpenVidu Call to provide additional functionalities for the admin user.

-
-
    -
  • -

    Admin Authentication

    -
    -

    Provides admin authentication to ensure that only authorized users can access the admin dashboard

    -
  • -
  • -

    Recording Management

    -
    -

    Allows the admin user to view, download, and delete the recordings stored in the OpenVidu Server

    -
  • -
-
-

Build and Deployment#

-

Docker Image#

-

The process to build a Docker image of OpenVidu call is really easy, you just need to run the following instructions:

-
    -
  1. -

    Build the Docker image:

    -
    cd docker
    -./create_image.sh openvidu-call
    -
    -

    This script will create a Docker image with the name openvidu-call.

    -
  2. -
  3. -

    Run the Docker container:

    -
    docker run -p 6080:6080 \
    --e LIVEKIT_URL=wss://your-livekit-server-url \
    --e LIVEKIT_API_KEY=your-livekit-api-key \
    --e LIVEKIT_API_SECRET=your-livekit-api-secret \
    -openvidu-call
    -
    -

    Once the container is running, you can access the OpenVidu Call application by visiting http://localhost:6080.

    -
  4. -
-

Package bundle#

-

To build the OpenVidu Call application without using Docker, you can follow the instructions:

-
    -
  1. -

    Build the frontend application:

    -
    cd frontend
    -npm install && npm run build-and-copy
    -cd ..
    -
    -
  2. -
  3. -

    Build the backend application:

    -
    cd backend
    -npm install
    -npm run build
    -
    -
  4. -
  5. -

    Start the backend application:

    -
    node dist/src/server.js
    -
    -
  6. -
- - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/openvidu-call/index.html b/3.0.0-beta3/docs/openvidu-call/index.html deleted file mode 100644 index e38b1562..00000000 --- a/3.0.0-beta3/docs/openvidu-call/index.html +++ /dev/null @@ -1,4146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Call - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - -
- - - - - - - - - -
-
- - - - - -
-
-
- - - - - - - -
-
-
- - - - - - - - - -
-
- - - - - - - -
-

OpenVidu Call

- - -

-The videoconference application built on top of OpenVidu -

- -
- -
- -
- -
-
    -
  • -

    Ready to use

    -
    -

    Experience all the features you need only with a click: multiparty videoconferences, screen sharing, chat, and more

    -

    Try it

    -
  • -
  • -

    Fully Customizable

    -
    -

    Built on an open-source license, OpenVidu Call offers full customization to fit your needs

    -

    Customize it

    -
  • -
  • -

    Deploy Anywhere

    -
    -

    Install OpenVidu Call on your own servers or any cloud provider.

    -

    Install it

    -
  • -
-
-

Features

-
- -
-
    -
  • -

    Secure room access

    -

    OpenVidu Call offers a straightforward authentication system enabling users to join rooms with a single click.

    -

    Additionally, it automatically generates unique room names, providing a distinct URL for each room. This allows users to easily share the URL with friends and colleagues to join the room.

    -
  • -
-

OpenVidu Call Login

-
-
- -
-

OpenVidu Call Login

-
    -
  • -

    Setting up your room

    -

    OpenVidu Call provides users with various options and configurations to personalize their experience before and after entering a room.

    -

    This includes testing and selecting audio and video devices, choosing a nickname, and adjusting the preferred language.

    -
  • -
-
-
- -
-
    -
  • -

    Multi-party videoconference

    -

    OpenVidu Call offers a multi-party videoconference feature that allows users to connect with multiple participants in a single room.

    -

    Flexible and easy to use, it allows you to see all participants at once, making it ideal for team meetings, webinars, and more.

    -
  • -
-

OpenVidu Call Login

-
-
- -
- -
    -
  • -

    Chatting time!

    -

    Chatting is an essential feature for any videoconference application.

    -

    OpenVidu Call offers a chat feature that allows users to communicate with each other during a videoconference.

    -
  • -
-
-
- -
-
    -
  • -

    Recording your sessions for posterity

    -

    Recording your videoconference sessions is a great way to keep a record of important meetings, webinars, and more.

    -

    Record, playback, download and share your videoconference sessions with OpenVidu Call's recording feature.

    -
  • -
- -
-
- -
- -
    -
  • -

    Background effects

    -

    Virtual backgrounds are a fun and useful feature that allows users to change their background during a videoconference.

    -

    OpenVidu Call offers a virtual background feature that allows users to choose from a variety of backgrounds for enhancing privacy and professionalism.

    -
  • -
-
-
- -
-
    -
  • -

    Recording Management

    -

    Allow administrators to manage recordings, including deleting, downloading, and sharing them.

    -

    The admin dashboard provides a simple interface to manage all recordings.

    -
  • -
-

OpenVidu Call Login

-
-
-

- And much more... -

-
- -
-
    -
  • -

    Broadcasting (Live Streaming)

    -

    Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

    -
  • -
  • -

    Automatic Reconnection

    -

    Ensures that users are automatically reconnected to the call in case of temporary network issues

    -
  • -
  • -

    Speaker Detection

    -

    Highlights the active speaker automatically, making it easier for participants to follow the conversation

    -
  • -
  • -

    Screen Sharing

    -
    -

    Allow users to share their screen and their camera at the same time with other participants in the call

    -
  • -
  • -

    Fullscreen Mode

    -
    -

    Offers a fullscreen mode for users to focus on the videoconference without any distractions

    -
  • -
  • -

    Powerful Layout

    -

    Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

    -
  • -
-
-
-
-

- All the features you need to quickly build your perfect real-time application -

-
- - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - -
- - - -
- - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/classes/ParticipantModel.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/classes/ParticipantModel.html deleted file mode 100644 index e88bf0fe..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/classes/ParticipantModel.html +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
-
- - -
-
- - - - - - - - - - - - - - - - -
-
-

-

File

-

-

- projects/openvidu-components-angular/src/lib/models/participant.model.ts -

- - -

-

Description

-

-

-

Class that represents a participant in the room.

- -

- - - - -
-

Index

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
Properties
-
- -
-
Methods
-
- -
-
Accessors
-
- -
-
- -
-

Constructor

- - - - - - - - - - -
-constructor(props: ParticipantProperties) -
-
- Parameters : - - - - - - - - - - - - - - - - - - -
NameTypeOptional
props - ParticipantProperties - - No -
-
-
-
- -
- -

- Properties -

- - - - - - - - - - - - - - -
- - - colorProfile - - -
- Type : string - -
-

The color profile associated with the participant. -It specifies the visual representation of the participant in the user interface.

-
-
-
- -
- -

- Methods -

- - - - - - - - - - - - - - - - -
- - - publishTrack - - -
-publishTrack(track: LocalTrack, options?: TrackPublishOptions) -
-

Publishes a track to the room

-
- -
- Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeOptional
track - LocalTrack - - No -
options - TrackPublishOptions - - Yes -
-
-
- Returns : Promise<LocalTrackPublication> - -
-
- -
-
-
- - - - - -
-

- Accessors -

- - - - - - - - - - - - - - -
- - sid -
- getsid() -
-

Returns the server assigned unique identifier for the participant.

-
- -
-
-
- Returns : string - -
-
- - - - - - - - - - - - - - -
- - name -
- getname() -
-

Returns the participant name.

-
- -
-
-
- Returns : string | undefined - -
-
- - - - - - - - - - - - - - -
- - isCameraEnabled -
- getisCameraEnabled() -
-

Returns if the participant has enabled its camera.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - isMicrophoneEnabled -
- getisMicrophoneEnabled() -
-

Returns if the participant has enabled its microphone.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - isScreenShareEnabled -
- getisScreenShareEnabled() -
-

Returns if the participant has enabled its screen share.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - isSpeaking -
- getisSpeaking() -
-

Returns if the participant is speaking.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - tracks -
- gettracks() -
-

Returns all the participant tracks.

-
- -
-
- -
- - - - - - - - - - - - - - -
- - videoTracks -
- getvideoTracks() -
-

Returns all the participant video tracks.

-
- -
-
- -
- - - - - - - - - - - - - - -
- - audioTracks -
- getaudioTracks() -
-

Returns all the participant audio tracks.

-
- -
-
- -
- - - - - - - - - - - - - - -
- - cameraTracks -
- getcameraTracks() -
-

Returns all the participant camera tracks.

-
- -
-
- -
- - - - - - - - - - - - - - -
- - isLocal -
- getisLocal() -
-

Returns if the participant is local.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - onlyHasAudioTracks -
- getonlyHasAudioTracks() -
-

Returns if the participant has only audio tracks.

-
- -
- Returns : boolean - -
-
- - - - - - - - - - - - - - -
- - onlyHasScreenTracks -
- getonlyHasScreenTracks() -
-

Returns if the participant has only screen tracks.

-
- -
- Returns : boolean - -
-
-
-
- - -
- - - - - - - - - -
-
-

results matching ""

-
    -
    -
    -

    No results matching ""

    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ActivitiesPanelComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ActivitiesPanelComponent.html deleted file mode 100644 index 919ba7e2..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ActivitiesPanelComponent.html +++ /dev/null @@ -1,488 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
    -
    - - -
    -
    - - - - - - - - -
    -

    -

    File

    -

    -

    - projects/openvidu-components-angular/src/lib/components/panel/activities-panel/activities-panel.component.ts -

    - - -

    -

    Description

    -

    -

    -

    The ActivitiesPanelComponent is the component that allows showing the activities panel. -This panel shows the recording and broadcasting activities.

    - -

    - - -

    -

    Implements

    -

    -

    - OnInit -

    - - -
    -

    Metadata

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    -

    Outputs

    - - - - - - - - - - - - -
    - - onBroadcastingStartRequested -
    - Type : EventEmitter<BroadcastingStartRequestedEvent> - -
    -

    Provides event notifications that fire when start broadcasting button is clicked. -It provides the BroadcastingStartRequestedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onBroadcastingStopRequested -
    - Type : EventEmitter<BroadcastingStopRequestedEvent> - -
    -

    Provides event notifications that fire when stop broadcasting button is clicked. -It provides the BroadcastingStopRequestedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onRecordingDeleteRequested -
    - Type : EventEmitter<RecordingDeleteRequestedEvent> - -
    -

    Provides event notifications that fire when delete recording button has been clicked. -It provides the RecordingDeleteRequestedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onRecordingDownloadClicked -
    - Type : EventEmitter<RecordingDownloadClickedEvent> - -
    -

    Provides event notifications that fire when download recording button has been clicked. -It provides the RecordingDownloadClickedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onRecordingPlayClicked -
    - Type : EventEmitter<RecordingPlayClickedEvent> - -
    -

    Provides event notifications that fire when play recording button has been clicked. -It provides the RecordingPlayClickedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onRecordingStartRequested -
    - Type : EventEmitter<RecordingStartRequestedEvent> - -
    -

    This event is fired when the user clicks on the start recording button. -It provides the RecordingStartRequestedEvent payload as event data.

    -
    -
    - - - - - - - - - - - - -
    - - onRecordingStopRequested -
    - Type : EventEmitter<RecordingStopRequestedEvent> - -
    -

    Provides event notifications that fire when stop recording button has been clicked. -It provides the RecordingStopRequestedEvent payload as event data.

    -
    -
    -
    - - - - -
    - -
    -

    API Directives

    -

    With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

    - - - - - - - - - - - - - - - - - - - - - -
    ParameterTypeReference
    recordingActivitybooleanActivitiesPanelRecordingActivityDirective
    broadcastingActivitybooleanActivitiesPanelBroadcastingActivityDirective
    -

    -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    results matching ""

    -
      -
      -
      -

      No results matching ""

      -
      -
      -
      - -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminDashboardComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminDashboardComponent.html deleted file mode 100644 index 82a9bf85..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminDashboardComponent.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
      -
      - - -
      -
      - - - - - - - - -
      -

      -

      File

      -

      -

      - projects/openvidu-components-angular/src/lib/admin/admin-dashboard/admin-dashboard.component.ts -

      - - - - -

      -

      Implements

      -

      -

      - OnInit - OnDestroy -

      - - -
      -

      Metadata

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - -
      -

      Outputs

      - - - - - - - - - - - - -
      - - onLoadMoreRecordingsRequested -
      - Type : EventEmitter<void> - -
      -

      Provides event notifications that fire when load more button has been clicked. -The recordings should be updated using the REST API with the continuation token.

      -
      -
      - - - - - - - - - - - - -
      - - onLogoutRequested -
      - Type : EventEmitter<void> - -
      -

      Provides event notifications that fire when logout button has been clicked.

      -
      -
      - - - - - - - - - - - - -
      - - onRecordingDeleteRequested -
      - Type : EventEmitter<RecordingDeleteRequestedEvent> - -
      -

      Provides event notifications that fire when delete recording button has been clicked. -The recording should be deleted using the REST API.

      -
      -
      - - - - - - - - - - - - -
      - - onRefreshRecordingsRequested -
      - Type : EventEmitter<void> - -
      -

      Provides event notifications that fire when refresh recordings button has been clicked. -The recordings should be updated using the REST API.

      -
      -
      -
      - - - - -
      - -
      -

      API Directives

      -

      With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

      - - - - - - - - - - - - - - - - -
      ParameterTypeReference
      recordingsListRecordingInfoAdminDashboardRecordingsListDirective
      -

      -
      - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - -
      -
      -

      results matching ""

      -
        -
        -
        -

        No results matching ""

        -
        -
        -
        - -
        -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminLoginComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminLoginComponent.html deleted file mode 100644 index 0a9564ee..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/AdminLoginComponent.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
        -
        - - -
        -
        - - - - - - - - -
        -

        -

        File

        -

        -

        - projects/openvidu-components-angular/src/lib/admin/admin-login/admin-login.component.ts -

        - - - - -

        -

        Implements

        -

        -

        - OnInit -

        - - -
        -

        Metadata

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - - - -
        -

        Outputs

        - - - - - - - - - - - - -
        - - onLoginRequested -
        - Type : EventEmitter<literal type> - -
        -

        Provides event notifications that fire when login button has been clicked. -The event will contain the credentials value.

        -
        -
        -
        - - - - -
        - -
        -

        API Directives

        -

        With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

        - - - - - - - - - - - - - - - - -
        ParameterTypeReference
        erroranyAdminLoginErrorDirective
        -

        -
        - - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - -
        -
        -

        results matching ""

        -
          -
          -
          -

          No results matching ""

          -
          -
          -
          - -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/BroadcastingActivityComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/BroadcastingActivityComponent.html deleted file mode 100644 index a0e8643b..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/BroadcastingActivityComponent.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
          -
          - - -
          -
          - - - - - - - - -
          -

          -

          File

          -

          -

          - projects/openvidu-components-angular/src/lib/components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component.ts -

          - - -

          -

          Description

          -

          -

          -

          The BroadcastingActivityComponent is the component that allows showing the broadcasting activity.

          - -

          - - -

          -

          Implements

          -

          -

          - OnInit -

          - - -
          -

          Metadata

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - - - - -
          -

          Outputs

          - - - - - - - - - - - - -
          - - onBroadcastingStartRequested -
          - Type : EventEmitter<BroadcastingStartRequestedEvent> - -
          -

          Provides event notifications that fire when start broadcasting button is clicked. -It provides the BroadcastingStartRequestedEvent payload as event data.

          -
          -
          - - - - - - - - - - - - -
          - - onBroadcastingStopRequested -
          - Type : EventEmitter<BroadcastingStopRequestedEvent> - -
          -

          Provides event notifications that fire when stop broadcasting button is clicked. -It provides the BroadcastingStopRequestedEvent payload as event data.

          -
          -
          -
          - - - - -
          - -
          -

          API Directives

          -

          With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

          - -

          No API directives available for this component.

          -

          -
          - - - - - - -
          - - - - - - - - - - - - - - - - - - - - - - - -
          -
          -

          results matching ""

          -
            -
            -
            -

            No results matching ""

            -
            -
            -
            - -
            -
            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ChatPanelComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ChatPanelComponent.html deleted file mode 100644 index a33c93d9..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ChatPanelComponent.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
            -
            - - -
            -
            - - - - - - - - -
            -

            -

            File

            -

            -

            - projects/openvidu-components-angular/src/lib/components/panel/chat-panel/chat-panel.component.ts -

            - - -

            -

            Description

            -

            -

            -

            The ChatPanelComponent is an integral part of the PanelComponent and serves as the interface for displaying the session chat.

            - -

            - - -

            -

            Implements

            -

            -

            - OnInit - AfterViewInit -

            - - -
            -

            Metadata

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            - - - - - - - - - -
            - -
            -

            - - -

            Structural Directives

            - - - - - - - - - - - - - -
            DirectiveReference
            *ovChatPanelChatPanelDirective
            - - -

            API Directives

            -

            With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

            - -

            No API directives available for this component.

            - -

            -
            - - - - - - -
            - - - - - - - - - - - - - - - - - - - - - - - -
            -
            -

            results matching ""

            -
              -
              -
              -

              No results matching ""

              -
              -
              -
              - -
              -
              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/LayoutComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/LayoutComponent.html deleted file mode 100644 index 76354b10..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/LayoutComponent.html +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
              -
              - - -
              -
              - - - - - - - - -
              -

              -

              File

              -

              -

              - projects/openvidu-components-angular/src/lib/components/layout/layout.component.ts -

              - - -

              -

              Description

              -

              -

              -

              The LayoutComponent is hosted inside of the VideoconferenceComponent. -It is in charge of displaying the participants streams layout.

              - -

              - - -

              -

              Implements

              -

              -

              - OnInit - OnDestroy - AfterViewInit -

              - - -
              -

              Metadata

              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              - -
              -

              Index

              - - - - - - - - - - - - - - - -
              -
              Properties
              -
              - -
              -
              - - - - - - - -
              - -

              - Properties -

              - - - - - - - - - - - -
              - - - localParticipant - - -
              - Type : ParticipantModel | undefined - -
              - - - - - - - - - - - - - - -
              - - - remoteParticipants - - -
              - Type : ParticipantModel[] - -
              - Default value : [] -
              -
              - -
              - -
              -

              - - -

              Structural Directives

              - - - - - - - - - - - - - -
              DirectiveReference
              *ovLayoutLayoutDirective
              -

              It is also providing us a way to replace the {@link StreamComponent Stream Component} (which is hosted inside of it) with a custom one. -It will recognise the following directive in a child element.

              - - - - - - - - - - - - - -
              DirectiveReference
              *ovStreamStreamDirective
              - - -

              API Directives

              -

              With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

              - -

              No API directives available for this component.

              - -

              -
              - - - - - - -
              - - - - - - - - - - - - - - - - - - - - - - - -
              -
              -

              results matching ""

              -
                -
                -
                -

                No results matching ""

                -
                -
                -
                - -
                -
                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/PanelComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/PanelComponent.html deleted file mode 100644 index cb7b224a..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/PanelComponent.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                -
                - - -
                -
                - - - - - - - - -
                -

                -

                File

                -

                -

                - projects/openvidu-components-angular/src/lib/components/panel/panel.component.ts -

                - - -

                -

                Description

                -

                -

                -

                The PanelComponent is hosted inside of the VideoconferenceComponent. -It is in charge of displaying the videoconference panels providing functionalities to the videoconference app -such as the chat (ChatPanelComponent) and list of participants (ParticipantsPanelComponent)

                - -

                - - -

                -

                Implements

                -

                -

                - OnInit -

                - - -
                -

                Metadata

                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                - - - - -
                -

                Outputs

                - - - - - - - - - - - - -
                - - onActivitiesPanelStatusChanged -
                - Type : EventEmitter<ActivitiesPanelStatusEvent> - -
                -

                This event is fired when the activities panel status has been changed. -It provides the new status of the activities panel represented by the ActivitiesPanelStatusEvent object.

                -
                -
                - - - - - - - - - - - - -
                - - onChatPanelStatusChanged -
                - Type : EventEmitter<ChatPanelStatusEvent> - -
                -

                This event is fired when the chat panel status has been changed. -It provides the new status of the chat panel represented by the ChatPanelStatusEvent object.

                -
                -
                - - - - - - - - - - - - -
                - - onParticipantsPanelStatusChanged -
                - Type : EventEmitter<ParticipantsPanelStatusEvent> - -
                -

                This event is fired when the participants panel status has been changed. -It provides the new status of the participants panel represented by the ParticipantsPanelStatusEvent object.

                -
                -
                - - - - - - - - - - - - -
                - - onSettingsPanelStatusChanged -
                - Type : EventEmitter<SettingsPanelStatusEvent> - -
                -

                This event is fired when the settings panel status has been changed. -It provides the new status of the settings panel represented by the SettingsPanelStatusEvent object.

                -
                -
                -
                - - - - -
                - -
                -

                - - -

                Structural Directives

                -

                With these kind of directives you can replace the default PanelComponent with your own component. You can also add your own components to the default ones.

                - - - - - - - - - - - - - -
                DirectiveReference
                *ovPanelPanelDirective
                -

                It is also providing us a way to replace the children panels to the default panel. -It will recognise the following directive in a child element.

                - - - - - - - - - - - - - - - - - - - - - -
                DirectiveReference
                *ovChatPanelChatPanelDirective
                *ovParticipantsPanelParticipantsPanelDirective
                *ovAdditionalPanelsAdditionalPanelsDirective
                - - -

                API Directives

                -

                With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                - -

                No API directives available for this component.

                - -

                -
                - - - - - - -
                - - - - - - - - - - - - - - - - - - - - - - - -
                -
                -

                results matching ""

                -
                  -
                  -
                  -

                  No results matching ""

                  -
                  -
                  -
                  - -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantPanelItemComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantPanelItemComponent.html deleted file mode 100644 index c9686e3d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantPanelItemComponent.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                  -
                  - - -
                  -
                  - - - - - - - - -
                  -

                  -

                  File

                  -

                  -

                  - projects/openvidu-components-angular/src/lib/components/panel/participants-panel/participant-panel-item/participant-panel-item.component.ts -

                  - - -

                  -

                  Description

                  -

                  -

                  -

                  The ParticipantPanelItemComponent is hosted inside of the ParticipantsPanelComponent. -It is in charge of displaying the participants information inside of the ParticipansPanelComponent.

                  - -

                  - - -

                  -

                  Implements

                  -

                  -

                  - OnInit - OnDestroy -

                  - - -
                  -

                  Metadata

                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  - - - - - - - - - -
                  - -
                  -

                  - - -

                  Structural Directives

                  - - - - - - - - - - - - - -
                  DirectiveReference
                  *ovParticipantPanelItemParticipantPanelItemDirective
                  -

                  It is also providing us a way to add additional buttons to the default participant panel item. -It will recognise the following directive in a child element.

                  - - - - - - - - - - - - - -
                  DirectiveReference
                  *ovParticipantPanelItemElementsParticipantPanelItemElementsDirective
                  - - -

                  API Directives

                  -

                  With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                  - - - - - - - - - - - - - - - - -
                  ParameterTypeReference
                  muteButtonbooleanParticipantPanelItemMuteButtonDirective
                  - -

                  -
                  - - - - - - -
                  - - - - - - - - - - - - - - - - - - - - - - - -
                  -
                  -

                  results matching ""

                  -
                    -
                    -
                    -

                    No results matching ""

                    -
                    -
                    -
                    - -
                    -
                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantsPanelComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantsPanelComponent.html deleted file mode 100644 index 7c156660..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ParticipantsPanelComponent.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                    -
                    - - -
                    -
                    - - - - - - - - -
                    -

                    -

                    File

                    -

                    -

                    - projects/openvidu-components-angular/src/lib/components/panel/participants-panel/participants-panel/participants-panel.component.ts -

                    - - -

                    -

                    Description

                    -

                    -

                    -

                    The ParticipantsPanelComponent is hosted inside of the PanelComponent. -It is in charge of displaying the participants connected to the session. -This component is composed by the ParticipantPanelItemComponent.

                    - -

                    - - -

                    -

                    Implements

                    -

                    -

                    - OnInit - OnDestroy - AfterViewInit -

                    - - -
                    -

                    Metadata

                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    - - - - - - - - - -
                    - -
                    -

                    - - -

                    Structural Directives

                    - - - - - - - - - - - - - -
                    DirectiveReference
                    *ovParticipantsPanelParticipantsPanelDirective
                    -

                    As the ParticipantsPanelComponent is composed by ParticipantPanelItemComponent, it is also providing us a way to replace the participant item with a custom one. -It will recognise the following directive in a child element.

                    - - - - - - - - - - - - - -
                    DirectiveReference
                    *ovParticipantPanelItemParticipantPanelItemDirective
                    - - -

                    API Directives

                    -

                    With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                    - -

                    No API directives available for this component.

                    - -

                    -
                    - - - - - - -
                    - - - - - - - - - - - - - - - - - - - - - - - -
                    -
                    -

                    results matching ""

                    -
                      -
                      -
                      -

                      No results matching ""

                      -
                      -
                      -
                      - -
                      -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/RecordingActivityComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/RecordingActivityComponent.html deleted file mode 100644 index 8b2cf0a3..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/RecordingActivityComponent.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                      -
                      - - -
                      -
                      - - - - - - - - -
                      -

                      -

                      File

                      -

                      -

                      - projects/openvidu-components-angular/src/lib/components/panel/activities-panel/recording-activity/recording-activity.component.ts -

                      - - -

                      -

                      Description

                      -

                      -

                      -

                      The RecordingActivityComponent is the component that allows showing the recording activity.

                      - -

                      - - -

                      -

                      Implements

                      -

                      -

                      - OnInit -

                      - - -
                      -

                      Metadata

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      - - - - -
                      -

                      Outputs

                      - - - - - - - - - - - - -
                      - - onRecordingDeleteRequested -
                      - Type : EventEmitter<RecordingDeleteRequestedEvent> - -
                      -

                      Provides event notifications that fire when delete recording button has been clicked. -It provides the RecordingDeleteRequestedEvent payload as event data.

                      -
                      -
                      - - - - - - - - - - - - -
                      - - onRecordingDownloadClicked -
                      - Type : EventEmitter<RecordingDownloadClickedEvent> - -
                      -

                      Provides event notifications that fire when download recording button has been clicked. -It provides the RecordingDownloadClickedEvent payload as event data.

                      -
                      -
                      - - - - - - - - - - - - -
                      - - onRecordingPlayClicked -
                      - Type : EventEmitter<RecordingPlayClickedEvent> - -
                      -

                      Provides event notifications that fire when play recording button has been clicked. -It provides the RecordingPlayClickedEvent payload as event data.

                      -
                      -
                      - - - - - - - - - - - - -
                      - - onRecordingStartRequested -
                      - Type : EventEmitter<RecordingStartRequestedEvent> - -
                      -

                      This event is fired when the user clicks on the start recording button. -It provides the RecordingStartRequestedEvent payload as event data.

                      -
                      -
                      - - - - - - - - - - - - -
                      - - onRecordingStopRequested -
                      - Type : EventEmitter<RecordingStopRequestedEvent> - -
                      -

                      Provides event notifications that fire when stop recording button has been clicked. -It provides the RecordingStopRequestedEvent payload as event data.

                      -
                      -
                      -
                      - - - - -
                      - -
                      -

                      API Directives

                      -

                      With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                      - -

                      No API directives available for this component.

                      -

                      -
                      - - - - - - -
                      - - - - - - - - - - - - - - - - - - - - - - - -
                      -
                      -

                      results matching ""

                      -
                        -
                        -
                        -

                        No results matching ""

                        -
                        -
                        -
                        - -
                        -
                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/StreamComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/StreamComponent.html deleted file mode 100644 index cda2f1e5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/StreamComponent.html +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                        -
                        - - -
                        -
                        - - - - - - - - -
                        -

                        -

                        File

                        -

                        -

                        - projects/openvidu-components-angular/src/lib/components/stream/stream.component.ts -

                        - - -

                        -

                        Description

                        -

                        -

                        -

                        The StreamComponent is hosted inside of the LayoutComponent. -It is in charge of displaying the participant video stream in the videoconference layout.

                        - -

                        - - -

                        -

                        Implements

                        -

                        -

                        - OnInit - OnDestroy -

                        - - -
                        -

                        Metadata

                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                        - -
                        -

                        Index

                        - - - - - - - - - - - - - - - - - - - - - -
                        -
                        Inputs
                        -
                        - -
                        -
                        Accessors
                        -
                        - -
                        -
                        - - -
                        -

                        Inputs

                        - - - - - - - - - -
                        - - track -
                        - Type : ParticipantTrackPublication - -
                        -
                        - - - - - -
                        -

                        - Accessors -

                        - - - - - - - - - - - - - - -
                        - - track -
                        - settrack(track: ParticipantTrackPublication) -
                        - -
                        - Parameters : - - - - - - - - - - - - - - - - - - -
                        NameTypeOptional
                        track - ParticipantTrackPublication - - No -
                        -
                        -
                        -
                        -
                        - Returns : void - -
                        -
                        -
                        -
                        - -
                        -

                        - - -

                        Structural Directives

                        -

                        With these kind of directives you can replace the default StreamComponent with your own component. You can also add your own components to the default ones.

                        - - - - - - - - - - - - - -
                        DirectiveReference
                        *ovStreamStreamDirective
                        - - -

                        API Directives

                        -

                        With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                        - - - - - - - - - - - - - - - - - - - - - - - - - - -
                        ParameterTypeReference
                        displayParticipantNamebooleanStreamDisplayParticipantNameDirective
                        displayAudioDetectionbooleanStreamDisplayAudioDetectionDirective
                        videoControlsbooleanStreamVideoControlsDirective
                        - -

                        -
                        - - - - - - -
                        - - - - - - - - - - - - - - - - - - - - - - - -
                        -
                        -

                        results matching ""

                        -
                          -
                          -
                          -

                          No results matching ""

                          -
                          -
                          -
                          - -
                          -
                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ToolbarComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ToolbarComponent.html deleted file mode 100644 index 9a8c1db5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/ToolbarComponent.html +++ /dev/null @@ -1,600 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                          -
                          - - -
                          -
                          - - - - - - - - -
                          -

                          -

                          File

                          -

                          -

                          - projects/openvidu-components-angular/src/lib/components/toolbar/toolbar.component.ts -

                          - - -

                          -

                          Description

                          -

                          -

                          -

                          The ToolbarComponent is hosted inside of the VideoconferenceComponent. -It is in charge of displaying the participants controlls for handling the media, panels and more videoconference features.

                          - -

                          - - -

                          -

                          Implements

                          -

                          -

                          - OnInit - OnDestroy - AfterViewInit -

                          - - -
                          -

                          Metadata

                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                          - - - - -
                          -

                          Outputs

                          - - - - - - - - - - - - -
                          - - onAudioEnabledChanged -
                          - Type : EventEmitter<boolean> - -
                          -

                          This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onBroadcastingStopRequested -
                          - Type : EventEmitter<BroadcastingStopRequestedEvent> - -
                          -

                          Provides event notifications that fire when stop broadcasting has been requested. -It provides the BroadcastingStopRequestedEvent payload as event data.

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onFullscreenEnabledChanged -
                          - Type : EventEmitter<boolean> - -
                          -

                          This event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onRecordingStartRequested -
                          - Type : EventEmitter<RecordingStartRequestedEvent> - -
                          -

                          This event is fired when the user clicks on the start recording button. -It provides the RecordingStartRequestedEvent payload as event data.

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onRecordingStopRequested -
                          - Type : EventEmitter<RecordingStopRequestedEvent> - -
                          -

                          Provides event notifications that fire when stop recording has been requested. -It provides the RecordingStopRequestedEvent payload as event data.

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onRoomDisconnected -
                          - Type : EventEmitter<void> - -
                          -

                          This event is emitted when the room has been disconnected.

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onScreenShareEnabledChanged -
                          - Type : EventEmitter<boolean> - -
                          -

                          This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).

                          -
                          -
                          - - - - - - - - - - - - -
                          - - onVideoEnabledChanged -
                          - Type : EventEmitter<boolean> - -
                          -

                          This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).

                          -
                          -
                          -
                          - - - - -
                          - -
                          -

                          - - -

                          Structural Directives

                          -

                          With these kind of directives you can replace the default ToolbarComponent with your own component. You can also add your own components to the default ones.

                          - - - - - - - - - - - - - -
                          DirectiveReference
                          *ovToolbarToolbarDirective
                          -

                          It is also providing us a way to add additional buttons to the default toolbar. -It will recognise the following directive in a child element.

                          - - - - - - - - - - - - - - - - - -
                          DirectiveReference
                          *ovToolbarAdditionalButtonsToolbarAdditionalButtonsDirective
                          *ovToolbarAdditionalPanelButtonsToolbarAdditionalPanelButtonsDirective
                          - - -

                          API Directives

                          -

                          With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                          ParameterTypeReference
                          screenshareButtonbooleanToolbarScreenshareButtonDirective
                          recordingButtonbooleanToolbarRecordingButtonDirective
                          broadcastingButtonbooleanToolbarBroadcastingButtonDirective
                          fullscreenButtonbooleanToolbarFullscreenButtonDirective
                          backgroundEffectsButtonbooleanToolbarBackgroundEffectsButtonDirective
                          settingsButtonbooleanToolbarSettingsButtonDirective
                          leaveButtonbooleanToolbarLeaveButtonDirective
                          participantsPanelButtonbooleanToolbarParticipantsPanelButtonDirective
                          chatPanelButtonbooleanToolbarChatPanelButtonDirective
                          activitiesPanelButtonbooleanToolbarActivitiesPanelButtonDirective
                          displayRoomNamebooleanToolbarDisplayRoomNameDirective
                          displayLogobooleanToolbarDisplayLogoDirective
                          - -

                          -
                          - - - - - - -
                          - - - - - - - - - - - - - - - - - - - - - - - -
                          -
                          -

                          results matching ""

                          -
                            -
                            -
                            -

                            No results matching ""

                            -
                            -
                            -
                            - -
                            -
                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/VideoconferenceComponent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/VideoconferenceComponent.html deleted file mode 100644 index 045cfc83..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/components/VideoconferenceComponent.html +++ /dev/null @@ -1,1035 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                            -
                            - - -
                            -
                            - - - - - - - - -
                            -

                            -

                            File

                            -

                            -

                            - projects/openvidu-components-angular/src/lib/components/videoconference/videoconference.component.ts -

                            - - -

                            -

                            Description

                            -

                            -

                            -

                            The VideoconferenceComponent is the parent of all OpenVidu components. -It allow us to create a modern, useful and powerful videoconference apps with ease.

                            - -

                            - - -

                            -

                            Implements

                            -

                            -

                            - OnInit - OnDestroy - AfterViewInit -

                            - - -
                            -

                            Metadata

                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            - - - - -
                            -

                            Outputs

                            - - - - - - - - - - - - -
                            - - onActivitiesPanelStatusChanged -
                            - Type : EventEmitter<ActivitiesPanelStatusEvent> - -
                            -

                            This event is fired when the activities panel status has been changed. -It provides the new status of the activities panel as ActivitiesPanelStatusEvent payload.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onAudioDeviceChanged -
                            - Type : EventEmitter<CustomDevice> - -
                            -

                            This event is emitted when the selected audio device changes, providing information about the new custom device that has been selected.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onAudioEnabledChanged -
                            - Type : EventEmitter<boolean> - -
                            -

                            This event is emitted when the audio state changes, providing information about if the audio is enabled (true) or disabled (false).

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onBroadcastingStartRequested -
                            - Type : EventEmitter<BroadcastingStartRequestedEvent> - -
                            -

                            Provides event notifications that fire when start broadcasting button is clicked. -It provides the BroadcastingStartRequestedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onBroadcastingStopRequested -
                            - Type : EventEmitter<BroadcastingStopRequestedEvent> - -
                            -

                            Provides event notifications that fire when stop broadcasting button is clicked. -It provides the BroadcastingStopRequestedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onChatPanelStatusChanged -
                            - Type : EventEmitter<ChatPanelStatusEvent> - -
                            -

                            This event is fired when the chat panel status has been changed. -It provides the new status of the chat panel as ChatPanelStatusEvent payload.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onFullscreenEnabledChanged -
                            - Type : EventEmitter<boolean> - -
                            -

                            The event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onLangChanged -
                            - Type : EventEmitter<LangOption> - -
                            -

                            This event is emitted when the language changes, providing information about the new language that has been selected.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onParticipantCreated -
                            - Type : EventEmitter<ParticipantModel> - -
                            -

                            Provides event notifications that fire when local participant is created. -It provides the ParticipantModel payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onParticipantsPanelStatusChanged -
                            - Type : EventEmitter<ParticipantsPanelStatusEvent> - -
                            -

                            This event is fired when the participants panel status has been changed. -It provides the new status of the participants panel as ParticipantsPanelStatusEvent payload.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onReadyToJoin -
                            - Type : EventEmitter<void> - -
                            -

                            Provides event notifications that fire when the participant is ready to join to the room. This event is only emitted when the prejoin page has been shown.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRecordingDeleteRequested -
                            - Type : EventEmitter<RecordingDeleteRequestedEvent> - -
                            -

                            Provides event notifications that fire when delete recording button has been clicked. -It provides the RecordingDeleteRequestedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRecordingDownloadClicked -
                            - Type : EventEmitter<RecordingDownloadClickedEvent> - -
                            -

                            Provides event notifications that fire when download recording button is clicked from ActivitiesPanelComponent. -It provides the RecordingDownloadClickedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRecordingPlayClicked -
                            - Type : EventEmitter<RecordingPlayClickedEvent> - -
                            -

                            Provides event notifications that fire when play recording button is clicked from ActivitiesPanelComponent. -It provides the RecordingPlayClickedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRecordingStartRequested -
                            - Type : EventEmitter<RecordingStartRequestedEvent> - -
                            -

                            This event is fired when the user clicks on the start recording button. -It provides the RecordingStartRequestedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRecordingStopRequested -
                            - Type : EventEmitter<RecordingStopRequestedEvent> - -
                            -

                            Provides event notifications that fire when stop recording button has been clicked. -It provides the RecordingStopRequestedEvent payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRoomCreated -
                            - Type : EventEmitter<Room> - -
                            -

                            Provides event notifications that fire when OpenVidu Room is created. -It provides the Room payload as event data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onRoomDisconnected -
                            - Type : EventEmitter<void> - -
                            -

                            Provides event notifications that fire when the room has been disconnected.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onScreenShareEnabledChanged -
                            - Type : EventEmitter<boolean> - -
                            -

                            This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onSettingsPanelStatusChanged -
                            - Type : EventEmitter<SettingsPanelStatusEvent> - -
                            -

                            This event is fired when the settings panel status has been changed. -It provides the new status of the settings panel as SettingsPanelStatusEvent payload.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onTokenRequested -
                            - Type : EventEmitter<string> - -
                            -

                            Provides event notifications that fire when videconference is ready to received the token. -This event emits the participant name as data.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onVideoDeviceChanged -
                            - Type : EventEmitter<CustomDevice> - -
                            -

                            This event is emitted when the selected video device changes, providing information about the new custom device that has been selected.

                            -
                            -
                            - - - - - - - - - - - - -
                            - - onVideoEnabledChanged -
                            - Type : EventEmitter<boolean> - -
                            -

                            This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).

                            -
                            -
                            -
                            - - - - -
                            - -
                            -

                            - -

                            Structural Directives

                            -

                            The VideoconferenceComponent also offers the option to tailor the default templates to your preferences using a custom template.

                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            DirectiveReference
                            *ovToolbarToolbarDirective
                            *ovToolbarAdditionalButtonsToolbarAdditionalButtonsDirective
                            *ovToolbarAdditionalPanelButtonsToolbarAdditionalPanelButtonsDirective
                            *ovPanelPanelDirective
                            *ovAdditionalPanelsAdditionalPanelsDirective
                            *ovChatPanelChatPanelDirective
                            *ovParticipantsPanelParticipantsPanelDirective
                            *ovParticipantPanelItemParticipantPanelItemDirective
                            *ovParticipantPanelItemElementsParticipantPanelItemElementsDirective
                            *ovLayoutLayoutDirective
                            *ovStreamStreamDirective
                            - - -

                            API Directives

                            -

                            With the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.

                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            ParameterTypeReference
                            livekitUrlstringLivekitUrlDirective
                            tokenstringTokenDirective
                            tokenErroranyTokenErrorDirective
                            minimalbooleanMinimalDirective
                            langstringLangDirective
                            langOptionsLangOptionLangOptionsDirective
                            participantNamestringParticipantNameDirective
                            prejoinbooleanPrejoinDirective
                            videoEnabledbooleanVideoEnabledDirective
                            audioEnabledbooleanAudioEnabledDirective
                            toolbarScreenshareButtonbooleanToolbarScreenshareButtonDirective
                            toolbarRecordingButtonbooleanToolbarRecordingButtonDirective
                            toolbarBroadcastingButtonbooleanToolbarBroadcastingButtonDirective
                            toolbarFullscreenButtonbooleanToolbarFullscreenButtonDirective
                            toolbarBackgroundEffectsButtonbooleanToolbarBackgroundEffectsButtonDirective
                            toolbarSettingsButtonbooleanToolbarSettingsButtonDirective
                            toolbarLeaveButtonbooleanToolbarLeaveButtonDirective
                            toolbarParticipantsPanelButtonbooleanToolbarParticipantsPanelButtonDirective
                            toolbarChatPanelButtonbooleanToolbarChatPanelButtonDirective
                            toolbarActivitiesPanelButtonbooleanToolbarActivitiesPanelButtonDirective
                            toolbarDisplayRoomNamebooleanToolbarDisplayRoomNameDirective
                            toolbarDisplayLogobooleanToolbarDisplayLogoDirective
                            streamDisplayParticipantNamebooleanStreamDisplayParticipantNameDirective
                            streamDisplayAudioDetectionbooleanStreamDisplayAudioDetectionDirective
                            streamVideoControlsbooleanStreamVideoControlsDirective
                            participantPanelItemMuteButtonbooleanParticipantPanelItemMuteButtonDirective
                            activitiesPanelRecordingActivitybooleanActivitiesPanelRecordingActivityDirective
                            activitiesPanelBroadcastingActivitybooleanActivitiesPanelBroadcastingActivityDirective
                            -

                            -
                            - - - - - - -
                            - - - - - - - - - - - - - - - - - - - - - - - -
                            -
                            -

                            results matching ""

                            -
                              -
                              -
                              -

                              No results matching ""

                              -
                              -
                              -
                              - -
                              -
                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelBroadcastingActivityDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelBroadcastingActivityDirective.html deleted file mode 100644 index e39ab666..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelBroadcastingActivityDirective.html +++ /dev/null @@ -1,686 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                              -
                              - - -
                              -
                              - - - - - - - - - - - -
                              -
                              -

                              -

                              File

                              -

                              -

                              - projects/openvidu-components-angular/src/lib/directives/api/activities-panel.directive.ts -

                              - - -

                              -

                              Description

                              -

                              -

                              -

                              The broadcastingActivity directive allows show/hide the broadcasting activity in ActivitiesPanelComponent.

                              -

                              Default: true

                              -

                              It can be used in the parent element VideoconferenceComponent specifying the name of the activitiesPanel component:

                              -Example :
                              <ov-videoconference [activitiesPanelBroadcastingActivity]="false"></ov-videoconference>


                              And it also can be used in the ActivitiesPanelComponent.

                              -Example :
                              <ov-activities-panel *ovActivitiesPanel [broadcastingActivity]="false"></ov-activities-panel>
                              -

                              - - -

                              -

                              Implements

                              -

                              -

                              - AfterViewInit - OnDestroy -

                              - - -
                              -

                              Metadata

                              - - - - - - - - - - - - - -
                              - -
                              -

                              Index

                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                              -
                              Properties
                              -
                              - -
                              -
                              Methods
                              -
                              - -
                              -
                              Inputs
                              -
                              - -
                              -
                              Accessors
                              -
                              - -
                              -
                              - -
                              -

                              Constructor

                              - - - - - - - - - - -
                              -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                              -
                              - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                              NameTypeOptional
                              elementRef - ElementRef - - No -
                              libService - OpenViduComponentsConfigService - - No -
                              -
                              -
                              -
                              - -
                              -

                              Inputs

                              - - - - - - - - - -
                              - - activitiesPanelBroadcastingActivity -
                              - Type : boolean - -
                              - - - - - - - - - -
                              - - broadcastingActivity -
                              - Type : boolean - -
                              -
                              - - - -
                              - -

                              - Methods -

                              - - - - - - - - - - - - - - - - -
                              - - - clear - - -
                              -clear() -
                              - -
                              - Returns : void - -
                              -
                              - - - - - - - - - - - - - - - - -
                              - - - update - - -
                              -update(value: boolean) -
                              - -
                              - Parameters : - - - - - - - - - - - - - - - - - - - -
                              NameTypeOptional
                              value - boolean - - No -
                              -
                              -
                              - Returns : void - -
                              -
                              - -
                              -
                              -
                              -
                              - -

                              - Properties -

                              - - - - - - - - - - - - - - -
                              - - - broadcastingActivityValue - - -
                              - Type : boolean - -
                              - Default value : true -
                              - - - - - - - - - - - -
                              - - - Public - elementRef - - -
                              - Type : ElementRef - -
                              -
                              - -
                              -

                              - Accessors -

                              - - - - - - - - - - - - - - -
                              - - activitiesPanelBroadcastingActivity -
                              - setactivitiesPanelBroadcastingActivity(value: boolean) -
                              - -
                              - Parameters : - - - - - - - - - - - - - - - - - - -
                              NameTypeOptional
                              value - boolean - - No -
                              -
                              -
                              -
                              -
                              - Returns : void - -
                              -
                              - - - - - - - - - - - - - - -
                              - - broadcastingActivity -
                              - setbroadcastingActivity(value: boolean) -
                              - -
                              - Parameters : - - - - - - - - - - - - - - - - - - -
                              NameTypeOptional
                              value - boolean - - No -
                              -
                              -
                              -
                              -
                              - Returns : void - -
                              -
                              -
                              - -
                              - - - -
                              - - - - - - - - - - - - - - -
                              -
                              -

                              results matching ""

                              -
                                -
                                -
                                -

                                No results matching ""

                                -
                                -
                                -
                                - -
                                -
                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelDirective.html deleted file mode 100644 index 6cb15b3d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelDirective.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                -
                                - - -
                                -
                                - - - - - - - - - - - -
                                -
                                -

                                -

                                File

                                -

                                -

                                - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                - - -

                                -

                                Description

                                -

                                -

                                -

                                The *ovActivitiesPanel directive empowers you to effortlessly substitute the default activities panel template with a custom one.

                                -

                                In the example below, we showcase how to replace the activities template with a custom one.

                                - -Example :
                                import { HttpClient } from '@angular/common/http';
                                -import { Component } from '@angular/core';
                                -import { lastValueFrom } from 'rxjs';
                                -import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                -
                                -@Component({
                                -    selector: 'app-root',
                                -    template: `
                                -        <ov-videoconference
                                -            [token]="token"
                                -            [livekitUrl]="LIVEKIT_URL"
                                -            (onTokenRequested)="onTokenRequested($event)"
                                -        >
                                -            <!-- Custom activities panel -->
                                -            <div *ovActivitiesPanel id="my-panel">
                                -                <h3>ACTIVITIES</h3>
                                -                <div>CUSTOM ACTIVITIES</div>
                                -            </div>
                                -        </ov-videoconference>
                                -    `,
                                -    styles: `
                                -        #my-panel {
                                -            background: #aafffc;
                                -            height: 100%;
                                -            overflow: hidden;
                                -            text-align: center;
                                -        }
                                -    `,
                                -    standalone: true,
                                -    imports: [OpenViduComponentsModule],
                                -})
                                -export class AppComponent {
                                -    // For local development, leave these variables empty
                                -    // For production, configure them with correct URLs depending on your deployment
                                -    APPLICATION_SERVER_URL = '';
                                -    LIVEKIT_URL = '';
                                -    roomName = 'custom-activities-panel';
                                -    token!: string;
                                -
                                -    constructor(private httpClient: HttpClient) {
                                -        this.configureUrls();
                                -    }
                                -
                                -    configureUrls() {
                                -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                -        if (!this.APPLICATION_SERVER_URL) {
                                -            if (window.location.hostname === 'localhost') {
                                -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                -            } else {
                                -                this.APPLICATION_SERVER_URL =
                                -                    'https://' + window.location.hostname + ':6443/';
                                -            }
                                -        }
                                -
                                -        // If LIVEKIT_URL is not configured, use default value from local development
                                -        if (!this.LIVEKIT_URL) {
                                -            if (window.location.hostname === 'localhost') {
                                -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                -            } else {
                                -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                -            }
                                -        }
                                -    }
                                -
                                -    async onTokenRequested(participantName: string) {
                                -        const { token } = await this.getToken(this.roomName, participantName);
                                -        this.token = token;
                                -    }
                                -
                                -    getToken(roomName: string, participantName: string): Promise<any> {
                                -        try {
                                -            return lastValueFrom(
                                -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                -                    roomName,
                                -                    participantName,
                                -                })
                                -            );
                                -        } catch (error: any) {
                                -            if (error.status === 404) {
                                -                throw {
                                -                    status: error.status,
                                -                    message: 'Cannot connect with backend. ' + error.url + ' not found',
                                -                };
                                -            }
                                -            throw error;
                                -        }
                                -    }
                                -}
                                -
                                - -

                                For a step-by-step tutorial on how to replace the activities template with just a few lines of code, -check out our comprehensive guide: Customizing the Activities Panel.

                                - -

                                - - - - -
                                -

                                Metadata

                                - - - - - - - - - - - - - -
                                - -
                                -

                                Index

                                - - - - - - - - - - - - - - - -
                                -
                                Properties
                                -
                                - -
                                -
                                - -
                                -

                                Constructor

                                - - - - - - - - - - -
                                -constructor(template: TemplateRef, viewContainer: ViewContainerRef) -
                                -
                                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                NameTypeOptional
                                template - TemplateRef<any> - - No -
                                viewContainer - ViewContainerRef - - No -
                                -
                                -
                                -
                                - - - - - - -
                                - -

                                - Properties -

                                - - - - - - - - - - - -
                                - - - Public - template - - -
                                - Type : TemplateRef<any> - -
                                - - - - - - - - - - - -
                                - - - Public - viewContainer - - -
                                - Type : ViewContainerRef - -
                                -
                                - - -
                                - - - -
                                - - - - - - - - - - - - - - -
                                -
                                -

                                results matching ""

                                -
                                  -
                                  -
                                  -

                                  No results matching ""

                                  -
                                  -
                                  -
                                  - -
                                  -
                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelRecordingActivityDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelRecordingActivityDirective.html deleted file mode 100644 index cb946d57..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ActivitiesPanelRecordingActivityDirective.html +++ /dev/null @@ -1,686 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                  -
                                  - - -
                                  -
                                  - - - - - - - - - - - -
                                  -
                                  -

                                  -

                                  File

                                  -

                                  -

                                  - projects/openvidu-components-angular/src/lib/directives/api/activities-panel.directive.ts -

                                  - - -

                                  -

                                  Description

                                  -

                                  -

                                  -

                                  The recordingActivity directive allows show/hide the recording activity in ActivitiesPanelComponent.

                                  -

                                  Default: true

                                  -

                                  It can be used in the parent element VideoconferenceComponent specifying the name of the activitiesPanel component:

                                  -Example :
                                  <ov-videoconference [activitiesPanelRecordingActivity]="false"></ov-videoconference>


                                  And it also can be used in the ActivitiesPanelComponent.

                                  -Example :
                                  <ov-activities-panel *ovActivitiesPanel [recordingActivity]="false"></ov-activities-panel>
                                  -

                                  - - -

                                  -

                                  Implements

                                  -

                                  -

                                  - AfterViewInit - OnDestroy -

                                  - - -
                                  -

                                  Metadata

                                  - - - - - - - - - - - - - -
                                  - -
                                  -

                                  Index

                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                  -
                                  Properties
                                  -
                                  - -
                                  -
                                  Methods
                                  -
                                  - -
                                  -
                                  Inputs
                                  -
                                  - -
                                  -
                                  Accessors
                                  -
                                  - -
                                  -
                                  - -
                                  -

                                  Constructor

                                  - - - - - - - - - - -
                                  -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                  -
                                  - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                  NameTypeOptional
                                  elementRef - ElementRef - - No -
                                  libService - OpenViduComponentsConfigService - - No -
                                  -
                                  -
                                  -
                                  - -
                                  -

                                  Inputs

                                  - - - - - - - - - -
                                  - - activitiesPanelRecordingActivity -
                                  - Type : boolean - -
                                  - - - - - - - - - -
                                  - - recordingActivity -
                                  - Type : boolean - -
                                  -
                                  - - - -
                                  - -

                                  - Methods -

                                  - - - - - - - - - - - - - - - - -
                                  - - - clear - - -
                                  -clear() -
                                  - -
                                  - Returns : void - -
                                  -
                                  - - - - - - - - - - - - - - - - -
                                  - - - update - - -
                                  -update(value: boolean) -
                                  - -
                                  - Parameters : - - - - - - - - - - - - - - - - - - - -
                                  NameTypeOptional
                                  value - boolean - - No -
                                  -
                                  -
                                  - Returns : void - -
                                  -
                                  - -
                                  -
                                  -
                                  -
                                  - -

                                  - Properties -

                                  - - - - - - - - - - - -
                                  - - - Public - elementRef - - -
                                  - Type : ElementRef - -
                                  - - - - - - - - - - - - - - -
                                  - - - recordingActivityValue - - -
                                  - Type : boolean - -
                                  - Default value : true -
                                  -
                                  - -
                                  -

                                  - Accessors -

                                  - - - - - - - - - - - - - - -
                                  - - activitiesPanelRecordingActivity -
                                  - setactivitiesPanelRecordingActivity(value: boolean) -
                                  - -
                                  - Parameters : - - - - - - - - - - - - - - - - - - -
                                  NameTypeOptional
                                  value - boolean - - No -
                                  -
                                  -
                                  -
                                  -
                                  - Returns : void - -
                                  -
                                  - - - - - - - - - - - - - - -
                                  - - recordingActivity -
                                  - setrecordingActivity(value: boolean) -
                                  - -
                                  - Parameters : - - - - - - - - - - - - - - - - - - -
                                  NameTypeOptional
                                  value - boolean - - No -
                                  -
                                  -
                                  -
                                  -
                                  - Returns : void - -
                                  -
                                  -
                                  - -
                                  - - - -
                                  - - - - - - - - - - - - - - -
                                  -
                                  -

                                  results matching ""

                                  -
                                    -
                                    -
                                    -

                                    No results matching ""

                                    -
                                    -
                                    -
                                    - -
                                    -
                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdditionalPanelsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdditionalPanelsDirective.html deleted file mode 100644 index 11304e25..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdditionalPanelsDirective.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                    -
                                    - - -
                                    -
                                    - - - - - - - - - - - -
                                    -
                                    -

                                    -

                                    File

                                    -

                                    -

                                    - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                    - - -

                                    -

                                    Description

                                    -

                                    -

                                    -

                                    The *ovAdditionalPanels directive enables you to effortlessly integrate additional panels with the PanelComponent.

                                    -

                                    In the example below, we showcase how to add a custom panel to the PanelComponent using the ovAdditionalPanels directive.

                                    - -Example :
                                    import { HttpClient } from '@angular/common/http';
                                    -import { Component } from '@angular/core';
                                    -import { lastValueFrom } from 'rxjs';
                                    -
                                    -import {
                                    -    PanelStatusInfo,
                                    -    PanelService,
                                    -    OpenViduComponentsModule,
                                    -} from 'openvidu-components-angular';
                                    -
                                    -import { MatIcon } from '@angular/material/icon';
                                    -import { MatIconButton } from '@angular/material/button';
                                    -
                                    -
                                    -@Component({
                                    -    selector: 'app-root',
                                    -    template: `
                                    -        <!-- OpenVidu Video Conference Component -->
                                    -        <ov-videoconference
                                    -            [token]="token"
                                    -            [livekitUrl]="LIVEKIT_URL"
                                    -            [toolbarDisplayRoomName]="false"
                                    -            (onTokenRequested)="onTokenRequested($event)"
                                    -        >
                                    -            <!-- Additional Toolbar Buttons -->
                                    -            <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                    -                <button mat-icon-button (click)="toggleMyPanel('my-panel1')">
                                    -                    <mat-icon>360</mat-icon>
                                    -                </button>
                                    -                <button mat-icon-button (click)="toggleMyPanel('my-panel2')">
                                    -                    <mat-icon>star</mat-icon>
                                    -                </button>
                                    -            </div>
                                    -
                                    -            <!-- Additional Panels -->
                                    -            <div *ovAdditionalPanels id="my-panels">
                                    -                @if (showExternalPanel) {
                                    -                <div id="my-panel1">
                                    -                    <h2>NEW PANEL 1</h2>
                                    -                    <p>This is my new additional panel</p>
                                    -                </div>
                                    -                } @if (showExternalPanel2) {
                                    -                <div id="my-panel2">
                                    -                    <h2>NEW PANEL 2</h2>
                                    -                    <p>This is another new panel</p>
                                    -                </div>
                                    -                }
                                    -            </div>
                                    -        </ov-videoconference>
                                    -    `,
                                    -    styles: `
                                    -        #my-panels {
                                    -            height: 100%;
                                    -            overflow: hidden;
                                    -        }
                                    -        #my-panel1,
                                    -        #my-panel2 {
                                    -            text-align: center;
                                    -            height: calc(100% - 40px);
                                    -            margin: 20px;
                                    -        }
                                    -        #my-panel1 {
                                    -            background: #c9ffb2;
                                    -        }
                                    -        #my-panel2 {
                                    -            background: #ddf2ff;
                                    -        }
                                    -    `,
                                    -    standalone: true,
                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                    -})
                                    -export class AppComponent {
                                    -    // For local development, leave these variables empty
                                    -    // For production, configure them with correct URLs depending on your deployment
                                    -    APPLICATION_SERVER_URL = '';
                                    -    LIVEKIT_URL = '';
                                    -
                                    -    // Define the name of the room and initialize the token variable
                                    -    roomName = 'additional-panels';
                                    -    token!: string;
                                    -
                                    -    // Flags to control the visibility of external panels
                                    -    showExternalPanel: boolean = false;
                                    -    showExternalPanel2: boolean = false;
                                    -
                                    -    constructor(
                                    -        private httpClient: HttpClient,
                                    -        private panelService: PanelService
                                    -    ) {
                                    -        this.configureUrls();
                                    -    }
                                    -
                                    -    ngOnInit() {
                                    -        this.subscribeToPanelToggling();
                                    -    }
                                    -
                                    -    private configureUrls() {
                                    -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                    -        if (!this.APPLICATION_SERVER_URL) {
                                    -            if (window.location.hostname === 'localhost') {
                                    -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                    -            } else {
                                    -                this.APPLICATION_SERVER_URL =
                                    -                    'https://' + window.location.hostname + ':6443/';
                                    -            }
                                    -        }
                                    -
                                    -        // If LIVEKIT_URL is not configured, use default value from local development
                                    -        if (!this.LIVEKIT_URL) {
                                    -            if (window.location.hostname === 'localhost') {
                                    -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                    -            } else {
                                    -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                    -            }
                                    -        }
                                    -    }
                                    -
                                    -    // Function to request a token when a participant joins the room
                                    -    async onTokenRequested(participantName: any) {
                                    -        const { token } = await this.getToken(this.roomName, participantName);
                                    -        this.token = token;
                                    -    }
                                    -
                                    -    // Subscribe to panel toggling events
                                    -    subscribeToPanelToggling() {
                                    -        this.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => {
                                    -            this.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';
                                    -            this.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';
                                    -        });
                                    -    }
                                    -
                                    -    // Toggle the visibility of external panels
                                    -    toggleMyPanel(type: string) {
                                    -        this.panelService.togglePanel(type);
                                    -    }
                                    -
                                    -    // Function to get a token from the server
                                    -    async getToken(roomName: string, participantName: string): Promise<any> {
                                    -        try {
                                    -            // Send a POST request to the server to obtain a token
                                    -            return lastValueFrom(
                                    -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                    -                    roomName,
                                    -                    participantName,
                                    -                })
                                    -            );
                                    -        } catch (error: any) {
                                    -            // Handle errors, e.g., if the server is not reachable
                                    -            if (error.status === 404) {
                                    -                throw {
                                    -                    status: error.status,
                                    -                    message:
                                    -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                    -                };
                                    -            }
                                    -            throw error;
                                    -        }
                                    -    }
                                    -}
                                    -
                                    - -

                                    For detailed instructions, refer to the tutorial available here.

                                    - -

                                    - - - - -
                                    -

                                    Metadata

                                    - - - - - - - - - - - - - -
                                    - - - - - - - - - - -
                                    - - - -
                                    - - - - - - - - - - - - - - -
                                    -
                                    -

                                    results matching ""

                                    -
                                      -
                                      -
                                      -

                                      No results matching ""

                                      -
                                      -
                                      -
                                      - -
                                      -
                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardRecordingsListDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardRecordingsListDirective.html deleted file mode 100644 index 3689523b..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardRecordingsListDirective.html +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                      -
                                      - - -
                                      -
                                      - - - - - - - - - - - -
                                      -
                                      -

                                      -

                                      File

                                      -

                                      -

                                      - projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts -

                                      - - -

                                      -

                                      Description

                                      -

                                      -

                                      -

                                      The recordingsList directive allows show all recordings saved in your OpenVidu deployment in AdminDashboardComponent.

                                      -

                                      Default: []

                                      -Example :
                                      <ov-admin-dashboard [recordingsList]="recordings"></ov-admin-dashboard>
                                      -

                                      - - -

                                      -

                                      Implements

                                      -

                                      -

                                      - AfterViewInit - OnDestroy -

                                      - - -
                                      -

                                      Metadata

                                      - - - - - - - - - - - - - -
                                      - -
                                      -

                                      Index

                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                      -
                                      Properties
                                      -
                                      - -
                                      -
                                      Methods
                                      -
                                      - -
                                      -
                                      Inputs
                                      -
                                      - -
                                      -
                                      Accessors
                                      -
                                      - -
                                      -
                                      - -
                                      -

                                      Constructor

                                      - - - - - - - - - - -
                                      -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                      -
                                      - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                      NameTypeOptional
                                      elementRef - ElementRef - - No -
                                      libService - OpenViduComponentsConfigService - - No -
                                      -
                                      -
                                      -
                                      - -
                                      -

                                      Inputs

                                      - - - - - - - - - -
                                      - - recordingsList -
                                      - Type : RecordingInfo[] - -
                                      -
                                      - - - -
                                      - -

                                      - Methods -

                                      - - - - - - - - - - - - - - - - -
                                      - - - clear - - -
                                      -clear() -
                                      - -
                                      - Returns : void - -
                                      -
                                      - - - - - - - - - - - - - - - - -
                                      - - - update - - -
                                      -update(value: RecordingInfo[]) -
                                      - -
                                      - Parameters : - - - - - - - - - - - - - - - - - - - -
                                      NameTypeOptional
                                      value - RecordingInfo[] - - No -
                                      -
                                      -
                                      - Returns : void - -
                                      -
                                      - -
                                      -
                                      -
                                      -
                                      - -

                                      - Properties -

                                      - - - - - - - - - - - -
                                      - - - Public - elementRef - - -
                                      - Type : ElementRef - -
                                      - - - - - - - - - - - - - - -
                                      - - - recordingsValue - - -
                                      - Type : RecordingInfo[] - -
                                      - Default value : [] -
                                      -
                                      - -
                                      -

                                      - Accessors -

                                      - - - - - - - - - - - - - - -
                                      - - recordingsList -
                                      - setrecordingsList(value: RecordingInfo[]) -
                                      - -
                                      - Parameters : - - - - - - - - - - - - - - - - - - -
                                      NameTypeOptional
                                      value - RecordingInfo[] - - No -
                                      -
                                      -
                                      -
                                      -
                                      - Returns : void - -
                                      -
                                      -
                                      - -
                                      - - - -
                                      - - - - - - - - - - - - - - -
                                      -
                                      -

                                      results matching ""

                                      -
                                        -
                                        -
                                        -

                                        No results matching ""

                                        -
                                        -
                                        -
                                        - -
                                        -
                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardTitleDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardTitleDirective.html deleted file mode 100644 index 8f3b9b2b..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminDashboardTitleDirective.html +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                        -
                                        - - -
                                        -
                                        - - - - - - - - - - - -
                                        -
                                        -

                                        -

                                        File

                                        -

                                        -

                                        - projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts -

                                        - - -

                                        -

                                        Description

                                        -

                                        -

                                        -

                                        The navbarTitle directive allows customize the title of the navbar in AdminLoginComponent.

                                        -

                                        Default: 'OpenVidu Call Dashboard'

                                        -Example :
                                        <ov-admin-dashboard [navbarTitle]="'My Dashboard'"></ov-admin-dashboard>
                                        -

                                        - - -

                                        -

                                        Implements

                                        -

                                        -

                                        - AfterViewInit - OnDestroy -

                                        - - -
                                        -

                                        Metadata

                                        - - - - - - - - - - - - - -
                                        - -
                                        -

                                        Index

                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                        -
                                        Properties
                                        -
                                        - -
                                        -
                                        Methods
                                        -
                                        - -
                                        -
                                        Inputs
                                        -
                                        - -
                                        -
                                        Accessors
                                        -
                                        - -
                                        -
                                        - -
                                        -

                                        Constructor

                                        - - - - - - - - - - -
                                        -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                        -
                                        - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                        NameTypeOptional
                                        elementRef - ElementRef - - No -
                                        libService - OpenViduComponentsConfigService - - No -
                                        -
                                        -
                                        -
                                        - -
                                        -

                                        Inputs

                                        - - - - - - - - - -
                                        - - navbarTitle -
                                        - Type : any - -
                                        -
                                        - - - -
                                        - -

                                        - Methods -

                                        - - - - - - - - - - - - - - - - -
                                        - - - clear - - -
                                        -clear() -
                                        - -
                                        - Returns : void - -
                                        -
                                        - - - - - - - - - - - - - - - - -
                                        - - - update - - -
                                        -update(value: any) -
                                        - -
                                        - Parameters : - - - - - - - - - - - - - - - - - - - -
                                        NameTypeOptional
                                        value - any - - No -
                                        -
                                        -
                                        - Returns : void - -
                                        -
                                        - -
                                        -
                                        -
                                        -
                                        - -

                                        - Properties -

                                        - - - - - - - - - - - -
                                        - - - Public - elementRef - - -
                                        - Type : ElementRef - -
                                        - - - - - - - - - - - - - - -
                                        - - - navbarTitleValue - - -
                                        - Type : any - -
                                        - Default value : null -
                                        -
                                        - -
                                        -

                                        - Accessors -

                                        - - - - - - - - - - - - - - -
                                        - - navbarTitle -
                                        - setnavbarTitle(value: any) -
                                        - -
                                        - Parameters : - - - - - - - - - - - - - - - - - - -
                                        NameTypeOptional
                                        value - any - - No -
                                        -
                                        -
                                        -
                                        -
                                        - Returns : void - -
                                        -
                                        -
                                        - -
                                        - - - -
                                        - - - - - - - - - - - - - - -
                                        -
                                        -

                                        results matching ""

                                        -
                                          -
                                          -
                                          -

                                          No results matching ""

                                          -
                                          -
                                          -
                                          - -
                                          -
                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginErrorDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginErrorDirective.html deleted file mode 100644 index 896e0779..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginErrorDirective.html +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                          -
                                          - - -
                                          -
                                          - - - - - - - - - - - -
                                          -
                                          -

                                          -

                                          File

                                          -

                                          -

                                          - projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts -

                                          - - -

                                          -

                                          Description

                                          -

                                          -

                                          -

                                          The error directive allows show the authentication error in AdminLoginComponent.

                                          -

                                          Default: null

                                          -Example :
                                          <ov-admin-login [error]="error"></ov-admin-login>
                                          -

                                          - - -

                                          -

                                          Implements

                                          -

                                          -

                                          - AfterViewInit - OnDestroy -

                                          - - -
                                          -

                                          Metadata

                                          - - - - - - - - - - - - - -
                                          - -
                                          -

                                          Index

                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                          -
                                          Properties
                                          -
                                          - -
                                          -
                                          Methods
                                          -
                                          - -
                                          -
                                          Inputs
                                          -
                                          - -
                                          -
                                          Accessors
                                          -
                                          - -
                                          -
                                          - -
                                          -

                                          Constructor

                                          - - - - - - - - - - -
                                          -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                          -
                                          - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                          NameTypeOptional
                                          elementRef - ElementRef - - No -
                                          libService - OpenViduComponentsConfigService - - No -
                                          -
                                          -
                                          -
                                          - -
                                          -

                                          Inputs

                                          - - - - - - - - - -
                                          - - error -
                                          - Type : any - -
                                          -
                                          - - - -
                                          - -

                                          - Methods -

                                          - - - - - - - - - - - - - - - - -
                                          - - - clear - - -
                                          -clear() -
                                          - -
                                          - Returns : void - -
                                          -
                                          - - - - - - - - - - - - - - - - -
                                          - - - update - - -
                                          -update(value: any) -
                                          - -
                                          - Parameters : - - - - - - - - - - - - - - - - - - - -
                                          NameTypeOptional
                                          value - any - - No -
                                          -
                                          -
                                          - Returns : void - -
                                          -
                                          - -
                                          -
                                          -
                                          -
                                          - -

                                          - Properties -

                                          - - - - - - - - - - - -
                                          - - - Public - elementRef - - -
                                          - Type : ElementRef - -
                                          - - - - - - - - - - - - - - -
                                          - - - errorValue - - -
                                          - Type : any - -
                                          - Default value : null -
                                          -
                                          - -
                                          -

                                          - Accessors -

                                          - - - - - - - - - - - - - - -
                                          - - error -
                                          - seterror(value: any) -
                                          - -
                                          - Parameters : - - - - - - - - - - - - - - - - - - -
                                          NameTypeOptional
                                          value - any - - No -
                                          -
                                          -
                                          -
                                          -
                                          - Returns : void - -
                                          -
                                          -
                                          - -
                                          - - - -
                                          - - - - - - - - - - - - - - -
                                          -
                                          -

                                          results matching ""

                                          -
                                            -
                                            -
                                            -

                                            No results matching ""

                                            -
                                            -
                                            -
                                            - -
                                            -
                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginTitleDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginTitleDirective.html deleted file mode 100644 index b207a784..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AdminLoginTitleDirective.html +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                            -
                                            - - -
                                            -
                                            - - - - - - - - - - - -
                                            -
                                            -

                                            -

                                            File

                                            -

                                            -

                                            - projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts -

                                            - - -

                                            -

                                            Description

                                            -

                                            -

                                            -

                                            The navbarTitle directive allows customize the title of the navbar in AdminLoginComponent.

                                            -

                                            Default: 'OpenVidu Call Dashboard'

                                            -Example :
                                            <ov-admin-login [navbarTitle]="'My login'"></ov-admin-login>
                                            -

                                            - - -

                                            -

                                            Implements

                                            -

                                            -

                                            - AfterViewInit - OnDestroy -

                                            - - -
                                            -

                                            Metadata

                                            - - - - - - - - - - - - - -
                                            - -
                                            -

                                            Index

                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                            -
                                            Properties
                                            -
                                            - -
                                            -
                                            Methods
                                            -
                                            - -
                                            -
                                            Inputs
                                            -
                                            - -
                                            -
                                            Accessors
                                            -
                                            - -
                                            -
                                            - -
                                            -

                                            Constructor

                                            - - - - - - - - - - -
                                            -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                            -
                                            - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                            NameTypeOptional
                                            elementRef - ElementRef - - No -
                                            libService - OpenViduComponentsConfigService - - No -
                                            -
                                            -
                                            -
                                            - -
                                            -

                                            Inputs

                                            - - - - - - - - - -
                                            - - navbarTitle -
                                            - Type : any - -
                                            -
                                            - - - -
                                            - -

                                            - Methods -

                                            - - - - - - - - - - - - - - - - -
                                            - - - clear - - -
                                            -clear() -
                                            - -
                                            - Returns : void - -
                                            -
                                            - - - - - - - - - - - - - - - - -
                                            - - - update - - -
                                            -update(value: any) -
                                            - -
                                            - Parameters : - - - - - - - - - - - - - - - - - - - -
                                            NameTypeOptional
                                            value - any - - No -
                                            -
                                            -
                                            - Returns : void - -
                                            -
                                            - -
                                            -
                                            -
                                            -
                                            - -

                                            - Properties -

                                            - - - - - - - - - - - -
                                            - - - Public - elementRef - - -
                                            - Type : ElementRef - -
                                            - - - - - - - - - - - - - - -
                                            - - - navbarTitleValue - - -
                                            - Type : any - -
                                            - Default value : null -
                                            -
                                            - -
                                            -

                                            - Accessors -

                                            - - - - - - - - - - - - - - -
                                            - - navbarTitle -
                                            - setnavbarTitle(value: any) -
                                            - -
                                            - Parameters : - - - - - - - - - - - - - - - - - - -
                                            NameTypeOptional
                                            value - any - - No -
                                            -
                                            -
                                            -
                                            -
                                            - Returns : void - -
                                            -
                                            -
                                            - -
                                            - - - -
                                            - - - - - - - - - - - - - - -
                                            -
                                            -

                                            results matching ""

                                            -
                                              -
                                              -
                                              -

                                              No results matching ""

                                              -
                                              -
                                              -
                                              - -
                                              -
                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AudioEnabledDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AudioEnabledDirective.html deleted file mode 100644 index d865f750..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/AudioEnabledDirective.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                              -
                                              - - -
                                              -
                                              - - - - - - - - - - - -
                                              -
                                              -

                                              -

                                              File

                                              -

                                              -

                                              - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                              - - -

                                              -

                                              Description

                                              -

                                              -

                                              -

                                              The audioEnabled directive allows to join the room with microphone enabled or disabled.

                                              -

                                              It is only available for VideoconferenceComponent.

                                              -

                                              Default: true

                                              -Example :
                                              <ov-videoconference [audioEnabled]="false"></ov-videoconference>
                                              -

                                              - - -

                                              -

                                              Implements

                                              -

                                              -

                                              - OnDestroy -

                                              - - -
                                              -

                                              Metadata

                                              - - - - - - - - - - - - - -
                                              - - - - - - - - - - -
                                              - - - -
                                              - - - - - - - - - - - - - - -
                                              -
                                              -

                                              results matching ""

                                              -
                                                -
                                                -
                                                -

                                                No results matching ""

                                                -
                                                -
                                                -
                                                - -
                                                -
                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ChatPanelDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ChatPanelDirective.html deleted file mode 100644 index cae8d820..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ChatPanelDirective.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                -
                                                - - -
                                                -
                                                - - - - - - - - - - - -
                                                -
                                                -

                                                -

                                                File

                                                -

                                                -

                                                - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                - - -

                                                -

                                                Description

                                                -

                                                -

                                                -

                                                The *ovChatPanel directive empowers you to effortlessly substitute the default chat panel template with a custom one.

                                                -

                                                In the example below, we showcase how to replace the chat template with a custom one.

                                                - -Example :
                                                import { HttpClient } from '@angular/common/http';
                                                -import { Component } from '@angular/core';
                                                -import { lastValueFrom } from 'rxjs';
                                                -
                                                -import {
                                                -    DataPacket_Kind,
                                                -    DataPublishOptions,
                                                -    DataTopic,
                                                -    ParticipantService,
                                                -    RemoteParticipant,
                                                -    Room,
                                                -    RoomEvent,
                                                -    OpenViduComponentsModule,
                                                -} from 'openvidu-components-angular';
                                                -
                                                -@Component({
                                                -    selector: 'app-root',
                                                -    template: `
                                                -        <!-- OpenVidu Video Conference Component -->
                                                -        <ov-videoconference
                                                -            [token]="token"
                                                -            [livekitUrl]="LIVEKIT_URL"
                                                -            [toolbarDisplayRoomName]="false"
                                                -            (onTokenRequested)="onTokenRequested($event)"
                                                -            (onRoomCreated)="onRoomCreated($event)"
                                                -        >
                                                -            <!-- Chat Panel -->
                                                -            <div *ovChatPanel id="my-panel">
                                                -                <h3>Chat</h3>
                                                -                <div>
                                                -                    <ul>
                                                -                        @for (msg of messages; track msg) {
                                                -                        <li>{{ msg }}</li>
                                                -                        }
                                                -                    </ul>
                                                -                </div>
                                                -                <input value="Hello" #input />
                                                -                <button (click)="send(input.value)">Send</button>
                                                -            </div>
                                                -        </ov-videoconference>
                                                -    `,
                                                -    styles: `
                                                -        #my-panel {
                                                -            background: #aafffc;
                                                -            height: 100%;
                                                -            overflow: hidden;
                                                -            text-align: center;
                                                -        }
                                                -    `,
                                                -    standalone: true,
                                                -    imports: [OpenViduComponentsModule],
                                                -})
                                                -export class AppComponent {
                                                -    // For local development, leave these variables empty
                                                -    // For production, configure them with correct URLs depending on your deployment
                                                -    APPLICATION_SERVER_URL = '';
                                                -    LIVEKIT_URL = '';
                                                -
                                                -    // Define the name of the room and initialize the token variable
                                                -    roomName = 'chat-panel-directive-example';
                                                -    token!: string;
                                                -    messages: string[] = [];
                                                -
                                                -    constructor(
                                                -        private httpClient: HttpClient,
                                                -        private participantService: ParticipantService
                                                -    ) {
                                                -        this.configureUrls();
                                                -    }
                                                -
                                                -    private configureUrls() {
                                                -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                -        if (!this.APPLICATION_SERVER_URL) {
                                                -            if (window.location.hostname === 'localhost') {
                                                -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                -            } else {
                                                -                this.APPLICATION_SERVER_URL =
                                                -                    'https://' + window.location.hostname + ':6443/';
                                                -            }
                                                -        }
                                                -
                                                -        // If LIVEKIT_URL is not configured, use default value from local development
                                                -        if (!this.LIVEKIT_URL) {
                                                -            if (window.location.hostname === 'localhost') {
                                                -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                -            } else {
                                                -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                -            }
                                                -        }
                                                -    }
                                                -
                                                -    // Function to request a token when a participant joins the room
                                                -    async onTokenRequested(participantName: string) {
                                                -        const { token } = await this.getToken(this.roomName, participantName);
                                                -        this.token = token;
                                                -    }
                                                -
                                                -    // Event handler for room creation
                                                -    onRoomCreated(room: Room) {
                                                -        room.on(
                                                -            RoomEvent.DataReceived,
                                                -            (
                                                -                payload: Uint8Array,
                                                -                participant?: RemoteParticipant,
                                                -                _?: DataPacket_Kind,
                                                -                topic?: string
                                                -            ) => {
                                                -                if (topic === DataTopic.CHAT) {
                                                -                    const { message } = JSON.parse(new TextDecoder().decode(payload));
                                                -                    const participantName = participant?.name || 'Unknown';
                                                -                    this.messages.push(message);
                                                -                    console.log(`Message received from ${participantName}:`, message);
                                                -                }
                                                -            }
                                                -        );
                                                -    }
                                                -
                                                -    // Function to send a chat message
                                                -    async send(message: string): Promise<void> {
                                                -        const strData = JSON.stringify({ message });
                                                -        const data: Uint8Array = new TextEncoder().encode(strData);
                                                -        const options: DataPublishOptions = { topic: DataTopic.CHAT };
                                                -        await this.participantService.publishData(data, options);
                                                -        this.messages.push(message);
                                                -    }
                                                -
                                                -    // Function to get a token from the server
                                                -    getToken(roomName: string, participantName: string): Promise<any> {
                                                -        try {
                                                -            // Send a POST request to the server to obtain a token
                                                -            return lastValueFrom(
                                                -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                -                    roomName,
                                                -                    participantName,
                                                -                })
                                                -            );
                                                -        } catch (error: any) {
                                                -            // Handle errors, e.g., if the server is not reachable
                                                -            if (error.status === 404) {
                                                -                throw {
                                                -                    status: error.status,
                                                -                    message:
                                                -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                -                };
                                                -            }
                                                -            throw error;
                                                -        }
                                                -    }
                                                -}
                                                -
                                                - - -

                                                For a step-by-step tutorial on how to replace the chat template with just a few lines of code, -check out our comprehensive guide: Customizing the Chat Panel.

                                                - -

                                                - - - - -
                                                -

                                                Metadata

                                                - - - - - - - - - - - - - -
                                                - -
                                                -

                                                Index

                                                - - - - - - - - - - - - - - - -
                                                -
                                                Properties
                                                -
                                                - -
                                                -
                                                - -
                                                -

                                                Constructor

                                                - - - - - - - - - - -
                                                -constructor(template: TemplateRef, viewContainer: ViewContainerRef) -
                                                -
                                                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                NameTypeOptional
                                                template - TemplateRef<any> - - No -
                                                viewContainer - ViewContainerRef - - No -
                                                -
                                                -
                                                -
                                                - - - - - - -
                                                - -

                                                - Properties -

                                                - - - - - - - - - - - -
                                                - - - Public - template - - -
                                                - Type : TemplateRef<any> - -
                                                - - - - - - - - - - - -
                                                - - - Public - viewContainer - - -
                                                - Type : ViewContainerRef - -
                                                -
                                                - - -
                                                - - - -
                                                - - - - - - - - - - - - - - -
                                                -
                                                -

                                                results matching ""

                                                -
                                                  -
                                                  -
                                                  -

                                                  No results matching ""

                                                  -
                                                  -
                                                  -
                                                  - -
                                                  -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangDirective.html deleted file mode 100644 index 9fb3adbb..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangDirective.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                  -
                                                  - - -
                                                  -
                                                  - - - - - - - - - - - -
                                                  -
                                                  -

                                                  -

                                                  File

                                                  -

                                                  -

                                                  - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                  - - -

                                                  -

                                                  Description

                                                  -

                                                  -

                                                  -

                                                  The lang directive allows set the UI language to a default language.

                                                  -

                                                  It is only available for VideoconferenceComponent.

                                                  -

                                                  Default: English en

                                                  -

                                                  Available:

                                                  -
                                                    -
                                                  • English: en
                                                  • -
                                                  • Spanish: es
                                                  • -
                                                  • German: de
                                                  • -
                                                  • French: fr
                                                  • -
                                                  • Chinese: cn
                                                  • -
                                                  • Hindi: hi
                                                  • -
                                                  • Italian: it
                                                  • -
                                                  • Japanese: ja
                                                  • -
                                                  • Netherlands: nl
                                                  • -
                                                  • Portuguese: pt
                                                  • -
                                                  -Example :
                                                  <ov-videoconference [lang]="'es'"></ov-videoconference>
                                                  -

                                                  - - -

                                                  -

                                                  Implements

                                                  -

                                                  -

                                                  - OnDestroy -

                                                  - - -
                                                  -

                                                  Metadata

                                                  - - - - - - - - - - - - - -
                                                  - - - - - - - - - - -
                                                  - - - -
                                                  - - - - - - - - - - - - - - -
                                                  -
                                                  -

                                                  results matching ""

                                                  -
                                                    -
                                                    -
                                                    -

                                                    No results matching ""

                                                    -
                                                    -
                                                    -
                                                    - -
                                                    -
                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangOptionsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangOptionsDirective.html deleted file mode 100644 index 293776ef..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LangOptionsDirective.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                    -
                                                    - - -
                                                    -
                                                    - - - - - - - - - - - -
                                                    -
                                                    -

                                                    -

                                                    File

                                                    -

                                                    -

                                                    - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                    - - -

                                                    -

                                                    Description

                                                    -

                                                    -

                                                    -

                                                    The langOptions directive allows to set the application language options. -It will override the application languages provided by default. -This propety is an array of objects which must comply with the LangOption interface.

                                                    -

                                                    It is only available for VideoconferenceComponent.

                                                    -

                                                    Default: [ { name: 'English', lang: 'en' }, { name: 'Español', lang: 'es' }, { name: 'Deutsch', lang: 'de' }, { name: 'Français', lang: 'fr' }, { name: '中国', lang: 'cn' }, { name: 'हिन्दी', lang: 'hi' }, { name: 'Italiano', lang: 'it' }, { name: 'やまと', lang: 'ja' }, { name: 'Dutch', lang: 'nl' }, { name: 'Português', lang: 'pt' } ]

                                                    -

                                                    Note: If you want to add a new language, you must add a new object with the name and the language code (e.g. { name: 'Custom', lang: 'cus' }) -and then add the language file in the assets/lang folder with the name cus.json.

                                                    -Example :
                                                    <ov-videoconference [langOptions]="[{name:'Spanish', lang: 'es'}]"></ov-videoconference>
                                                    -

                                                    - - -

                                                    -

                                                    Implements

                                                    -

                                                    -

                                                    - OnDestroy -

                                                    - - -
                                                    -

                                                    Metadata

                                                    - - - - - - - - - - - - - -
                                                    - - - - - - - - - - -
                                                    - - - -
                                                    - - - - - - - - - - - - - - -
                                                    -
                                                    -

                                                    results matching ""

                                                    -
                                                      -
                                                      -
                                                      -

                                                      No results matching ""

                                                      -
                                                      -
                                                      -
                                                      - -
                                                      -
                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LayoutDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LayoutDirective.html deleted file mode 100644 index 72aba3c3..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LayoutDirective.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                      -
                                                      - - -
                                                      -
                                                      - - - - - - - - - - - -
                                                      -
                                                      -

                                                      -

                                                      File

                                                      -

                                                      -

                                                      - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                      - - -

                                                      -

                                                      Description

                                                      -

                                                      -

                                                      -

                                                      The *ovLayout directive empowers you to replace the default room layout with a customized one.

                                                      -

                                                      To ensure that the default StreamComponent functions correctly with participant tracks, you can access all local tracks using the tracks accessor. -Extracting streams from remote participants can be more complex, but openvidu-angular simplifies the process with the RemoteParticipantTracksPipe, which facilitates the extraction of each participant's stream.

                                                      -

                                                      In the example below, take note of the HTML template's structure. The *ngFor statements employ the | tracks pipe to handle tracks effectively.

                                                      - -Example :
                                                      import { HttpClient } from '@angular/common/http';
                                                      -import { Component, OnDestroy, OnInit } from '@angular/core';
                                                      -import { lastValueFrom, Subscription } from 'rxjs';
                                                      -import {
                                                      -    ParticipantModel,
                                                      -    ParticipantService,
                                                      -    OpenViduComponentsModule,
                                                      -} from 'openvidu-components-angular';
                                                      -import { NgClass } from '@angular/common';
                                                      -
                                                      -@Component({
                                                      -    selector: 'app-root',
                                                      -    template: `
                                                      -        <!-- OpenVidu Video Conference Component -->
                                                      -        <ov-videoconference
                                                      -            [token]="token"
                                                      -            [livekitUrl]="LIVEKIT_URL"
                                                      -            (onTokenRequested)="onTokenRequested($event)"
                                                      -        >
                                                      -            <!-- Custom Layout for Video Streams -->
                                                      -            <div *ovLayout>
                                                      -                <div class="container">
                                                      -                    <!-- Local Participant's Tracks -->
                                                      -                    @for (track of localParticipant.tracks; track track) {
                                                      -                    <div
                                                      -                        class="item"
                                                      -                        [ngClass]="{
                                                      -                            hidden:
                                                      -                                track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                      -                        }"
                                                      -                    >
                                                      -                        <ov-stream [track]="track"></ov-stream>
                                                      -                    </div>
                                                      -                    }
                                                      -
                                                      -                    <!-- Remote Participants' Tracks -->
                                                      -                    @for (track of remoteParticipants | tracks; track track) {
                                                      -                    <div
                                                      -                        class="item"
                                                      -                        [ngClass]="{
                                                      -                            hidden:
                                                      -                                track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                      -                        }"
                                                      -                    >
                                                      -                        <ov-stream [track]="track"></ov-stream>
                                                      -                    </div>
                                                      -                    }
                                                      -                </div>
                                                      -            </div>
                                                      -        </ov-videoconference>
                                                      -    `,
                                                      -    styles: `
                                                      -        .container {
                                                      -            display: flex;
                                                      -            flex-wrap: wrap;
                                                      -            justify-content: space-between;
                                                      -        }
                                                      -        .item {
                                                      -            flex: 0 50%;
                                                      -            height: 250px;
                                                      -            margin-bottom: 2%;
                                                      -        }
                                                      -        .hidden {
                                                      -            display: none;
                                                      -        }
                                                      -    `,
                                                      -    standalone: true,
                                                      -    imports: [OpenViduComponentsModule, NgClass],
                                                      -})
                                                      -export class AppComponent implements OnInit, OnDestroy {
                                                      -    // For local development, leave these variables empty
                                                      -    // For production, configure them with correct URLs depending on your deployment
                                                      -    APPLICATION_SERVER_URL = '';
                                                      -    LIVEKIT_URL = '';
                                                      -
                                                      -    // Define the name of the room and initialize the token variable
                                                      -    roomName = 'custom-layout';
                                                      -    token!: string;
                                                      -
                                                      -    // Participant-related properties
                                                      -    localParticipant!: ParticipantModel;
                                                      -    remoteParticipants!: ParticipantModel[];
                                                      -    localParticipantSubs!: Subscription;
                                                      -    remoteParticipantsSubs!: Subscription;
                                                      -
                                                      -    constructor(
                                                      -        private httpClient: HttpClient,
                                                      -        private participantService: ParticipantService
                                                      -    ) {
                                                      -        this.configureUrls();
                                                      -    }
                                                      -
                                                      -    private configureUrls() {
                                                      -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                      -        if (!this.APPLICATION_SERVER_URL) {
                                                      -            if (window.location.hostname === 'localhost') {
                                                      -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                      -            } else {
                                                      -                this.APPLICATION_SERVER_URL =
                                                      -                    'https://' + window.location.hostname + ':6443/';
                                                      -            }
                                                      -        }
                                                      -
                                                      -        // If LIVEKIT_URL is not configured, use default value from local development
                                                      -        if (!this.LIVEKIT_URL) {
                                                      -            if (window.location.hostname === 'localhost') {
                                                      -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                      -            } else {
                                                      -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                      -            }
                                                      -        }
                                                      -    }
                                                      -
                                                      -    ngOnInit() {
                                                      -        // Subscribe to participants' updates
                                                      -        this.subscribeToParticipants();
                                                      -    }
                                                      -
                                                      -    // Function to request a token when a participant joins the room
                                                      -    async onTokenRequested(participantName: string) {
                                                      -        const { token } = await this.getToken(this.roomName, participantName);
                                                      -        this.token = token;
                                                      -    }
                                                      -
                                                      -    ngOnDestroy() {
                                                      -        // Unsubscribe from participant updates to prevent memory leaks
                                                      -        this.localParticipantSubs.unsubscribe();
                                                      -        this.remoteParticipantsSubs.unsubscribe();
                                                      -    }
                                                      -
                                                      -    // Subscribe to updates for local and remote participants
                                                      -    subscribeToParticipants() {
                                                      -        this.localParticipantSubs =
                                                      -            this.participantService.localParticipant$.subscribe((p) => {
                                                      -                if (p) this.localParticipant = p;
                                                      -            });
                                                      -
                                                      -        this.remoteParticipantsSubs =
                                                      -            this.participantService.remoteParticipants$.subscribe(
                                                      -                (participants) => {
                                                      -                    this.remoteParticipants = participants;
                                                      -                }
                                                      -            );
                                                      -    }
                                                      -
                                                      -    // Function to get a token from the server
                                                      -    getToken(roomName: string, participantName: string): Promise<any> {
                                                      -        try {
                                                      -            // Send a POST request to the server to obtain a token
                                                      -            return lastValueFrom(
                                                      -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                      -                    roomName,
                                                      -                    participantName,
                                                      -                })
                                                      -            );
                                                      -        } catch (error: any) {
                                                      -            // Handle errors, e.g., if the server is not reachable
                                                      -            if (error.status === 404) {
                                                      -                throw {
                                                      -                    status: error.status,
                                                      -                    message:
                                                      -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                      -                };
                                                      -            }
                                                      -            throw error;
                                                      -        }
                                                      -    }
                                                      -}
                                                      -
                                                      - - -

                                                      For a comprehensive guide on implementing custom layouts, please refer to the associated tutorial here.

                                                      - -

                                                      - - - - -
                                                      -

                                                      Metadata

                                                      - - - - - - - - - - - - - -
                                                      - -
                                                      -

                                                      Index

                                                      - - - - - - - - - - - - - - - -
                                                      -
                                                      Properties
                                                      -
                                                      - -
                                                      -
                                                      - -
                                                      -

                                                      Constructor

                                                      - - - - - - - - - - -
                                                      -constructor(template: TemplateRef, container: ViewContainerRef) -
                                                      -
                                                      - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                      NameTypeOptional
                                                      template - TemplateRef<any> - - No -
                                                      container - ViewContainerRef - - No -
                                                      -
                                                      -
                                                      -
                                                      - - - - - - -
                                                      - -

                                                      - Properties -

                                                      - - - - - - - - - - - -
                                                      - - - Public - container - - -
                                                      - Type : ViewContainerRef - -
                                                      - - - - - - - - - - - -
                                                      - - - Public - template - - -
                                                      - Type : TemplateRef<any> - -
                                                      -
                                                      - - -
                                                      - - - -
                                                      - - - - - - - - - - - - - - -
                                                      -
                                                      -

                                                      results matching ""

                                                      -
                                                        -
                                                        -
                                                        -

                                                        No results matching ""

                                                        -
                                                        -
                                                        -
                                                        - -
                                                        -
                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LivekitUrlDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LivekitUrlDirective.html deleted file mode 100644 index 7a105dbe..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/LivekitUrlDirective.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                        -
                                                        - - -
                                                        -
                                                        - - - - - - - - - - - -
                                                        -
                                                        -

                                                        -

                                                        File

                                                        -

                                                        -

                                                        - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                        - - -

                                                        -

                                                        Description

                                                        -

                                                        -

                                                        -

                                                        The livekitUrl directive sets the livekitUrl to grant a participant access to a Room. -This Livekit Url will be use by each participant when connecting to a Room.

                                                        -

                                                        It is only available for VideoconferenceComponent.

                                                        -

                                                        Default: ""

                                                        -Example :
                                                        <ov-videoconference [livekitUrl]="http://localhost:1234"></ov-videoconference>
                                                        -

                                                        - - -

                                                        -

                                                        Implements

                                                        -

                                                        -

                                                        - OnDestroy -

                                                        - - -
                                                        -

                                                        Metadata

                                                        - - - - - - - - - - - - - -
                                                        - - - - - - - - - - -
                                                        - - - -
                                                        - - - - - - - - - - - - - - -
                                                        -
                                                        -

                                                        results matching ""

                                                        -
                                                          -
                                                          -
                                                          -

                                                          No results matching ""

                                                          -
                                                          -
                                                          -
                                                          - -
                                                          -
                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/MinimalDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/MinimalDirective.html deleted file mode 100644 index 75c8817c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/MinimalDirective.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                          -
                                                          - - -
                                                          -
                                                          - - - - - - - - - - - -
                                                          -
                                                          -

                                                          -

                                                          File

                                                          -

                                                          -

                                                          - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                          - - -

                                                          -

                                                          Description

                                                          -

                                                          -

                                                          -

                                                          The minimal directive applies a minimal UI hiding all controls except for cam and mic.

                                                          -

                                                          It is only available for VideoconferenceComponent.

                                                          -

                                                          Default: false

                                                          -Example :
                                                          <ov-videoconference [minimal]="true"></ov-videoconference>
                                                          -

                                                          - - -

                                                          -

                                                          Implements

                                                          -

                                                          -

                                                          - OnDestroy -

                                                          - - -
                                                          -

                                                          Metadata

                                                          - - - - - - - - - - - - - -
                                                          - - - - - - - - - - -
                                                          - - - -
                                                          - - - - - - - - - - - - - - -
                                                          -
                                                          -

                                                          results matching ""

                                                          -
                                                            -
                                                            -
                                                            -

                                                            No results matching ""

                                                            -
                                                            -
                                                            -
                                                            - -
                                                            -
                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PanelDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PanelDirective.html deleted file mode 100644 index e1852d6e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PanelDirective.html +++ /dev/null @@ -1,369 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                            -
                                                            - - -
                                                            -
                                                            - - - - - - - - - - - -
                                                            -
                                                            -

                                                            -

                                                            File

                                                            -

                                                            -

                                                            - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                            - - -

                                                            -

                                                            Description

                                                            -

                                                            -

                                                            -

                                                            The *ovPanel directive empowers you to seamlessly replace default panels with custom ones. -It also provides the flexibility to insert elements tagged with the ChatPanelDirective, ParticipantsPanelDirective, and AdditionalPanelsDirective.

                                                            -

                                                            In the example below, we showcase how to entirely replace the PanelComponent using the ChatPanelDirective. -Within it, you can tailor the appearance and behavior of the ParticipantsPanelComponent and ChatPanelComponent using their respective directives.

                                                            - -Example :
                                                            import { HttpClient } from '@angular/common/http';
                                                            -import { Component } from '@angular/core';
                                                            -import { lastValueFrom } from 'rxjs';
                                                            -
                                                            -import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                            -
                                                            -@Component({
                                                            -    selector: 'app-root',
                                                            -    template: `
                                                            -        <!-- OpenVidu Video Conference Component -->
                                                            -        <ov-videoconference
                                                            -            [token]="token"
                                                            -            [livekitUrl]="LIVEKIT_URL"
                                                            -            (onTokenRequested)="onTokenRequested($event)"
                                                            -        >
                                                            -            <!-- Custom Panels -->
                                                            -            <ov-panel *ovPanel>
                                                            -                <!-- Custom Chat Panel -->
                                                            -                <div *ovChatPanel id="my-chat-panel">This is my custom chat panel</div>
                                                            -
                                                            -                <!-- Custom Participants Panel -->
                                                            -                <div *ovParticipantsPanel id="my-participants-panel">
                                                            -                    This is my custom participants panel
                                                            -                </div>
                                                            -
                                                            -                <!-- Custom Activities Panel -->
                                                            -                <div *ovActivitiesPanel id="my-activities-panel">
                                                            -                    This is my custom activities panel
                                                            -                </div>
                                                            -            </ov-panel>
                                                            -        </ov-videoconference>
                                                            -    `,
                                                            -    styles: `
                                                            -        #my-chat-panel,
                                                            -        #my-participants-panel,
                                                            -        #my-activities-panel {
                                                            -            text-align: center;
                                                            -            height: calc(100% - 40px);
                                                            -            margin: 20px;
                                                            -        }
                                                            -
                                                            -        #my-chat-panel {
                                                            -            background: #c9ffb2;
                                                            -        }
                                                            -
                                                            -        #my-participants-panel {
                                                            -            background: #ddf2ff;
                                                            -        }
                                                            -
                                                            -        #my-activities-panel {
                                                            -            background: #ffddc9;
                                                            -        }
                                                            -    `,
                                                            -    standalone: true,
                                                            -    imports: [OpenViduComponentsModule],
                                                            -})
                                                            -export class AppComponent {
                                                            -    // For local development, leave these variables empty
                                                            -    // For production, configure them with correct URLs depending on your deployment
                                                            -    APPLICATION_SERVER_URL = '';
                                                            -    LIVEKIT_URL = '';
                                                            -
                                                            -    // Define the name of the room and initialize the token variable
                                                            -    roomName = 'custom-panels';
                                                            -    token!: string;
                                                            -
                                                            -    constructor(private httpClient: HttpClient) {
                                                            -        this.configureUrls();
                                                            -    }
                                                            -
                                                            -    private configureUrls() {
                                                            -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                            -        if (!this.APPLICATION_SERVER_URL) {
                                                            -            if (window.location.hostname === 'localhost') {
                                                            -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                            -            } else {
                                                            -                this.APPLICATION_SERVER_URL =
                                                            -                    'https://' + window.location.hostname + ':6443/';
                                                            -            }
                                                            -        }
                                                            -
                                                            -        // If LIVEKIT_URL is not configured, use default value from local development
                                                            -        if (!this.LIVEKIT_URL) {
                                                            -            if (window.location.hostname === 'localhost') {
                                                            -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                            -            } else {
                                                            -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                            -            }
                                                            -        }
                                                            -    }
                                                            -
                                                            -    // Function to request a token when a participant joins the room
                                                            -    async onTokenRequested(participantName: string) {
                                                            -        const { token } = await this.getToken(this.roomName, participantName);
                                                            -        this.token = token;
                                                            -    }
                                                            -
                                                            -    // Function to get a token from the server
                                                            -    getToken(roomName: string, participantName: string): Promise<any> {
                                                            -        try {
                                                            -            // Send a POST request to the server to obtain a token
                                                            -            return lastValueFrom(
                                                            -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                            -                    roomName,
                                                            -                    participantName,
                                                            -                })
                                                            -            );
                                                            -        } catch (error: any) {
                                                            -            // Handle errors, e.g., if the server is not reachable
                                                            -            if (error.status === 404) {
                                                            -                throw {
                                                            -                    status: error.status,
                                                            -                    message:
                                                            -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                            -                };
                                                            -            }
                                                            -            throw error;
                                                            -        }
                                                            -    }
                                                            -}
                                                            -
                                                            - - -

                                                            For a comprehensive tutorial on implementing custom panels, please refer to the associated guide here.

                                                            - -

                                                            - - - - -
                                                            -

                                                            Metadata

                                                            - - - - - - - - - - - - - -
                                                            - - - - - - - - - - -
                                                            - - - -
                                                            - - - - - - - - - - - - - - -
                                                            -
                                                            -

                                                            results matching ""

                                                            -
                                                              -
                                                              -
                                                              -

                                                              No results matching ""

                                                              -
                                                              -
                                                              -
                                                              - -
                                                              -
                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantNameDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantNameDirective.html deleted file mode 100644 index b3dcee86..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantNameDirective.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                              -
                                                              - - -
                                                              -
                                                              - - - - - - - - - - - -
                                                              -
                                                              -

                                                              -

                                                              File

                                                              -

                                                              -

                                                              - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                              - - -

                                                              -

                                                              Description

                                                              -

                                                              -

                                                              -

                                                              The participantName directive sets the participant name. It can be useful for aplications which doesn't need the prejoin page.

                                                              -

                                                              It is only available for VideoconferenceComponent.

                                                              -Example :
                                                              <ov-videoconference [participantName]="'OpenVidu'"></ov-videoconference>
                                                              -

                                                              - - -

                                                              -

                                                              Implements

                                                              -

                                                              -

                                                              - OnInit -

                                                              - - -
                                                              -

                                                              Metadata

                                                              - - - - - - - - - - - - - -
                                                              - - - - - - - - - - -
                                                              - - - -
                                                              - - - - - - - - - - - - - - -
                                                              -
                                                              -

                                                              results matching ""

                                                              -
                                                                -
                                                                -
                                                                -

                                                                No results matching ""

                                                                -
                                                                -
                                                                -
                                                                - -
                                                                -
                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemDirective.html deleted file mode 100644 index 5d7062bc..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemDirective.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                -
                                                                - - -
                                                                -
                                                                - - - - - - - - - - - -
                                                                -
                                                                -

                                                                -

                                                                File

                                                                -

                                                                -

                                                                - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                - - -

                                                                -

                                                                Description

                                                                -

                                                                -

                                                                -

                                                                The *ovParticipantPanelItem directive allows you to customize the default participant panel item template within the ParticipantsPanelComponent.

                                                                -

                                                                With the ovParticipantPanelItem directive, you can access the participant object from its context using the let keyword and referencing the participant -variable as follows: *ovParticipantPanelItem="let participant". This allows you to access the ParticipantModel object.

                                                                -

                                                                In the example below, we demonstrate how to replace the participant panel item template with just a few lines of code.

                                                                - -Example :
                                                                import { HttpClient } from '@angular/common/http';
                                                                -import { Component } from '@angular/core';
                                                                -import { lastValueFrom } from 'rxjs';
                                                                -
                                                                -import { MatIcon } from '@angular/material/icon';
                                                                -import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';
                                                                -import { MatIconButton } from '@angular/material/button';
                                                                -import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                -
                                                                -@Component({
                                                                -    selector: 'app-root',
                                                                -    template: `
                                                                -        <!-- OpenVidu Video Conference Component -->
                                                                -        <ov-videoconference
                                                                -            [token]="token"
                                                                -            [livekitUrl]="LIVEKIT_URL"
                                                                -            (onTokenRequested)="onTokenRequested($event)"
                                                                -        >
                                                                -            <!-- Participant Panel Items -->
                                                                -            <div *ovParticipantPanelItem="let participant" style="display: flex">
                                                                -                <p>{{ participant.name }}</p>
                                                                -
                                                                -                <!-- More Options Menu -->
                                                                -                <button mat-icon-button [matMenuTriggerFor]="menu">
                                                                -                    <mat-icon>more_vert</mat-icon>
                                                                -                </button>
                                                                -
                                                                -                <!-- Menu Content -->
                                                                -                <mat-menu #menu="matMenu">
                                                                -                    <button mat-menu-item>Button 1</button>
                                                                -                    <button mat-menu-item>Button 2</button>
                                                                -                </mat-menu>
                                                                -            </div>
                                                                -        </ov-videoconference>
                                                                -    `,
                                                                -    styles: [],
                                                                -    standalone: true,
                                                                -    imports: [
                                                                -        OpenViduComponentsModule,
                                                                -        MatIconButton,
                                                                -        MatMenuTrigger,
                                                                -        MatIcon,
                                                                -        MatMenu,
                                                                -        MatMenuItem,
                                                                -    ],
                                                                -})
                                                                -export class AppComponent {
                                                                -    // For local development, leave these variables empty
                                                                -    // For production, configure them with correct URLs depending on your deployment
                                                                -    APPLICATION_SERVER_URL = '';
                                                                -    LIVEKIT_URL = '';
                                                                -
                                                                -    // Define the name of the room and initialize the token variable
                                                                -    roomName = 'participant-panel-item';
                                                                -    token!: string;
                                                                -
                                                                -    constructor(private httpClient: HttpClient) {
                                                                -        this.configureUrls();
                                                                -    }
                                                                -
                                                                -    private configureUrls() {
                                                                -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                -        if (!this.APPLICATION_SERVER_URL) {
                                                                -            if (window.location.hostname === 'localhost') {
                                                                -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                -            } else {
                                                                -                this.APPLICATION_SERVER_URL =
                                                                -                    'https://' + window.location.hostname + ':6443/';
                                                                -            }
                                                                -        }
                                                                -
                                                                -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                -        if (!this.LIVEKIT_URL) {
                                                                -            if (window.location.hostname === 'localhost') {
                                                                -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                -            } else {
                                                                -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                -            }
                                                                -        }
                                                                -    }
                                                                -
                                                                -    // Function to request a token when a participant joins the room
                                                                -    async onTokenRequested(participantName: string) {
                                                                -        const { token } = await this.getToken(this.roomName, participantName);
                                                                -        this.token = token;
                                                                -    }
                                                                -
                                                                -    // Function to get a token from the server
                                                                -    getToken(roomName: string, participantName: string): Promise<any> {
                                                                -        try {
                                                                -            // Send a POST request to the server to obtain a token
                                                                -            return lastValueFrom(
                                                                -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                -                    roomName,
                                                                -                    participantName,
                                                                -                })
                                                                -            );
                                                                -        } catch (error: any) {
                                                                -            // Handle errors, e.g., if the server is not reachable
                                                                -            if (error.status === 404) {
                                                                -                throw {
                                                                -                    status: error.status,
                                                                -                    message:
                                                                -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                                -                };
                                                                -            }
                                                                -            throw error;
                                                                -        }
                                                                -    }
                                                                -}
                                                                -
                                                                - -

                                                                For a detailed tutorial on customizing participant panel items, please visit this link.

                                                                - -

                                                                - - - - -
                                                                -

                                                                Metadata

                                                                - - - - - - - - - - - - - -
                                                                - -
                                                                -

                                                                Index

                                                                - - - - - - - - - - - - - - - -
                                                                -
                                                                Properties
                                                                -
                                                                - -
                                                                -
                                                                - -
                                                                -

                                                                Constructor

                                                                - - - - - - - - - - -
                                                                -constructor(template: TemplateRef, viewContainer: ViewContainerRef) -
                                                                -
                                                                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                NameTypeOptional
                                                                template - TemplateRef<any> - - No -
                                                                viewContainer - ViewContainerRef - - No -
                                                                -
                                                                -
                                                                -
                                                                - - - - - - -
                                                                - -

                                                                - Properties -

                                                                - - - - - - - - - - - -
                                                                - - - Public - template - - -
                                                                - Type : TemplateRef<any> - -
                                                                - - - - - - - - - - - -
                                                                - - - Public - viewContainer - - -
                                                                - Type : ViewContainerRef - -
                                                                -
                                                                - - -
                                                                - - - -
                                                                - - - - - - - - - - - - - - -
                                                                -
                                                                -

                                                                results matching ""

                                                                -
                                                                  -
                                                                  -
                                                                  -

                                                                  No results matching ""

                                                                  -
                                                                  -
                                                                  -
                                                                  - -
                                                                  -
                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemElementsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemElementsDirective.html deleted file mode 100644 index b61a840e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemElementsDirective.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                  -
                                                                  - - -
                                                                  -
                                                                  - - - - - - - - - - - -
                                                                  -
                                                                  -

                                                                  -

                                                                  File

                                                                  -

                                                                  -

                                                                  - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                  - - -

                                                                  -

                                                                  Description

                                                                  -

                                                                  -

                                                                  -

                                                                  The *ovParticipantPanelItemElements directive allows you to incorporate additional elements into the ParticipantPanelItemComponent. -In the example below, we demonstrate how to add a simple button for disconnecting from the session.

                                                                  -

                                                                  With the *ovParticipantPanelItemElements directive, you can access the participant object within its context using the let keyword and referencing the participant variable as follows: *ovParticipantPanelItem="let participant". -This enables you to access the ParticipantModel object and activate the button exclusively for the local participant.

                                                                  - -Example :
                                                                  import { HttpClient } from '@angular/common/http';
                                                                  -import { Component } from '@angular/core';
                                                                  -import { lastValueFrom } from 'rxjs';
                                                                  -
                                                                  -import {
                                                                  -    OpenViduService,
                                                                  -    OpenViduComponentsModule,
                                                                  -} from 'openvidu-components-angular';
                                                                  -
                                                                  -@Component({
                                                                  -    selector: 'app-root',
                                                                  -    template: `
                                                                  -        <!-- OpenVidu Video Conference Component -->
                                                                  -        @if (connected) {
                                                                  -        <ov-videoconference
                                                                  -            [token]="token"
                                                                  -            [livekitUrl]="LIVEKIT_URL"
                                                                  -            [toolbarDisplayRoomName]="false"
                                                                  -            (onTokenRequested)="onTokenRequested($event)"
                                                                  -        >
                                                                  -            <!-- Participant Panel Item Elements -->
                                                                  -            <div *ovParticipantPanelItemElements="let participant">
                                                                  -                <!-- Leave Button for Local Participant -->
                                                                  -                @if (participant.isLocal) {
                                                                  -                <button (click)="leaveSession()">Leave</button>
                                                                  -                }
                                                                  -            </div>
                                                                  -        </ov-videoconference>
                                                                  -        }
                                                                  -
                                                                  -        <!-- Session Disconnected Message -->
                                                                  -        @if (!connected) {
                                                                  -        <div style="text-align: center;">Session disconnected</div>
                                                                  -        }
                                                                  -    `,
                                                                  -    styles: [],
                                                                  -    standalone: true,
                                                                  -    imports: [OpenViduComponentsModule],
                                                                  -})
                                                                  -export class AppComponent {
                                                                  -    // For local development, leave these variables empty
                                                                  -    // For production, configure them with correct URLs depending on your deployment
                                                                  -    APPLICATION_SERVER_URL = '';
                                                                  -    LIVEKIT_URL = '';
                                                                  -
                                                                  -    // Define the name of the room and initialize the token variable
                                                                  -    roomName = 'participant-panel-item-elements';
                                                                  -    token!: string;
                                                                  -
                                                                  -    // Flag to indicate session connection status
                                                                  -    connected = true;
                                                                  -
                                                                  -    constructor(
                                                                  -        private httpClient: HttpClient,
                                                                  -        private openviduService: OpenViduService
                                                                  -    ) {
                                                                  -        this.configureUrls();
                                                                  -    }
                                                                  -
                                                                  -    private configureUrls() {
                                                                  -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                  -        if (!this.APPLICATION_SERVER_URL) {
                                                                  -            if (window.location.hostname === 'localhost') {
                                                                  -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                  -            } else {
                                                                  -                this.APPLICATION_SERVER_URL =
                                                                  -                    'https://' + window.location.hostname + ':6443/';
                                                                  -            }
                                                                  -        }
                                                                  -
                                                                  -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                  -        if (!this.LIVEKIT_URL) {
                                                                  -            if (window.location.hostname === 'localhost') {
                                                                  -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                  -            } else {
                                                                  -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                  -            }
                                                                  -        }
                                                                  -    }
                                                                  -
                                                                  -    // Function to request a token when a participant joins the room
                                                                  -    async onTokenRequested(participantName: string) {
                                                                  -        const { token } = await this.getToken(this.roomName, participantName);
                                                                  -        this.token = token;
                                                                  -    }
                                                                  -
                                                                  -    // Function to leave the session
                                                                  -    async leaveSession() {
                                                                  -        await this.openviduService.disconnectRoom();
                                                                  -        this.connected = false;
                                                                  -    }
                                                                  -
                                                                  -    // Function to get a token from the server
                                                                  -    getToken(roomName: string, participantName: string): Promise<any> {
                                                                  -        try {
                                                                  -            // Send a POST request to the server to obtain a token
                                                                  -            return lastValueFrom(
                                                                  -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                  -                    roomName,
                                                                  -                    participantName,
                                                                  -                })
                                                                  -            );
                                                                  -        } catch (error: any) {
                                                                  -            // Handle errors, e.g., if the server is not reachable
                                                                  -            if (error.status === 404) {
                                                                  -                throw {
                                                                  -                    status: error.status,
                                                                  -                    message:
                                                                  -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                                  -                };
                                                                  -            }
                                                                  -            throw error;
                                                                  -        }
                                                                  -    }
                                                                  -}
                                                                  -
                                                                  - -

                                                                  For a comprehensive tutorial on adding elements to participant panel items, please visit this link.

                                                                  - -

                                                                  - - - - -
                                                                  -

                                                                  Metadata

                                                                  - - - - - - - - - - - - - -
                                                                  - -
                                                                  -

                                                                  Index

                                                                  - - - - - - - - - - - - - - - -
                                                                  -
                                                                  Properties
                                                                  -
                                                                  - -
                                                                  -
                                                                  - -
                                                                  -

                                                                  Constructor

                                                                  - - - - - - - - - - -
                                                                  -constructor(template: TemplateRef, viewContainer: ViewContainerRef) -
                                                                  -
                                                                  - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                  NameTypeOptional
                                                                  template - TemplateRef<any> - - No -
                                                                  viewContainer - ViewContainerRef - - No -
                                                                  -
                                                                  -
                                                                  -
                                                                  - - - - - - -
                                                                  - -

                                                                  - Properties -

                                                                  - - - - - - - - - - - -
                                                                  - - - Public - template - - -
                                                                  - Type : TemplateRef<any> - -
                                                                  - - - - - - - - - - - -
                                                                  - - - Public - viewContainer - - -
                                                                  - Type : ViewContainerRef - -
                                                                  -
                                                                  - - -
                                                                  - - - -
                                                                  - - - - - - - - - - - - - - -
                                                                  -
                                                                  -

                                                                  results matching ""

                                                                  -
                                                                    -
                                                                    -
                                                                    -

                                                                    No results matching ""

                                                                    -
                                                                    -
                                                                    -
                                                                    - -
                                                                    -
                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemMuteButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemMuteButtonDirective.html deleted file mode 100644 index d62a04e3..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantPanelItemMuteButtonDirective.html +++ /dev/null @@ -1,686 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                    -
                                                                    - - -
                                                                    -
                                                                    - - - - - - - - - - - -
                                                                    -
                                                                    -

                                                                    -

                                                                    File

                                                                    -

                                                                    -

                                                                    - projects/openvidu-components-angular/src/lib/directives/api/participant-panel-item.directive.ts -

                                                                    - - -

                                                                    -

                                                                    Description

                                                                    -

                                                                    -

                                                                    -

                                                                    The muteButton directive allows show/hide the muted button in participant panel item component.

                                                                    -

                                                                    Default: true

                                                                    -

                                                                    It can be used in the parent element VideoconferenceComponent specifying the name of the participantPanelItem component:

                                                                    -Example :
                                                                    <ov-videoconference [participantPanelItemMuteButton]="false"></ov-videoconference>


                                                                    And it also can be used in the ParticipantPanelItemComponent.

                                                                    -Example :
                                                                    <ov-participant-panel-item [muteButton]="false"></ov-participant-panel-item>
                                                                    -

                                                                    - - -

                                                                    -

                                                                    Implements

                                                                    -

                                                                    -

                                                                    - AfterViewInit - OnDestroy -

                                                                    - - -
                                                                    -

                                                                    Metadata

                                                                    - - - - - - - - - - - - - -
                                                                    - -
                                                                    -

                                                                    Index

                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                    -
                                                                    Properties
                                                                    -
                                                                    - -
                                                                    -
                                                                    Methods
                                                                    -
                                                                    - -
                                                                    -
                                                                    Inputs
                                                                    -
                                                                    - -
                                                                    -
                                                                    Accessors
                                                                    -
                                                                    - -
                                                                    -
                                                                    - -
                                                                    -

                                                                    Constructor

                                                                    - - - - - - - - - - -
                                                                    -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                                                    -
                                                                    - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                    NameTypeOptional
                                                                    elementRef - ElementRef - - No -
                                                                    libService - OpenViduComponentsConfigService - - No -
                                                                    -
                                                                    -
                                                                    -
                                                                    - -
                                                                    -

                                                                    Inputs

                                                                    - - - - - - - - - -
                                                                    - - muteButton -
                                                                    - Type : boolean - -
                                                                    - - - - - - - - - -
                                                                    - - participantPanelItemMuteButton -
                                                                    - Type : boolean - -
                                                                    -
                                                                    - - - -
                                                                    - -

                                                                    - Methods -

                                                                    - - - - - - - - - - - - - - - - -
                                                                    - - - clear - - -
                                                                    -clear() -
                                                                    - -
                                                                    - Returns : void - -
                                                                    -
                                                                    - - - - - - - - - - - - - - - - -
                                                                    - - - update - - -
                                                                    -update(value: boolean) -
                                                                    - -
                                                                    - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                    NameTypeOptional
                                                                    value - boolean - - No -
                                                                    -
                                                                    -
                                                                    - Returns : void - -
                                                                    -
                                                                    - -
                                                                    -
                                                                    -
                                                                    -
                                                                    - -

                                                                    - Properties -

                                                                    - - - - - - - - - - - -
                                                                    - - - Public - elementRef - - -
                                                                    - Type : ElementRef - -
                                                                    - - - - - - - - - - - - - - -
                                                                    - - - muteValue - - -
                                                                    - Type : boolean - -
                                                                    - Default value : true -
                                                                    -
                                                                    - -
                                                                    -

                                                                    - Accessors -

                                                                    - - - - - - - - - - - - - - -
                                                                    - - participantPanelItemMuteButton -
                                                                    - setparticipantPanelItemMuteButton(value: boolean) -
                                                                    - -
                                                                    - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                    NameTypeOptional
                                                                    value - boolean - - No -
                                                                    -
                                                                    -
                                                                    -
                                                                    -
                                                                    - Returns : void - -
                                                                    -
                                                                    - - - - - - - - - - - - - - -
                                                                    - - muteButton -
                                                                    - setmuteButton(value: boolean) -
                                                                    - -
                                                                    - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                    NameTypeOptional
                                                                    value - boolean - - No -
                                                                    -
                                                                    -
                                                                    -
                                                                    -
                                                                    - Returns : void - -
                                                                    -
                                                                    -
                                                                    - -
                                                                    - - - -
                                                                    - - - - - - - - - - - - - - -
                                                                    -
                                                                    -

                                                                    results matching ""

                                                                    -
                                                                      -
                                                                      -
                                                                      -

                                                                      No results matching ""

                                                                      -
                                                                      -
                                                                      -
                                                                      - -
                                                                      -
                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantsPanelDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantsPanelDirective.html deleted file mode 100644 index 0002078d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ParticipantsPanelDirective.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                      -
                                                                      - - -
                                                                      -
                                                                      - - - - - - - - - - - -
                                                                      -
                                                                      -

                                                                      -

                                                                      File

                                                                      -

                                                                      -

                                                                      - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                      - - -

                                                                      -

                                                                      Description

                                                                      -

                                                                      -

                                                                      -

                                                                      The *ovParticipantsPanel directive empowers you to substitute the default participants panel template with a customized one. -In the following example, we demonstrate how to replace the participants template with just a few lines of code.

                                                                      - -Example :
                                                                      import { HttpClient } from '@angular/common/http';
                                                                      -import { Component, OnDestroy, OnInit } from '@angular/core';
                                                                      -import { lastValueFrom, Subscription } from 'rxjs';
                                                                      -
                                                                      -import {
                                                                      -    ParticipantModel,
                                                                      -    ParticipantService,
                                                                      -    OpenViduComponentsModule,
                                                                      -} from 'openvidu-components-angular';
                                                                      -
                                                                      -@Component({
                                                                      -    selector: 'app-root',
                                                                      -    template: `
                                                                      -        <!-- OpenVidu Video Conference Component -->
                                                                      -        <ov-videoconference
                                                                      -            [token]="token"
                                                                      -            [livekitUrl]="LIVEKIT_URL"
                                                                      -            (onTokenRequested)="onTokenRequested($event)"
                                                                      -        >
                                                                      -            <!-- Custom Participants Panel -->
                                                                      -            <div *ovParticipantsPanel id="my-panel">
                                                                      -                <ul id="local">
                                                                      -                    <li>{{ localParticipant.name }}</li>
                                                                      -                </ul>
                                                                      -                <ul id="remote">
                                                                      -                    @for (p of remoteParticipants; track p) {
                                                                      -                    <li>{{ p.name }}</li>
                                                                      -                    }
                                                                      -                </ul>
                                                                      -            </div>
                                                                      -        </ov-videoconference>
                                                                      -    `,
                                                                      -    styles: `
                                                                      -        #my-panel {
                                                                      -            background: #faff7f;
                                                                      -            height: 100%;
                                                                      -            overflow: hidden;
                                                                      -        }
                                                                      -        #my-panel > #local {
                                                                      -            background: #a184ff;
                                                                      -        }
                                                                      -        #my-panel > #remote {
                                                                      -            background: #7fb8ff;
                                                                      -        }
                                                                      -    `,
                                                                      -    standalone: true,
                                                                      -    imports: [OpenViduComponentsModule],
                                                                      -})
                                                                      -export class AppComponent implements OnInit, OnDestroy {
                                                                      -    // For local development, leave these variables empty
                                                                      -    // For production, configure them with correct URLs depending on your deployment
                                                                      -    APPLICATION_SERVER_URL = '';
                                                                      -    LIVEKIT_URL = '';
                                                                      -
                                                                      -    // Define the name of the room and initialize the token variable
                                                                      -    roomName = 'custom-participants-panel';
                                                                      -    token!: string;
                                                                      -
                                                                      -    // Participant-related properties
                                                                      -    localParticipant!: ParticipantModel;
                                                                      -    remoteParticipants!: ParticipantModel[];
                                                                      -    localParticipantSubs!: Subscription;
                                                                      -    remoteParticipantsSubs!: Subscription;
                                                                      -
                                                                      -    constructor(
                                                                      -        private httpClient: HttpClient,
                                                                      -        private participantService: ParticipantService
                                                                      -    ) {
                                                                      -        this.configureUrls();
                                                                      -    }
                                                                      -
                                                                      -    private configureUrls() {
                                                                      -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                      -        if (!this.APPLICATION_SERVER_URL) {
                                                                      -            if (window.location.hostname === 'localhost') {
                                                                      -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                      -            } else {
                                                                      -                this.APPLICATION_SERVER_URL =
                                                                      -                    'https://' + window.location.hostname + ':6443/';
                                                                      -            }
                                                                      -        }
                                                                      -
                                                                      -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                      -        if (!this.LIVEKIT_URL) {
                                                                      -            if (window.location.hostname === 'localhost') {
                                                                      -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                      -            } else {
                                                                      -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                      -            }
                                                                      -        }
                                                                      -    }
                                                                      -
                                                                      -    // Subscribes to updates for local and remote participants.
                                                                      -    ngOnInit() {
                                                                      -        this.subscribeToParticipants();
                                                                      -    }
                                                                      -
                                                                      -    // Unsubscribes from updates for local and remote participants to prevent memory leaks.
                                                                      -    ngOnDestroy() {
                                                                      -        this.localParticipantSubs.unsubscribe();
                                                                      -        this.remoteParticipantsSubs.unsubscribe();
                                                                      -    }
                                                                      -
                                                                      -    // Function called when a participant requests a token to join the room.
                                                                      -    async onTokenRequested(participantName: string) {
                                                                      -        const { token } = await this.getToken(this.roomName, participantName);
                                                                      -        this.token = token;
                                                                      -    }
                                                                      -
                                                                      -    // Subscribes to updates for local and remote participants.
                                                                      -    subscribeToParticipants() {
                                                                      -        this.localParticipantSubs =
                                                                      -            this.participantService.localParticipant$.subscribe((p) => {
                                                                      -                if (p) this.localParticipant = p;
                                                                      -            });
                                                                      -
                                                                      -        this.remoteParticipantsSubs =
                                                                      -            this.participantService.remoteParticipants$.subscribe(
                                                                      -                (participants) => {
                                                                      -                    this.remoteParticipants = participants;
                                                                      -                }
                                                                      -            );
                                                                      -    }
                                                                      -
                                                                      -    // Sends a request to the server to obtain a token for a participant.
                                                                      -    async getToken(roomName: string, participantName: string): Promise<any> {
                                                                      -        try {
                                                                      -            // Send a POST request to the server to obtain a token
                                                                      -            return lastValueFrom(
                                                                      -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                      -                    roomName,
                                                                      -                    participantName,
                                                                      -                })
                                                                      -            );
                                                                      -        } catch (error: any) {
                                                                      -            // Handle errors, e.g., if the server is not reachable
                                                                      -            if (error.status === 404) {
                                                                      -                throw {
                                                                      -                    status: error.status,
                                                                      -                    message:
                                                                      -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                                      -                };
                                                                      -            }
                                                                      -            throw error;
                                                                      -        }
                                                                      -    }
                                                                      -}
                                                                      -
                                                                      - -

                                                                      For a comprehensive tutorial on customizing the participants panel, please visit this link.

                                                                      - -

                                                                      - - - - -
                                                                      -

                                                                      Metadata

                                                                      - - - - - - - - - - - - - -
                                                                      - -
                                                                      -

                                                                      Index

                                                                      - - - - - - - - - - - - - - - -
                                                                      -
                                                                      Properties
                                                                      -
                                                                      - -
                                                                      -
                                                                      - -
                                                                      -

                                                                      Constructor

                                                                      - - - - - - - - - - -
                                                                      -constructor(template: TemplateRef, viewContainer: ViewContainerRef) -
                                                                      -
                                                                      - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                      NameTypeOptional
                                                                      template - TemplateRef<any> - - No -
                                                                      viewContainer - ViewContainerRef - - No -
                                                                      -
                                                                      -
                                                                      -
                                                                      - - - - - - -
                                                                      - -

                                                                      - Properties -

                                                                      - - - - - - - - - - - -
                                                                      - - - Public - template - - -
                                                                      - Type : TemplateRef<any> - -
                                                                      - - - - - - - - - - - -
                                                                      - - - Public - viewContainer - - -
                                                                      - Type : ViewContainerRef - -
                                                                      -
                                                                      - - -
                                                                      - - - -
                                                                      - - - - - - - - - - - - - - -
                                                                      -
                                                                      -

                                                                      results matching ""

                                                                      -
                                                                        -
                                                                        -
                                                                        -

                                                                        No results matching ""

                                                                        -
                                                                        -
                                                                        -
                                                                        - -
                                                                        -
                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PrejoinDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PrejoinDirective.html deleted file mode 100644 index 5b02246e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/PrejoinDirective.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                        -
                                                                        - - -
                                                                        -
                                                                        - - - - - - - - - - - -
                                                                        -
                                                                        -

                                                                        -

                                                                        File

                                                                        -

                                                                        -

                                                                        - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                                        - - -

                                                                        -

                                                                        Description

                                                                        -

                                                                        -

                                                                        -

                                                                        The prejoin directive allows show/hide the prejoin page for selecting media devices.

                                                                        -

                                                                        It is only available for VideoconferenceComponent.

                                                                        -

                                                                        Default: true

                                                                        -Example :
                                                                        <ov-videoconference [prejoin]="false"></ov-videoconference>
                                                                        -

                                                                        - - -

                                                                        -

                                                                        Implements

                                                                        -

                                                                        -

                                                                        - OnDestroy -

                                                                        - - -
                                                                        -

                                                                        Metadata

                                                                        - - - - - - - - - - - - - -
                                                                        - - - - - - - - - - -
                                                                        - - - -
                                                                        - - - - - - - - - - - - - - -
                                                                        -
                                                                        -

                                                                        results matching ""

                                                                        -
                                                                          -
                                                                          -
                                                                          -

                                                                          No results matching ""

                                                                          -
                                                                          -
                                                                          -
                                                                          - -
                                                                          -
                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDirective.html deleted file mode 100644 index b00d7d90..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDirective.html +++ /dev/null @@ -1,489 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                          -
                                                                          - - -
                                                                          -
                                                                          - - - - - - - - - - - -
                                                                          -
                                                                          -

                                                                          -

                                                                          File

                                                                          -

                                                                          -

                                                                          - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                          - - -

                                                                          -

                                                                          Description

                                                                          -

                                                                          -

                                                                          -

                                                                          The *ovStream directive empowers you to substitute the default StreamComponent template with a custom one. -In the example below, we demonstrate how to customize the position and styles of a participant's nickname by replacing the default stream component.

                                                                          -

                                                                          With the ovStream directive, you can access the track object within its context using the let keyword and referencing the track variable as follows: *ovStream="let track". This allows you to access the ParticipantModel object using track.participant.

                                                                          -

                                                                          In the example provided below, we illustrate how to achieve this customization with just a few lines of code.

                                                                          - -Example :
                                                                          import { HttpClient } from '@angular/common/http';
                                                                          -import { Component } from '@angular/core';
                                                                          -import { lastValueFrom } from 'rxjs';
                                                                          -
                                                                          -import {
                                                                          -    OpenViduComponentsModule,
                                                                          -    ApiDirectiveModule,
                                                                          -    OpenViduComponentsDirectiveModule,
                                                                          -} from 'openvidu-components-angular';
                                                                          -
                                                                          -@Component({
                                                                          -    selector: 'app-root',
                                                                          -    template: `
                                                                          -        <!-- OpenVidu Video Conference Component -->
                                                                          -        <ov-videoconference
                                                                          -            [token]="token"
                                                                          -            [livekitUrl]="LIVEKIT_URL"
                                                                          -            (onTokenRequested)="onTokenRequested($event)"
                                                                          -        >
                                                                          -            <!-- Display Video Streams -->
                                                                          -            <div *ovStream="let track">
                                                                          -                <!-- Video Stream Component -->
                                                                          -                <ov-stream [track]="track" [displayParticipantName]="false"></ov-stream>
                                                                          -
                                                                          -                <!-- Display Participant's Name -->
                                                                          -                <p>{{ track.participant.name }}</p>
                                                                          -            </div>
                                                                          -        </ov-videoconference>
                                                                          -    `,
                                                                          -    styles: `
                                                                          -        p {
                                                                          -            position: absolute;
                                                                          -            bottom: 0;
                                                                          -            border: 2px solid;
                                                                          -            background: #000000;
                                                                          -        }
                                                                          -    `,
                                                                          -    standalone: true,
                                                                          -    imports: [OpenViduComponentsModule],
                                                                          -})
                                                                          -export class AppComponent {
                                                                          -    // For local development, leave these variables empty
                                                                          -    // For production, configure them with correct URLs depending on your deployment
                                                                          -    APPLICATION_SERVER_URL = '';
                                                                          -    LIVEKIT_URL = '';
                                                                          -
                                                                          -    // Define the name of the room and initialize the token variable
                                                                          -    roomName = 'custom-stream';
                                                                          -    token!: string;
                                                                          -
                                                                          -    constructor(private httpClient: HttpClient) {
                                                                          -        this.configureUrls();
                                                                          -    }
                                                                          -
                                                                          -    private configureUrls() {
                                                                          -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                          -        if (!this.APPLICATION_SERVER_URL) {
                                                                          -            if (window.location.hostname === 'localhost') {
                                                                          -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                          -            } else {
                                                                          -                this.APPLICATION_SERVER_URL =
                                                                          -                    'https://' + window.location.hostname + ':6443/';
                                                                          -            }
                                                                          -        }
                                                                          -
                                                                          -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                          -        if (!this.LIVEKIT_URL) {
                                                                          -            if (window.location.hostname === 'localhost') {
                                                                          -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                          -            } else {
                                                                          -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                          -            }
                                                                          -        }
                                                                          -    }
                                                                          -
                                                                          -    // Function to request a token when a participant joins the room
                                                                          -    async onTokenRequested(participantName: string) {
                                                                          -        const { token } = await this.getToken(this.roomName, participantName);
                                                                          -        this.token = token;
                                                                          -    }
                                                                          -
                                                                          -    // Function to get a token from the server
                                                                          -    getToken(roomName: string, participantName: string): Promise<any> {
                                                                          -        try {
                                                                          -            // Send a POST request to the server to obtain a token
                                                                          -            return lastValueFrom(
                                                                          -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                          -                    roomName,
                                                                          -                    participantName,
                                                                          -                })
                                                                          -            );
                                                                          -        } catch (error: any) {
                                                                          -            // Handle errors, e.g., if the server is not reachable
                                                                          -            if (error.status === 404) {
                                                                          -                throw {
                                                                          -                    status: error.status,
                                                                          -                    message:
                                                                          -                        'Cannot connect with the backend. ' + error.url + ' not found',
                                                                          -                };
                                                                          -            }
                                                                          -            throw error;
                                                                          -        }
                                                                          -    }
                                                                          -}
                                                                          -
                                                                          - -

                                                                          For a detailed tutorial on customizing the stream component, please visit this link.

                                                                          - -

                                                                          - - - - -
                                                                          -

                                                                          Metadata

                                                                          - - - - - - - - - - - - - -
                                                                          - -
                                                                          -

                                                                          Index

                                                                          - - - - - - - - - - - - - - - -
                                                                          -
                                                                          Properties
                                                                          -
                                                                          - -
                                                                          -
                                                                          - -
                                                                          -

                                                                          Constructor

                                                                          - - - - - - - - - - -
                                                                          -constructor(template: TemplateRef, container: ViewContainerRef) -
                                                                          -
                                                                          - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                          NameTypeOptional
                                                                          template - TemplateRef<any> - - No -
                                                                          container - ViewContainerRef - - No -
                                                                          -
                                                                          -
                                                                          -
                                                                          - - - - - - -
                                                                          - -

                                                                          - Properties -

                                                                          - - - - - - - - - - - -
                                                                          - - - Public - container - - -
                                                                          - Type : ViewContainerRef - -
                                                                          - - - - - - - - - - - -
                                                                          - - - Public - template - - -
                                                                          - Type : TemplateRef<any> - -
                                                                          -
                                                                          - - -
                                                                          - - - -
                                                                          - - - - - - - - - - - - - - -
                                                                          -
                                                                          -

                                                                          results matching ""

                                                                          -
                                                                            -
                                                                            -
                                                                            -

                                                                            No results matching ""

                                                                            -
                                                                            -
                                                                            -
                                                                            - -
                                                                            -
                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayAudioDetectionDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayAudioDetectionDirective.html deleted file mode 100644 index cec973cf..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayAudioDetectionDirective.html +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                            -
                                                                            - - -
                                                                            -
                                                                            - - - - - - - - - - - -
                                                                            -
                                                                            -

                                                                            -

                                                                            File

                                                                            -

                                                                            -

                                                                            - projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts -

                                                                            - - -

                                                                            -

                                                                            Description

                                                                            -

                                                                            -

                                                                            -

                                                                            The displayAudioDetection directive allows show/hide the participants audio detection in stream component.

                                                                            -

                                                                            Default: true

                                                                            -

                                                                            It can be used in the parent element VideoconferenceComponent specifying the name of the stream component:

                                                                            -Example :
                                                                            <ov-videoconference [streamDisplayAudioDetection]="false"></ov-videoconference>


                                                                            And it also can be used in the StreamComponent.

                                                                            -Example :
                                                                            <ov-stream [displayAudioDetection]="false"></ov-stream>
                                                                            -

                                                                            - - -

                                                                            -

                                                                            Implements

                                                                            -

                                                                            -

                                                                            - AfterViewInit - OnDestroy -

                                                                            - - -
                                                                            -

                                                                            Metadata

                                                                            - - - - - - - - - - - - - -
                                                                            - -
                                                                            -

                                                                            Index

                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                            -
                                                                            Properties
                                                                            -
                                                                            - -
                                                                            -
                                                                            Methods
                                                                            -
                                                                            - -
                                                                            -
                                                                            Inputs
                                                                            -
                                                                            - -
                                                                            -
                                                                            Accessors
                                                                            -
                                                                            - -
                                                                            -
                                                                            - -
                                                                            -

                                                                            Constructor

                                                                            - - - - - - - - - - -
                                                                            -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                                                            -
                                                                            - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                            NameTypeOptional
                                                                            elementRef - ElementRef - - No -
                                                                            libService - OpenViduComponentsConfigService - - No -
                                                                            -
                                                                            -
                                                                            -
                                                                            - -
                                                                            -

                                                                            Inputs

                                                                            - - - - - - - - - -
                                                                            - - displayAudioDetection -
                                                                            - Type : boolean - -
                                                                            - - - - - - - - - -
                                                                            - - streamDisplayAudioDetection -
                                                                            - Type : boolean - -
                                                                            -
                                                                            - - - -
                                                                            - -

                                                                            - Methods -

                                                                            - - - - - - - - - - - - - - - - -
                                                                            - - - clear - - -
                                                                            -clear() -
                                                                            - -
                                                                            - Returns : void - -
                                                                            -
                                                                            - - - - - - - - - - - - - - - - -
                                                                            - - - update - - -
                                                                            -update(value: boolean) -
                                                                            - -
                                                                            - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                            NameTypeOptional
                                                                            value - boolean - - No -
                                                                            -
                                                                            -
                                                                            - Returns : void - -
                                                                            -
                                                                            - -
                                                                            -
                                                                            -
                                                                            -
                                                                            - -

                                                                            - Properties -

                                                                            - - - - - - - - - - - -
                                                                            - - - displayAudioDetectionValue - - -
                                                                            - Type : boolean - -
                                                                            - - - - - - - - - - - -
                                                                            - - - Public - elementRef - - -
                                                                            - Type : ElementRef - -
                                                                            -
                                                                            - -
                                                                            -

                                                                            - Accessors -

                                                                            - - - - - - - - - - - - - - -
                                                                            - - streamDisplayAudioDetection -
                                                                            - setstreamDisplayAudioDetection(value: boolean) -
                                                                            - -
                                                                            - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                            NameTypeOptional
                                                                            value - boolean - - No -
                                                                            -
                                                                            -
                                                                            -
                                                                            -
                                                                            - Returns : void - -
                                                                            -
                                                                            - - - - - - - - - - - - - - -
                                                                            - - displayAudioDetection -
                                                                            - setdisplayAudioDetection(value: boolean) -
                                                                            - -
                                                                            - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                            NameTypeOptional
                                                                            value - boolean - - No -
                                                                            -
                                                                            -
                                                                            -
                                                                            -
                                                                            - Returns : void - -
                                                                            -
                                                                            -
                                                                            - -
                                                                            - - - -
                                                                            - - - - - - - - - - - - - - -
                                                                            -
                                                                            -

                                                                            results matching ""

                                                                            -
                                                                              -
                                                                              -
                                                                              -

                                                                              No results matching ""

                                                                              -
                                                                              -
                                                                              -
                                                                              - -
                                                                              -
                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayParticipantNameDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayParticipantNameDirective.html deleted file mode 100644 index 5b074d2c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamDisplayParticipantNameDirective.html +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                              -
                                                                              - - -
                                                                              -
                                                                              - - - - - - - - - - - -
                                                                              -
                                                                              -

                                                                              -

                                                                              File

                                                                              -

                                                                              -

                                                                              - projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts -

                                                                              - - -

                                                                              -

                                                                              Description

                                                                              -

                                                                              -

                                                                              -

                                                                              The displayParticipantName directive allows show/hide the participants name in stream component.

                                                                              -

                                                                              Default: true

                                                                              -

                                                                              It can be used in the parent element VideoconferenceComponent specifying the name of the stream component:

                                                                              -Example :
                                                                              <ov-videoconference [streamDisplayParticipantName]="false"></ov-videoconference>


                                                                              And it also can be used in the StreamComponent.

                                                                              -Example :
                                                                              <ov-stream [displayParticipantName]="false"></ov-stream>
                                                                              -

                                                                              - - -

                                                                              -

                                                                              Implements

                                                                              -

                                                                              -

                                                                              - AfterViewInit - OnDestroy -

                                                                              - - -
                                                                              -

                                                                              Metadata

                                                                              - - - - - - - - - - - - - -
                                                                              - -
                                                                              -

                                                                              Index

                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                              -
                                                                              Properties
                                                                              -
                                                                              - -
                                                                              -
                                                                              Methods
                                                                              -
                                                                              - -
                                                                              -
                                                                              Inputs
                                                                              -
                                                                              - -
                                                                              -
                                                                              Accessors
                                                                              -
                                                                              - -
                                                                              -
                                                                              - -
                                                                              -

                                                                              Constructor

                                                                              - - - - - - - - - - -
                                                                              -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                                                              -
                                                                              - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                              NameTypeOptional
                                                                              elementRef - ElementRef - - No -
                                                                              libService - OpenViduComponentsConfigService - - No -
                                                                              -
                                                                              -
                                                                              -
                                                                              - -
                                                                              -

                                                                              Inputs

                                                                              - - - - - - - - - -
                                                                              - - displayParticipantName -
                                                                              - Type : boolean - -
                                                                              - - - - - - - - - -
                                                                              - - streamDisplayParticipantName -
                                                                              - Type : boolean - -
                                                                              -
                                                                              - - - -
                                                                              - -

                                                                              - Methods -

                                                                              - - - - - - - - - - - - - - - - -
                                                                              - - - clear - - -
                                                                              -clear() -
                                                                              - -
                                                                              - Returns : void - -
                                                                              -
                                                                              - - - - - - - - - - - - - - - - -
                                                                              - - - update - - -
                                                                              -update(value: boolean) -
                                                                              - -
                                                                              - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                              NameTypeOptional
                                                                              value - boolean - - No -
                                                                              -
                                                                              -
                                                                              - Returns : void - -
                                                                              -
                                                                              - -
                                                                              -
                                                                              -
                                                                              -
                                                                              - -

                                                                              - Properties -

                                                                              - - - - - - - - - - - -
                                                                              - - - displayParticipantNameValue - - -
                                                                              - Type : boolean - -
                                                                              - - - - - - - - - - - -
                                                                              - - - Public - elementRef - - -
                                                                              - Type : ElementRef - -
                                                                              -
                                                                              - -
                                                                              -

                                                                              - Accessors -

                                                                              - - - - - - - - - - - - - - -
                                                                              - - streamDisplayParticipantName -
                                                                              - setstreamDisplayParticipantName(value: boolean) -
                                                                              - -
                                                                              - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                              NameTypeOptional
                                                                              value - boolean - - No -
                                                                              -
                                                                              -
                                                                              -
                                                                              -
                                                                              - Returns : void - -
                                                                              -
                                                                              - - - - - - - - - - - - - - -
                                                                              - - displayParticipantName -
                                                                              - setdisplayParticipantName(value: boolean) -
                                                                              - -
                                                                              - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                              NameTypeOptional
                                                                              value - boolean - - No -
                                                                              -
                                                                              -
                                                                              -
                                                                              -
                                                                              - Returns : void - -
                                                                              -
                                                                              -
                                                                              - -
                                                                              - - - -
                                                                              - - - - - - - - - - - - - - -
                                                                              -
                                                                              -

                                                                              results matching ""

                                                                              -
                                                                                -
                                                                                -
                                                                                -

                                                                                No results matching ""

                                                                                -
                                                                                -
                                                                                -
                                                                                - -
                                                                                -
                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamVideoControlsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamVideoControlsDirective.html deleted file mode 100644 index f37bbaab..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/StreamVideoControlsDirective.html +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                -
                                                                                - - -
                                                                                -
                                                                                - - - - - - - - - - - -
                                                                                -
                                                                                -

                                                                                -

                                                                                File

                                                                                -

                                                                                -

                                                                                - projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts -

                                                                                - - -

                                                                                -

                                                                                Description

                                                                                -

                                                                                -

                                                                                -

                                                                                The videoControls directive allows show/hide the participants video controls in stream component.

                                                                                -

                                                                                Default: true

                                                                                -

                                                                                It can be used in the parent element VideoconferenceComponent specifying the name of the stream component:

                                                                                -Example :
                                                                                <ov-videoconference [streamVideoControls]="false"></ov-videoconference>


                                                                                And it also can be used in the StreamComponent.

                                                                                -Example :
                                                                                <ov-stream [videoControls]="false"></ov-stream>
                                                                                -

                                                                                - - -

                                                                                -

                                                                                Implements

                                                                                -

                                                                                -

                                                                                - AfterViewInit - OnDestroy -

                                                                                - - -
                                                                                -

                                                                                Metadata

                                                                                - - - - - - - - - - - - - -
                                                                                - -
                                                                                -

                                                                                Index

                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                -
                                                                                Properties
                                                                                -
                                                                                - -
                                                                                -
                                                                                Methods
                                                                                -
                                                                                - -
                                                                                -
                                                                                Inputs
                                                                                -
                                                                                - -
                                                                                -
                                                                                Accessors
                                                                                -
                                                                                - -
                                                                                -
                                                                                - -
                                                                                -

                                                                                Constructor

                                                                                - - - - - - - - - - -
                                                                                -constructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService) -
                                                                                -
                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                NameTypeOptional
                                                                                elementRef - ElementRef - - No -
                                                                                libService - OpenViduComponentsConfigService - - No -
                                                                                -
                                                                                -
                                                                                -
                                                                                - -
                                                                                -

                                                                                Inputs

                                                                                - - - - - - - - - -
                                                                                - - streamVideoControls -
                                                                                - Type : boolean - -
                                                                                - - - - - - - - - -
                                                                                - - videoControls -
                                                                                - Type : boolean - -
                                                                                -
                                                                                - - - -
                                                                                - -

                                                                                - Methods -

                                                                                - - - - - - - - - - - - - - - - -
                                                                                - - - clear - - -
                                                                                -clear() -
                                                                                - -
                                                                                - Returns : void - -
                                                                                -
                                                                                - - - - - - - - - - - - - - - - -
                                                                                - - - update - - -
                                                                                -update(value: boolean) -
                                                                                - -
                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                NameTypeOptional
                                                                                value - boolean - - No -
                                                                                -
                                                                                -
                                                                                - Returns : void - -
                                                                                -
                                                                                - -
                                                                                -
                                                                                -
                                                                                -
                                                                                - -

                                                                                - Properties -

                                                                                - - - - - - - - - - - -
                                                                                - - - Public - elementRef - - -
                                                                                - Type : ElementRef - -
                                                                                - - - - - - - - - - - -
                                                                                - - - videoControlsValue - - -
                                                                                - Type : boolean - -
                                                                                -
                                                                                - -
                                                                                -

                                                                                - Accessors -

                                                                                - - - - - - - - - - - - - - -
                                                                                - - streamVideoControls -
                                                                                - setstreamVideoControls(value: boolean) -
                                                                                - -
                                                                                - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                                NameTypeOptional
                                                                                value - boolean - - No -
                                                                                -
                                                                                -
                                                                                -
                                                                                -
                                                                                - Returns : void - -
                                                                                -
                                                                                - - - - - - - - - - - - - - -
                                                                                - - videoControls -
                                                                                - setvideoControls(value: boolean) -
                                                                                - -
                                                                                - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                                NameTypeOptional
                                                                                value - boolean - - No -
                                                                                -
                                                                                -
                                                                                -
                                                                                -
                                                                                - Returns : void - -
                                                                                -
                                                                                -
                                                                                - -
                                                                                - - - -
                                                                                - - - - - - - - - - - - - - -
                                                                                -
                                                                                -

                                                                                results matching ""

                                                                                -
                                                                                  -
                                                                                  -
                                                                                  -

                                                                                  No results matching ""

                                                                                  -
                                                                                  -
                                                                                  -
                                                                                  - -
                                                                                  -
                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenDirective.html deleted file mode 100644 index c4447199..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenDirective.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                  -
                                                                                  - - -
                                                                                  -
                                                                                  - - - - - - - - - - - -
                                                                                  -
                                                                                  -

                                                                                  -

                                                                                  File

                                                                                  -

                                                                                  -

                                                                                  - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                                                  - - -

                                                                                  -

                                                                                  Description

                                                                                  -

                                                                                  -

                                                                                  -

                                                                                  The token directive sets the token to grant a participant access to a Room. -This OpenVidu token will be use by each participant when connecting to a Room.

                                                                                  -

                                                                                  It is only available for VideoconferenceComponent.

                                                                                  -

                                                                                  Default: ""

                                                                                  -Example :
                                                                                  <ov-videoconference [token]="token"></ov-videoconference>
                                                                                  -

                                                                                  - - -

                                                                                  -

                                                                                  Implements

                                                                                  -

                                                                                  -

                                                                                  - OnDestroy -

                                                                                  - - -
                                                                                  -

                                                                                  Metadata

                                                                                  - - - - - - - - - - - - - -
                                                                                  - - - - - - - - - - -
                                                                                  - - - -
                                                                                  - - - - - - - - - - - - - - -
                                                                                  -
                                                                                  -

                                                                                  results matching ""

                                                                                  -
                                                                                    -
                                                                                    -
                                                                                    -

                                                                                    No results matching ""

                                                                                    -
                                                                                    -
                                                                                    -
                                                                                    - -
                                                                                    -
                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenErrorDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenErrorDirective.html deleted file mode 100644 index de699999..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/TokenErrorDirective.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                    -
                                                                                    - - -
                                                                                    -
                                                                                    - - - - - - - - - - - -
                                                                                    -
                                                                                    -

                                                                                    -

                                                                                    File

                                                                                    -

                                                                                    -

                                                                                    - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                                                    - - -

                                                                                    -

                                                                                    Description

                                                                                    -

                                                                                    -

                                                                                    -

                                                                                    The tokenError directive allows to display an error message in case of issues during token request.

                                                                                    -

                                                                                    It is only available for VideoconferenceComponent.

                                                                                    -

                                                                                    Default: undefined

                                                                                    -Example :
                                                                                    <ov-videoconference [tokenError]="error"></ov-videoconference>
                                                                                    -

                                                                                    - - -

                                                                                    -

                                                                                    Implements

                                                                                    -

                                                                                    -

                                                                                    - OnDestroy -

                                                                                    - - -
                                                                                    -

                                                                                    Metadata

                                                                                    - - - - - - - - - - - - - -
                                                                                    - - - - - - - - - - -
                                                                                    - - - -
                                                                                    - - - - - - - - - - - - - - -
                                                                                    -
                                                                                    -

                                                                                    results matching ""

                                                                                    -
                                                                                      -
                                                                                      -
                                                                                      -

                                                                                      No results matching ""

                                                                                      -
                                                                                      -
                                                                                      -
                                                                                      - -
                                                                                      -
                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarActivitiesPanelButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarActivitiesPanelButtonDirective.html deleted file mode 100644 index 07325093..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarActivitiesPanelButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                      -
                                                                                      - - -
                                                                                      -
                                                                                      - - - - - - - - - - - -
                                                                                      -
                                                                                      -

                                                                                      -

                                                                                      File

                                                                                      -

                                                                                      -

                                                                                      - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                      - - -

                                                                                      -

                                                                                      Description

                                                                                      -

                                                                                      -

                                                                                      -

                                                                                      The activitiesPanelButton directive allows show/hide the activities panel toolbar button.

                                                                                      -

                                                                                      Default: true

                                                                                      -

                                                                                      It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                      -Example :
                                                                                      <ov-videoconference [toolbarActivitiesPanelButton]="false"></ov-videoconference>


                                                                                      And it also can be used in the ToolbarComponent.

                                                                                      -Example :
                                                                                      <ov-toolbar [activitiesPanelButton]="false"></ov-toolbar>
                                                                                      -

                                                                                      - - -

                                                                                      -

                                                                                      Implements

                                                                                      -

                                                                                      -

                                                                                      - AfterViewInit - OnDestroy -

                                                                                      - - -
                                                                                      -

                                                                                      Metadata

                                                                                      - - - - - - - - - - - - - -
                                                                                      - - - - - - - - - - -
                                                                                      - - - -
                                                                                      - - - - - - - - - - - - - - -
                                                                                      -
                                                                                      -

                                                                                      results matching ""

                                                                                      -
                                                                                        -
                                                                                        -
                                                                                        -

                                                                                        No results matching ""

                                                                                        -
                                                                                        -
                                                                                        -
                                                                                        - -
                                                                                        -
                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsDirective.html deleted file mode 100644 index 1b1ef54c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsDirective.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                        -
                                                                                        - - -
                                                                                        -
                                                                                        - - - - - - - - - - - -
                                                                                        -
                                                                                        -

                                                                                        -

                                                                                        File

                                                                                        -

                                                                                        -

                                                                                        - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                                        - - -

                                                                                        -

                                                                                        Description

                                                                                        -

                                                                                        -

                                                                                        -

                                                                                        The *ovToolbarAdditionalButtons directive enables the addition of extra buttons to the central button group within the toolbar.

                                                                                        -

                                                                                        In the following example, we've included the same buttons as those in the ToolbarDirective. Additionally, we utilize the ParticipantService to assess audio and video statuses.

                                                                                        - -Example :
                                                                                        import { HttpClient } from '@angular/common/http';
                                                                                        -import { Component } from '@angular/core';
                                                                                        -import { lastValueFrom } from 'rxjs';
                                                                                        -
                                                                                        -import {
                                                                                        -    ParticipantService,
                                                                                        -    OpenViduComponentsModule,
                                                                                        -} from 'openvidu-components-angular';
                                                                                        -import { MatIcon } from '@angular/material/icon';
                                                                                        -import { MatIconButton } from '@angular/material/button';
                                                                                        -
                                                                                        -@Component({
                                                                                        -    selector: 'app-root',
                                                                                        -    template: `
                                                                                        -        <ov-videoconference
                                                                                        -            [token]="token"
                                                                                        -            [livekitUrl]="LIVEKIT_URL"
                                                                                        -            (onTokenRequested)="onTokenRequested($event)"
                                                                                        -        >
                                                                                        -            <div *ovToolbarAdditionalButtons style="text-align: center;">
                                                                                        -                <button mat-icon-button (click)="toggleVideo()">
                                                                                        -                    <mat-icon>videocam</mat-icon>
                                                                                        -                </button>
                                                                                        -                <button mat-icon-button (click)="toggleAudio()">
                                                                                        -                    <mat-icon>mic</mat-icon>
                                                                                        -                </button>
                                                                                        -            </div>
                                                                                        -        </ov-videoconference>
                                                                                        -    `,
                                                                                        -    styles: [],
                                                                                        -    standalone: true,
                                                                                        -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                        -})
                                                                                        -export class AppComponent {
                                                                                        -    // For local development, leave these variables empty
                                                                                        -    // For production, configure them with correct URLs depending on your deployment
                                                                                        -
                                                                                        -    APPLICATION_SERVER_URL = '';
                                                                                        -    LIVEKIT_URL = '';
                                                                                        -
                                                                                        -    // The name of the room for the video conference.
                                                                                        -    roomName = 'toolbar-additionalbtn';
                                                                                        -
                                                                                        -    // The token used to authenticate the user in the video conference.
                                                                                        -    token!: string;
                                                                                        -
                                                                                        -    constructor(
                                                                                        -        private httpClient: HttpClient,
                                                                                        -        private participantService: ParticipantService
                                                                                        -    ) {
                                                                                        -        this.configureUrls();
                                                                                        -    }
                                                                                        -
                                                                                        -    private configureUrls() {
                                                                                        -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                        -        if (!this.APPLICATION_SERVER_URL) {
                                                                                        -            if (window.location.hostname === 'localhost') {
                                                                                        -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                        -            } else {
                                                                                        -                this.APPLICATION_SERVER_URL =
                                                                                        -                    'https://' + window.location.hostname + ':6443/';
                                                                                        -            }
                                                                                        -        }
                                                                                        -
                                                                                        -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                                        -        if (!this.LIVEKIT_URL) {
                                                                                        -            if (window.location.hostname === 'localhost') {
                                                                                        -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                        -            } else {
                                                                                        -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                        -            }
                                                                                        -        }
                                                                                        -    }
                                                                                        -
                                                                                        -    // Called when the token is requested.
                                                                                        -    async onTokenRequested(participantName: string) {
                                                                                        -        const { token } = await this.getToken(this.roomName, participantName);
                                                                                        -        this.token = token;
                                                                                        -    }
                                                                                        -
                                                                                        -    // Toggles the camera on/off.
                                                                                        -    async toggleVideo() {
                                                                                        -        const isCameraEnabled = this.participantService.isMyCameraEnabled();
                                                                                        -        await this.participantService.setCameraEnabled(!isCameraEnabled);
                                                                                        -    }
                                                                                        -
                                                                                        -    // Toggles the microphone on/off.
                                                                                        -    async toggleAudio() {
                                                                                        -        const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();
                                                                                        -        await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);
                                                                                        -    }
                                                                                        -
                                                                                        -    // Retrieves a token from the server to authenticate the user.
                                                                                        -    getToken(roomName: string, participantName: string): Promise<any> {
                                                                                        -        try {
                                                                                        -            return lastValueFrom(
                                                                                        -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                                        -                    roomName,
                                                                                        -                    participantName,
                                                                                        -                })
                                                                                        -            );
                                                                                        -        } catch (error: any) {
                                                                                        -            if (error.status === 404) {
                                                                                        -                throw {
                                                                                        -                    status: error.status,
                                                                                        -                    message: 'Cannot connect with backend. ' + error.url + ' not found',
                                                                                        -                };
                                                                                        -            }
                                                                                        -            throw error;
                                                                                        -        }
                                                                                        -    }
                                                                                        -}
                                                                                        -
                                                                                        - -

                                                                                        To follow a step-by-step tutorial on this feature, please visit this link.

                                                                                        - -

                                                                                        - - - - -
                                                                                        -

                                                                                        Metadata

                                                                                        - - - - - - - - - - - - - -
                                                                                        - - - - - - - - - - -
                                                                                        - - - -
                                                                                        - - - - - - - - - - - - - - -
                                                                                        -
                                                                                        -

                                                                                        results matching ""

                                                                                        -
                                                                                          -
                                                                                          -
                                                                                          -

                                                                                          No results matching ""

                                                                                          -
                                                                                          -
                                                                                          -
                                                                                          - -
                                                                                          -
                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsPossitionDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsPossitionDirective.html deleted file mode 100644 index e8e5f8bd..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalButtonsPossitionDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                          -
                                                                                          - - -
                                                                                          -
                                                                                          - - - - - - - - - - - -
                                                                                          -
                                                                                          -

                                                                                          -

                                                                                          File

                                                                                          -

                                                                                          -

                                                                                          - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                          - - -

                                                                                          -

                                                                                          Description

                                                                                          -

                                                                                          -

                                                                                          -

                                                                                          The ovToolbarAdditionalButtonsPosition defines the position where the additional buttons should be inserted.

                                                                                          -

                                                                                          The possible values are: ToolbarAdditionalButtonsPosition -Default: afterMenu

                                                                                          -

                                                                                          It can be used in the any element which contains the structural directive ToolbarAdditionalButtonsDirective.

                                                                                          -Example :
                                                                                          <div *ovToolbarAdditionalButtons [ovToolbarAdditionalButtonsPosition]="'beforeMenu'"></div>
                                                                                          -

                                                                                          - - -

                                                                                          -

                                                                                          Implements

                                                                                          -

                                                                                          -

                                                                                          - AfterViewInit - OnDestroy -

                                                                                          - - -
                                                                                          -

                                                                                          Metadata

                                                                                          - - - - - - - - - - - - - -
                                                                                          - - - - - - - - - - -
                                                                                          - - - -
                                                                                          - - - - - - - - - - - - - - -
                                                                                          -
                                                                                          -

                                                                                          results matching ""

                                                                                          -
                                                                                            -
                                                                                            -
                                                                                            -

                                                                                            No results matching ""

                                                                                            -
                                                                                            -
                                                                                            -
                                                                                            - -
                                                                                            -
                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalPanelButtonsDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalPanelButtonsDirective.html deleted file mode 100644 index c0058f80..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarAdditionalPanelButtonsDirective.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                            -
                                                                                            - - -
                                                                                            -
                                                                                            - - - - - - - - - - - -
                                                                                            -
                                                                                            -

                                                                                            -

                                                                                            File

                                                                                            -

                                                                                            -

                                                                                            - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                                            - - -

                                                                                            -

                                                                                            Description

                                                                                            -

                                                                                            -

                                                                                            -

                                                                                            The *ovToolbarAdditionalPanelButtons directive allows to add additional panel buttons to the toolbar. -In the example below we've added a simple button without any functionality. To learn how to toggle the panel check the AdditionalPanelsDirective.

                                                                                            - -Example :
                                                                                            import { HttpClient } from '@angular/common/http';
                                                                                            -import { Component } from '@angular/core';
                                                                                            -import { lastValueFrom } from 'rxjs';
                                                                                            -
                                                                                            -import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                            -import { MatIconButton } from '@angular/material/button';
                                                                                            -import { MatIcon } from '@angular/material/icon';
                                                                                            -
                                                                                            -@Component({
                                                                                            -    selector: 'app-root',
                                                                                            -    template: `
                                                                                            -        <ov-videoconference
                                                                                            -            [token]="token"
                                                                                            -            [livekitUrl]="LIVEKIT_URL"
                                                                                            -            [toolbarDisplayRoomName]="false"
                                                                                            -            (onTokenRequested)="onTokenRequested($event)"
                                                                                            -        >
                                                                                            -            <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                                                                            -                <button mat-icon-button (click)="onButtonClicked()">
                                                                                            -                    <mat-icon>star</mat-icon>
                                                                                            -                </button>
                                                                                            -            </div>
                                                                                            -        </ov-videoconference>
                                                                                            -    `,
                                                                                            -    styles: [],
                                                                                            -    standalone: true,
                                                                                            -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                            -})
                                                                                            -export class AppComponent {
                                                                                            -    // For local development, leave these variables empty
                                                                                            -    // For production, configure them with correct URLs depending on your deployment
                                                                                            -
                                                                                            -    APPLICATION_SERVER_URL = '';
                                                                                            -    LIVEKIT_URL = '';
                                                                                            -
                                                                                            -    // Set the room name
                                                                                            -    roomName = 'toolbar-additional-panel-btn';
                                                                                            -
                                                                                            -    // Initialize the token variable
                                                                                            -    token!: string;
                                                                                            -
                                                                                            -    constructor(private httpClient: HttpClient) {
                                                                                            -        this.configureUrls();
                                                                                            -    }
                                                                                            -
                                                                                            -    private configureUrls() {
                                                                                            -        // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                            -        if (!this.APPLICATION_SERVER_URL) {
                                                                                            -            if (window.location.hostname === 'localhost') {
                                                                                            -                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                            -            } else {
                                                                                            -                this.APPLICATION_SERVER_URL =
                                                                                            -                    'https://' + window.location.hostname + ':6443/';
                                                                                            -            }
                                                                                            -        }
                                                                                            -
                                                                                            -        // If LIVEKIT_URL is not configured, use default value from local development
                                                                                            -        if (!this.LIVEKIT_URL) {
                                                                                            -            if (window.location.hostname === 'localhost') {
                                                                                            -                this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                            -            } else {
                                                                                            -                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                            -            }
                                                                                            -        }
                                                                                            -    }
                                                                                            -
                                                                                            -    // Method to request a token for a participant
                                                                                            -    async onTokenRequested(participantName: string) {
                                                                                            -        const { token } = await this.getToken(this.roomName, participantName);
                                                                                            -        this.token = token;
                                                                                            -    }
                                                                                            -
                                                                                            -    // Method to handle button click
                                                                                            -    onButtonClicked() {
                                                                                            -        alert('button clicked');
                                                                                            -    }
                                                                                            -
                                                                                            -    // Method to get a token from the backend
                                                                                            -    getToken(roomName: string, participantName: string): Promise<any> {
                                                                                            -        try {
                                                                                            -            return lastValueFrom(
                                                                                            -                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                                            -                    roomName,
                                                                                            -                    participantName,
                                                                                            -                })
                                                                                            -            );
                                                                                            -        } catch (error: any) {
                                                                                            -            if (error.status === 404) {
                                                                                            -                throw {
                                                                                            -                    status: error.status,
                                                                                            -                    message: 'Cannot connect with backend. ' + error.url + ' not found',
                                                                                            -                };
                                                                                            -            }
                                                                                            -            throw error;
                                                                                            -        }
                                                                                            -    }
                                                                                            -}
                                                                                            -
                                                                                            - -

                                                                                            You can run the associated tutorial here.

                                                                                            - -

                                                                                            - - - - -
                                                                                            -

                                                                                            Metadata

                                                                                            - - - - - - - - - - - - - -
                                                                                            - - - - - - - - - - -
                                                                                            - - - -
                                                                                            - - - - - - - - - - - - - - -
                                                                                            -
                                                                                            -

                                                                                            results matching ""

                                                                                            -
                                                                                              -
                                                                                              -
                                                                                              -

                                                                                              No results matching ""

                                                                                              -
                                                                                              -
                                                                                              -
                                                                                              - -
                                                                                              -
                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBackgroundEffectsButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBackgroundEffectsButtonDirective.html deleted file mode 100644 index 49222bd8..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBackgroundEffectsButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                              -
                                                                                              - - -
                                                                                              -
                                                                                              - - - - - - - - - - - -
                                                                                              -
                                                                                              -

                                                                                              -

                                                                                              File

                                                                                              -

                                                                                              -

                                                                                              - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                              - - -

                                                                                              -

                                                                                              Description

                                                                                              -

                                                                                              -

                                                                                              -

                                                                                              The backgroundEffectsButton directive allows show/hide the background effects toolbar button.

                                                                                              -

                                                                                              Default: true

                                                                                              -

                                                                                              It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                              -Example :
                                                                                              <ov-videoconference [toolbarBackgroundEffectsButton]="false"></ov-videoconference>


                                                                                              And it also can be used in the ToolbarComponent.

                                                                                              -Example :
                                                                                              <ov-toolbar [backgroundEffectsButton]="false"></ov-toolbar>
                                                                                              -

                                                                                              - - -

                                                                                              -

                                                                                              Implements

                                                                                              -

                                                                                              -

                                                                                              - AfterViewInit - OnDestroy -

                                                                                              - - -
                                                                                              -

                                                                                              Metadata

                                                                                              - - - - - - - - - - - - - -
                                                                                              - - - - - - - - - - -
                                                                                              - - - -
                                                                                              - - - - - - - - - - - - - - -
                                                                                              -
                                                                                              -

                                                                                              results matching ""

                                                                                              -
                                                                                                -
                                                                                                -
                                                                                                -

                                                                                                No results matching ""

                                                                                                -
                                                                                                -
                                                                                                -
                                                                                                - -
                                                                                                -
                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBroadcastingButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBroadcastingButtonDirective.html deleted file mode 100644 index 79aee4c5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarBroadcastingButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                -
                                                                                                - - -
                                                                                                -
                                                                                                - - - - - - - - - - - -
                                                                                                -
                                                                                                -

                                                                                                -

                                                                                                File

                                                                                                -

                                                                                                -

                                                                                                - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                - - -

                                                                                                -

                                                                                                Description

                                                                                                -

                                                                                                -

                                                                                                -

                                                                                                The broadcastingButton directive allows show/hide the start/stop broadcasting toolbar button.

                                                                                                -

                                                                                                Default: true

                                                                                                -

                                                                                                It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                -Example :
                                                                                                <ov-videoconference [toolbarBroadcastingButton]="false"></ov-videoconference>


                                                                                                And it also can be used in the ToolbarComponent.

                                                                                                -Example :
                                                                                                <ov-toolbar [broadcastingButton]="false"></ov-toolbar>
                                                                                                -

                                                                                                - - -

                                                                                                -

                                                                                                Implements

                                                                                                -

                                                                                                -

                                                                                                - AfterViewInit - OnDestroy -

                                                                                                - - -
                                                                                                -

                                                                                                Metadata

                                                                                                - - - - - - - - - - - - - -
                                                                                                - - - - - - - - - - -
                                                                                                - - - -
                                                                                                - - - - - - - - - - - - - - -
                                                                                                -
                                                                                                -

                                                                                                results matching ""

                                                                                                -
                                                                                                  -
                                                                                                  -
                                                                                                  -

                                                                                                  No results matching ""

                                                                                                  -
                                                                                                  -
                                                                                                  -
                                                                                                  - -
                                                                                                  -
                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarChatPanelButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarChatPanelButtonDirective.html deleted file mode 100644 index 6e933d5e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarChatPanelButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                  -
                                                                                                  - - -
                                                                                                  -
                                                                                                  - - - - - - - - - - - -
                                                                                                  -
                                                                                                  -

                                                                                                  -

                                                                                                  File

                                                                                                  -

                                                                                                  -

                                                                                                  - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                  - - -

                                                                                                  -

                                                                                                  Description

                                                                                                  -

                                                                                                  -

                                                                                                  -

                                                                                                  The chatPanelButton directive allows show/hide the chat panel toolbar button.

                                                                                                  -

                                                                                                  Default: true

                                                                                                  -

                                                                                                  It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                  -Example :
                                                                                                  <ov-videoconference [toolbarChatPanelButton]="false"></ov-videoconference>


                                                                                                  And it also can be used in the ToolbarComponent.

                                                                                                  -Example :
                                                                                                  <ov-toolbar [chatPanelButton]="false"></ov-toolbar>
                                                                                                  -

                                                                                                  - - -

                                                                                                  -

                                                                                                  Implements

                                                                                                  -

                                                                                                  -

                                                                                                  - AfterViewInit - OnDestroy -

                                                                                                  - - -
                                                                                                  -

                                                                                                  Metadata

                                                                                                  - - - - - - - - - - - - - -
                                                                                                  - - - - - - - - - - -
                                                                                                  - - - -
                                                                                                  - - - - - - - - - - - - - - -
                                                                                                  -
                                                                                                  -

                                                                                                  results matching ""

                                                                                                  -
                                                                                                    -
                                                                                                    -
                                                                                                    -

                                                                                                    No results matching ""

                                                                                                    -
                                                                                                    -
                                                                                                    -
                                                                                                    - -
                                                                                                    -
                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDirective.html deleted file mode 100644 index 9843765c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDirective.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                    -
                                                                                                    - - -
                                                                                                    -
                                                                                                    - - - - - - - - - - - -
                                                                                                    -
                                                                                                    -

                                                                                                    -

                                                                                                    File

                                                                                                    -

                                                                                                    -

                                                                                                    - projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts -

                                                                                                    - - -

                                                                                                    -

                                                                                                    Description

                                                                                                    -

                                                                                                    -

                                                                                                    -

                                                                                                    The *ovToolbar directive allows to replace the default toolbar component with a custom one.

                                                                                                    -

                                                                                                    In the example below we've replaced the default toolbar and added the toggleAudio and toggleVideo buttons. -Here we are using the ParticipantService for enabling/disabling the audio and video.

                                                                                                    - -Example :
                                                                                                    import { HttpClient } from '@angular/common/http';
                                                                                                    -import { Component } from '@angular/core';
                                                                                                    -import { lastValueFrom } from 'rxjs';
                                                                                                    -
                                                                                                    -import {
                                                                                                    -  ParticipantService,
                                                                                                    -  OpenViduComponentsModule,
                                                                                                    -} from 'openvidu-components-angular';
                                                                                                    -
                                                                                                    -@Component({
                                                                                                    -  selector: 'app-root',
                                                                                                    -  template: `
                                                                                                    -    <ov-videoconference
                                                                                                    -      [token]="token"
                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                    -    >
                                                                                                    -      <div *ovToolbar style="text-align: center;">
                                                                                                    -        <button (click)="toggleVideo()">Toggle Video</button>
                                                                                                    -        <button (click)="toggleAudio()">Toggle Audio</button>
                                                                                                    -      </div>
                                                                                                    -    </ov-videoconference>
                                                                                                    -  `,
                                                                                                    -  standalone: true,
                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                    -})
                                                                                                    -export class AppComponent {
                                                                                                    -  // For local development, leave these variables empty
                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                    -
                                                                                                    -  APPLICATION_SERVER_URL = '';
                                                                                                    -  LIVEKIT_URL = '';
                                                                                                    -  // The name of the room.
                                                                                                    -  roomName = 'custom-toolbar';
                                                                                                    -
                                                                                                    -  // The token used to connect to the videoconference.
                                                                                                    -  token!: string;
                                                                                                    -
                                                                                                    -  constructor(
                                                                                                    -    private httpClient: HttpClient,
                                                                                                    -    private participantService: ParticipantService
                                                                                                    -  ) {
                                                                                                    -    this.configureUrls();
                                                                                                    -  }
                                                                                                    -
                                                                                                    -  private configureUrls() {
                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                    -      } else {
                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                    -      }
                                                                                                    -    }
                                                                                                    -
                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                    -      } else {
                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                    -      }
                                                                                                    -    }
                                                                                                    -  }
                                                                                                    -
                                                                                                    -  // Called when a token is requested for a participant.
                                                                                                    -  async onTokenRequested(participantName: string) {
                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                    -    this.token = token;
                                                                                                    -  }
                                                                                                    -
                                                                                                    -  // Toggles the camera on and off.
                                                                                                    -  async toggleVideo() {
                                                                                                    -    const isCameraEnabled = this.participantService.isMyCameraEnabled();
                                                                                                    -    await this.participantService.setCameraEnabled(!isCameraEnabled);
                                                                                                    -  }
                                                                                                    -
                                                                                                    -  // Toggles the microphone on and off.
                                                                                                    -  async toggleAudio() {
                                                                                                    -    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();
                                                                                                    -    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);
                                                                                                    -  }
                                                                                                    -
                                                                                                    -  // Gets a token for a participant.
                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> {
                                                                                                    -    try {
                                                                                                    -      return lastValueFrom(
                                                                                                    -        this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                                                                                                    -          roomName,
                                                                                                    -          participantName,
                                                                                                    -        })
                                                                                                    -      );
                                                                                                    -    } catch (error: any) {
                                                                                                    -      if (error.status === 404) {
                                                                                                    -        throw {
                                                                                                    -          status: error.status,
                                                                                                    -          message: 'Cannot connect with backend. ' + error.url + ' not found',
                                                                                                    -        };
                                                                                                    -      }
                                                                                                    -      throw error;
                                                                                                    -    }
                                                                                                    -  }
                                                                                                    -}
                                                                                                    -
                                                                                                    - -

                                                                                                    You can run the associated tutorial here.

                                                                                                    - -

                                                                                                    - - - - -
                                                                                                    -

                                                                                                    Metadata

                                                                                                    - - - - - - - - - - - - - -
                                                                                                    - - - - - - - - - - -
                                                                                                    - - - -
                                                                                                    - - - - - - - - - - - - - - -
                                                                                                    -
                                                                                                    -

                                                                                                    results matching ""

                                                                                                    -
                                                                                                      -
                                                                                                      -
                                                                                                      -

                                                                                                      No results matching ""

                                                                                                      -
                                                                                                      -
                                                                                                      -
                                                                                                      - -
                                                                                                      -
                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayLogoDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayLogoDirective.html deleted file mode 100644 index b57d4b90..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayLogoDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                      -
                                                                                                      - - -
                                                                                                      -
                                                                                                      - - - - - - - - - - - -
                                                                                                      -
                                                                                                      -

                                                                                                      -

                                                                                                      File

                                                                                                      -

                                                                                                      -

                                                                                                      - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                      - - -

                                                                                                      -

                                                                                                      Description

                                                                                                      -

                                                                                                      -

                                                                                                      -

                                                                                                      The displayLogo directive allows show/hide the branding logo.

                                                                                                      -

                                                                                                      Default: true

                                                                                                      -

                                                                                                      It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                      -Example :
                                                                                                      <ov-videoconference [toolbarDisplayLogo]="false"></ov-videoconference>


                                                                                                      And it also can be used in the ToolbarComponent.

                                                                                                      -Example :
                                                                                                      <ov-toolbar [displayLogo]="false"></ov-toolbar>
                                                                                                      -

                                                                                                      - - -

                                                                                                      -

                                                                                                      Implements

                                                                                                      -

                                                                                                      -

                                                                                                      - AfterViewInit - OnDestroy -

                                                                                                      - - -
                                                                                                      -

                                                                                                      Metadata

                                                                                                      - - - - - - - - - - - - - -
                                                                                                      - - - - - - - - - - -
                                                                                                      - - - -
                                                                                                      - - - - - - - - - - - - - - -
                                                                                                      -
                                                                                                      -

                                                                                                      results matching ""

                                                                                                      -
                                                                                                        -
                                                                                                        -
                                                                                                        -

                                                                                                        No results matching ""

                                                                                                        -
                                                                                                        -
                                                                                                        -
                                                                                                        - -
                                                                                                        -
                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayRoomNameDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayRoomNameDirective.html deleted file mode 100644 index 0eeaff9b..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarDisplayRoomNameDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                        -
                                                                                                        - - -
                                                                                                        -
                                                                                                        - - - - - - - - - - - -
                                                                                                        -
                                                                                                        -

                                                                                                        -

                                                                                                        File

                                                                                                        -

                                                                                                        -

                                                                                                        - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                        - - -

                                                                                                        -

                                                                                                        Description

                                                                                                        -

                                                                                                        -

                                                                                                        -

                                                                                                        The displayRoomName directive allows show/hide the room name.

                                                                                                        -

                                                                                                        Default: true

                                                                                                        -

                                                                                                        It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                        -Example :
                                                                                                        <ov-videoconference [toolbarDisplayRoomName]="false"></ov-videoconference>


                                                                                                        And it also can be used in the ToolbarComponent.

                                                                                                        -Example :
                                                                                                        <ov-toolbar [displayRoomName]="false"></ov-toolbar>
                                                                                                        -

                                                                                                        - - -

                                                                                                        -

                                                                                                        Implements

                                                                                                        -

                                                                                                        -

                                                                                                        - AfterViewInit - OnDestroy -

                                                                                                        - - -
                                                                                                        -

                                                                                                        Metadata

                                                                                                        - - - - - - - - - - - - - -
                                                                                                        - - - - - - - - - - -
                                                                                                        - - - -
                                                                                                        - - - - - - - - - - - - - - -
                                                                                                        -
                                                                                                        -

                                                                                                        results matching ""

                                                                                                        -
                                                                                                          -
                                                                                                          -
                                                                                                          -

                                                                                                          No results matching ""

                                                                                                          -
                                                                                                          -
                                                                                                          -
                                                                                                          - -
                                                                                                          -
                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarFullscreenButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarFullscreenButtonDirective.html deleted file mode 100644 index 240a45c8..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarFullscreenButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                          -
                                                                                                          - - -
                                                                                                          -
                                                                                                          - - - - - - - - - - - -
                                                                                                          -
                                                                                                          -

                                                                                                          -

                                                                                                          File

                                                                                                          -

                                                                                                          -

                                                                                                          - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                          - - -

                                                                                                          -

                                                                                                          Description

                                                                                                          -

                                                                                                          -

                                                                                                          -

                                                                                                          The fullscreenButton directive allows show/hide the fullscreen toolbar button.

                                                                                                          -

                                                                                                          Default: true

                                                                                                          -

                                                                                                          It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                          -Example :
                                                                                                          <ov-videoconference [toolbarFullscreenButton]="false"></ov-videoconference>


                                                                                                          And it also can be used in the ToolbarComponent.

                                                                                                          -Example :
                                                                                                          <ov-toolbar [fullscreenButton]="false"></ov-toolbar>
                                                                                                          -

                                                                                                          - - -

                                                                                                          -

                                                                                                          Implements

                                                                                                          -

                                                                                                          -

                                                                                                          - AfterViewInit - OnDestroy -

                                                                                                          - - -
                                                                                                          -

                                                                                                          Metadata

                                                                                                          - - - - - - - - - - - - - -
                                                                                                          - - - - - - - - - - -
                                                                                                          - - - -
                                                                                                          - - - - - - - - - - - - - - -
                                                                                                          -
                                                                                                          -

                                                                                                          results matching ""

                                                                                                          -
                                                                                                            -
                                                                                                            -
                                                                                                            -

                                                                                                            No results matching ""

                                                                                                            -
                                                                                                            -
                                                                                                            -
                                                                                                            - -
                                                                                                            -
                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarLeaveButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarLeaveButtonDirective.html deleted file mode 100644 index 8242f80d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarLeaveButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                            -
                                                                                                            - - -
                                                                                                            -
                                                                                                            - - - - - - - - - - - -
                                                                                                            -
                                                                                                            -

                                                                                                            -

                                                                                                            File

                                                                                                            -

                                                                                                            -

                                                                                                            - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                            - - -

                                                                                                            -

                                                                                                            Description

                                                                                                            -

                                                                                                            -

                                                                                                            -

                                                                                                            The leaveButton directive allows show/hide the leave toolbar button.

                                                                                                            -

                                                                                                            Default: true

                                                                                                            -

                                                                                                            It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                            -Example :
                                                                                                            <ov-videoconference [toolbarLeaveButton]="false"></ov-videoconference>


                                                                                                            And it also can be used in the ToolbarComponent.

                                                                                                            -Example :
                                                                                                            <ov-toolbar [leaveButton]="false"></ov-toolbar>
                                                                                                            -

                                                                                                            - - -

                                                                                                            -

                                                                                                            Implements

                                                                                                            -

                                                                                                            -

                                                                                                            - AfterViewInit - OnDestroy -

                                                                                                            - - -
                                                                                                            -

                                                                                                            Metadata

                                                                                                            - - - - - - - - - - - - - -
                                                                                                            - - - - - - - - - - -
                                                                                                            - - - -
                                                                                                            - - - - - - - - - - - - - - -
                                                                                                            -
                                                                                                            -

                                                                                                            results matching ""

                                                                                                            -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              No results matching ""

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarParticipantsPanelButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarParticipantsPanelButtonDirective.html deleted file mode 100644 index efdcf74c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarParticipantsPanelButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                              -
                                                                                                              - - -
                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              -
                                                                                                              -

                                                                                                              -

                                                                                                              File

                                                                                                              -

                                                                                                              -

                                                                                                              - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                              - - -

                                                                                                              -

                                                                                                              Description

                                                                                                              -

                                                                                                              -

                                                                                                              -

                                                                                                              The participantsPanelButton directive allows show/hide the participants panel toolbar button.

                                                                                                              -

                                                                                                              Default: true

                                                                                                              -

                                                                                                              It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                              -Example :
                                                                                                              <ov-videoconference [toolbarParticipantsPanelButton]="false"></ov-videoconference>


                                                                                                              And it also can be used in the ToolbarComponent.

                                                                                                              -Example :
                                                                                                              <ov-toolbar [participantsPanelButton]="false"></ov-toolbar>
                                                                                                              -

                                                                                                              - - -

                                                                                                              -

                                                                                                              Implements

                                                                                                              -

                                                                                                              -

                                                                                                              - AfterViewInit - OnDestroy -

                                                                                                              - - -
                                                                                                              -

                                                                                                              Metadata

                                                                                                              - - - - - - - - - - - - - -
                                                                                                              - - - - - - - - - - -
                                                                                                              - - - -
                                                                                                              - - - - - - - - - - - - - - -
                                                                                                              -
                                                                                                              -

                                                                                                              results matching ""

                                                                                                              -
                                                                                                                -
                                                                                                                -
                                                                                                                -

                                                                                                                No results matching ""

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarRecordingButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarRecordingButtonDirective.html deleted file mode 100644 index 96aee1c5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarRecordingButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                -
                                                                                                                - - -
                                                                                                                -
                                                                                                                - - - - - - - - - - - -
                                                                                                                -
                                                                                                                -

                                                                                                                -

                                                                                                                File

                                                                                                                -

                                                                                                                -

                                                                                                                - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                                - - -

                                                                                                                -

                                                                                                                Description

                                                                                                                -

                                                                                                                -

                                                                                                                -

                                                                                                                The recordingButton directive allows show/hide the start/stop recording toolbar button.

                                                                                                                -

                                                                                                                Default: true

                                                                                                                -

                                                                                                                It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                                -Example :
                                                                                                                <ov-videoconference [toolbarRecordingButton]="false"></ov-videoconference>


                                                                                                                And it also can be used in the ToolbarComponent.

                                                                                                                -Example :
                                                                                                                <ov-toolbar [recordingButton]="false"></ov-toolbar>
                                                                                                                -

                                                                                                                - - -

                                                                                                                -

                                                                                                                Implements

                                                                                                                -

                                                                                                                -

                                                                                                                - AfterViewInit - OnDestroy -

                                                                                                                - - -
                                                                                                                -

                                                                                                                Metadata

                                                                                                                - - - - - - - - - - - - - -
                                                                                                                - - - - - - - - - - -
                                                                                                                - - - -
                                                                                                                - - - - - - - - - - - - - - -
                                                                                                                -
                                                                                                                -

                                                                                                                results matching ""

                                                                                                                -
                                                                                                                  -
                                                                                                                  -
                                                                                                                  -

                                                                                                                  No results matching ""

                                                                                                                  -
                                                                                                                  -
                                                                                                                  -
                                                                                                                  - -
                                                                                                                  -
                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarScreenshareButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarScreenshareButtonDirective.html deleted file mode 100644 index 30755ced..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarScreenshareButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                  -
                                                                                                                  - - -
                                                                                                                  -
                                                                                                                  - - - - - - - - - - - -
                                                                                                                  -
                                                                                                                  -

                                                                                                                  -

                                                                                                                  File

                                                                                                                  -

                                                                                                                  -

                                                                                                                  - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                                  - - -

                                                                                                                  -

                                                                                                                  Description

                                                                                                                  -

                                                                                                                  -

                                                                                                                  -

                                                                                                                  The screenshareButton directive allows show/hide the screenshare toolbar button.

                                                                                                                  -

                                                                                                                  Default: true

                                                                                                                  -

                                                                                                                  It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                                  -Example :
                                                                                                                  <ov-videoconference [toolbarScreenshareButton]="false"></ov-videoconference>


                                                                                                                  And it also can be used in the ToolbarComponent.

                                                                                                                  -Example :
                                                                                                                  <ov-toolbar [screenshareButton]="false"></ov-toolbar>
                                                                                                                  -

                                                                                                                  - - -

                                                                                                                  -

                                                                                                                  Implements

                                                                                                                  -

                                                                                                                  -

                                                                                                                  - AfterViewInit - OnDestroy -

                                                                                                                  - - -
                                                                                                                  -

                                                                                                                  Metadata

                                                                                                                  - - - - - - - - - - - - - -
                                                                                                                  - - - - - - - - - - -
                                                                                                                  - - - -
                                                                                                                  - - - - - - - - - - - - - - -
                                                                                                                  -
                                                                                                                  -

                                                                                                                  results matching ""

                                                                                                                  -
                                                                                                                    -
                                                                                                                    -
                                                                                                                    -

                                                                                                                    No results matching ""

                                                                                                                    -
                                                                                                                    -
                                                                                                                    -
                                                                                                                    - -
                                                                                                                    -
                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarSettingsButtonDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarSettingsButtonDirective.html deleted file mode 100644 index f102b119..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/ToolbarSettingsButtonDirective.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                    -
                                                                                                                    - - -
                                                                                                                    -
                                                                                                                    - - - - - - - - - - - -
                                                                                                                    -
                                                                                                                    -

                                                                                                                    -

                                                                                                                    File

                                                                                                                    -

                                                                                                                    -

                                                                                                                    - projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts -

                                                                                                                    - - -

                                                                                                                    -

                                                                                                                    Description

                                                                                                                    -

                                                                                                                    -

                                                                                                                    -

                                                                                                                    The settingsButton directive allows show/hide the settings toolbar button.

                                                                                                                    -

                                                                                                                    Default: true

                                                                                                                    -

                                                                                                                    It can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:

                                                                                                                    -Example :
                                                                                                                    <ov-videoconference [toolbarSettingsButton]="false"></ov-videoconference>


                                                                                                                    And it also can be used in the ToolbarComponent.

                                                                                                                    -Example :
                                                                                                                    <ov-toolbar [settingsButton]="false"></ov-toolbar>
                                                                                                                    -

                                                                                                                    - - -

                                                                                                                    -

                                                                                                                    Implements

                                                                                                                    -

                                                                                                                    -

                                                                                                                    - AfterViewInit - OnDestroy -

                                                                                                                    - - -
                                                                                                                    -

                                                                                                                    Metadata

                                                                                                                    - - - - - - - - - - - - - -
                                                                                                                    - - - - - - - - - - -
                                                                                                                    - - - -
                                                                                                                    - - - - - - - - - - - - - - -
                                                                                                                    -
                                                                                                                    -

                                                                                                                    results matching ""

                                                                                                                    -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      No results matching ""

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      - -
                                                                                                                      -
                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/VideoEnabledDirective.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/VideoEnabledDirective.html deleted file mode 100644 index 39c2619d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/directives/VideoEnabledDirective.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                      -
                                                                                                                      - - -
                                                                                                                      -
                                                                                                                      - - - - - - - - - - - -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      -

                                                                                                                      File

                                                                                                                      -

                                                                                                                      -

                                                                                                                      - projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts -

                                                                                                                      - - -

                                                                                                                      -

                                                                                                                      Description

                                                                                                                      -

                                                                                                                      -

                                                                                                                      -

                                                                                                                      The videoEnabled directive allows to join the room with camera enabled or disabled.

                                                                                                                      -

                                                                                                                      It is only available for VideoconferenceComponent.

                                                                                                                      -

                                                                                                                      Default: true

                                                                                                                      -Example :
                                                                                                                      <ov-videoconference [videoEnabled]="false"></ov-videoconference>
                                                                                                                      -

                                                                                                                      - - -

                                                                                                                      -

                                                                                                                      Implements

                                                                                                                      -

                                                                                                                      -

                                                                                                                      - OnDestroy -

                                                                                                                      - - -
                                                                                                                      -

                                                                                                                      Metadata

                                                                                                                      - - - - - - - - - - - - - -
                                                                                                                      - - - - - - - - - - -
                                                                                                                      - - - -
                                                                                                                      - - - - - - - - - - - - - - -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      results matching ""

                                                                                                                      -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -

                                                                                                                        No results matching ""

                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - -
                                                                                                                        -
                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.eot b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.eot deleted file mode 100644 index 4b1fd0f48c9fa50401fa6dd1514fac66c0e92b06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112650 zcmeFadz>6qoi|*k?pc%^Aqh!HLVyqk2pB@Z5CX<< z8v$d42mt}P83si}L_`RPpfcj>!?Nh2vdF57Sr#v=sAMuCB6i;I?^N~7B(VGJ`@a7@ zpJ&pi&b6w}<#&GfQ!$=m!uqc>feE5Of1;pBJb{vZj8e;1I(fl%W7If*?Pv6Cu9Z#4 zws3;*Vc{a-eBm4(UxF%2SS_3@d`P%d*eaYQY)462Scj7B!X;=&t2$tw(<3oD0v|cE{ea zNkK607X)?bIhXB73jwxB5Q1-^UjEQomux$71W#gLFCwphXzNGMd#CT_w*?`-RbU@m zv-#Y!Hu*ol`z6%<0-?Ma1=6qNU3h*N`R2_R?%0|8(h*D@drAIIgYtbZTs*gJ5KGt{yu@-jpx^`=VQb8 zHus#-ex`rUp9Qb8DnDJ4ZNvQn;`SqdI`XWju9E=pkY92WHu{(HZr%G{wURV+i922hl$&qx`7T7oMj&DyxM%kjDPz?>@G! z7v;lv4tB;=--nT|-8+hOn(AmCXS_qeSjKrd%~_SVUq*R1j3S;H#*n8#Wos$zuFJ4n zUaKE>=b)CS_xXXHmI4cIw|*h#-THNJaMMs4>~oA(Fd4V3YF+&W69 zoibr1Vp?~C6$)c+o0;)JYKu7;7X*RQX*WLxm>H!s!k8O|XQanxq-j5mAdI?k+D%h_ z)E)bHtql2Lq(6&5F@;f#o#GKUKaO||;UM}>X)3Rk4Ig=r*A1g=)Genv3bj1N6o#i` zQ9ybe0r17sR9_2JPU)F3(!gpC%znqINB%HxchG%?fbwC4F(k&FHoQLV_L0gcjJaW0 z5Clq(A|Q!1pB~Hjk@p0GYkDWO8Af=R+PGmHaV=0?t$ZEQ6euq^u`qgc%*(0G2m--< zEq3n{evdN33kMO#5XPNYK)x1upQ)Te1I6y#j5%#t8u2KVyZJ}mG%s`TB7g4~%7+oC zoY%QAmA{Hms~bm}%4#vCN8Lc_56ZW@j&o zo~otC-8zb?ZrFtj#5_NOc+?H!h-)G3)(=yi3;ReP1w-R*`!P30{nY)Vbe|i>5s%f< zSd;xO{7^lW*Mi`tho{<3;Uq9W)ANjazCUX1M%+5ekGY{%Htytw2N93Db%ejE9o118 z<%bajgu4)Gfo^bW}F`-sB=9W+8fsZNuLE#>h zQ~O%otw`6xh+9taxEs=lhut*AV+f;y15cEuFz&{b9&z)-ZalM&(r)<_JlZqbkGS}J zRKW9H9B>fzV?6&h?GJw6%zc8oTAz6QsGFy9;#nvjoh}o8>cFt@tOJX*ZnZEqX1Zr4 z+|m6Mh7pMVk0TzVv|E-&{IMBjRQGKsFO0h7FA0JGj(2L_&vJPP;mF^J6Q_9--b6g? zwjXt46ayarPTVo4r3Vp@qwu$gd7YD=>XTbP^&Yh4&m2Wu3sg2UQ2Ce}sGQRK5Fil{ zE*6|W2@!=9f3ct}LXNtS5@dyDdNDGZu=vo!haNff*r5Z5o;>u8L(d%g)}dz)edo}3 z4}Jg8KOXw0Lq9t7lSBV<=%GSM-yVq)dQ>WMWI>n2X0IAh|>iL)j) zO`JDz{=@|n7fyV5VtnE+ht& z^E__k^LWAk>v??igXYmM`9(kT3)T^}M&-$D7uJu>zFV@@EpRKp7KUsgY{$Ran z{oeYW^`F*nt>0L`w*JF<-THUyp!G}ZHS6E3Usyl4erElv^;7F#te35ySULRqGM!E7m^iCTp*?+xob5opr5sjditkg>|{L)B1>YnRThP!@9)UZe3(uV4ZJm zwmxK?XPs+pvd*#2w$8LRT4z`rto7C@);epgwZ=NxT5YYeR$3=nORVFph1LRVzBSL9 zYYkcjtKaIgI;=LU)yi8rtI0}RjaGwIXC;_c$|(n>ilUnW0Q8iyLsPAAh>rSD2V&?Gh$n>IB)*!2C( z#>{n@7qfbHPIgoFmh8`(t>zn>A83BM`L&jK%M~pLbE|U?=O(#z%U^49Vl#(46z;+&JgWxr^tH&V6~v99l7S*U-=AZJGD$;mq*a!+VC`o`2E& zd*;8kpn1U+3&t0`woqUA6F^yKM#H&`1MY}mQs;2De0xc-cXH`*I_Y}|k5_A?(m z^PQ1JBe#wm7_@*6+?9JbT;Ocb)yiv)?%T-E)HHG@MgDXTdqAopatf zSDkbHIs4D~{yA@M3T_(Qv|`hX=Zfd{p1b|L#phjh-Ye%-Kh*r8MIYL;dBf%dn}2qG z|M_dqe``y8OZS%ZwmiD!l`ZdHkiKBk1vg&s)K+6_aqBf(AKQBH!uUn6epvqS;t#*P zExv8Rw(GV%we5|IgBK58eD=jRUi{F--@N$k?Yp->y#4#z-?}7u$@WWL*&*y0+_7oL zbvs_ZRKB$H()E{azbts!;ANXGd+f3|KVpC6ijO?_k@t3{ch1?ld*|nNKL645M=$&6 z*hioL=&yIFyBc<#w(Fu@W4pe8dGzuHm#?|}n#;$p5UzOd%GN8-yYjLt@451gtE{U! zue#!@+pl{2>V~U#UH#+H_R+ngPkn6r$HuRbuQ~0S+pqcNHLqRUd+o@zd#=6b+8)*UVzM=Pq1vl)x;prP*-)rn0*t==()1R_G z)%mHtpZepC!j0G6IDX^rZc=Y*y=m!9yKj2rrk8J;*tcxomVNv7jo%!nPKW%)v|I?d4{nD-at(jYw-g@?}7u|Z}tqv-mTcKC|aD_k8BjJEC{&xZ{pH4&3pJJMBAj zcP_Yd$DIf6eD|*KUFY3(`(5LA{qFAOyO-U){qFsDKYx#WPy0QW-SgaM!=EjFcG+h) zefH_kR`)0OuiU?V|26ynVgKa4=Dof5F1h!Pd!M}by|K+>`^SDU_U?W0`^xvNx$nWx zr9S`S{Y&rPfB)-WX#K+0FN{5qdtm1SFMKin#Wi2t_2B9UuY2%?FSUPZ+m~+t(wh(2 zUq0~g#)tp-m6cz){VT6LVn4Fsk!v3L;a4|)^_H*x!=w7wl3!c%wO>Eh`q;|HMjw0O z@yz3ck3aJG#DN6|ZanbECt9Ca_r#tjUU}k=Pp*IRfhS-1`iiH*PhIrX*i)~3!~90` zH`aXPu5bM8>A|OWJU#aGFP_=_%-&~S|EBrP&EI_STf^VF_1nU?2fn@U+4g5IdiIfL ze>ff-Upl^X{2>TCq%FS_xz+xF7*Qo0P@x@F6)TdHqAyldCPyIyk2sN#N< zZnn$tLP1zVGZ6`An=*8Bf2A}e6}!cJDc8YJQfNXQQd-24!VO|9 z5-sFabiTiw@0RAW;t;Epsihig5bIgkVr+$FRmUw$^)jU?TUVFKD9o!`78|xK#hflP z-;reXVO5rlhFBn!_DHhwaYd0l=}=vp<@5V}8tYz=h=pT`1>H>Z`;IBdC|<8p*X*;6 ziXKe*WL=ki$)H~G1#(BNwI=w5*z_t?ikV0(++R|$#yPCDGxz_Vky26H>$Sb^tee5$ zC4T=ZgUV=4WrQ>vhx{wSDl;F(Ga=9vXlg0ubNO6GQ#F+qGZyWylq=;PRtRee)zjd@PsllO;*+OXrfEPO3wa zS^^O2z7i|v zF@8T%<$N(y%4trzht*Qkr8%{cX)2Z~60P*lW3m4xjd|xyqL}$uCSQqa;jGH~V_L3K zER_iot5;&n)E)YH=Sg*w_-8wMPI!+h4HI-^j zJ>K#K{UUTk^e8;`#6Ya4U1Utk&&Pw< zFdoDnhZc#?$3ftOF;1T{z@m$UhTEGyuhOJV2-*+YRgwEC3`C zi%R{KJWvK8muJznGEf6YCUgOgh(+=-JSUHN0M^J8ip}RL4nipxA{h(MZUm4=u`vi8 z$FfeNTxCea14>jwFJnvW>N~4@ca`Q{dq%d2Ni1Zu;#7J=rR$IBzBXGzg(vK}C*9v> zs!lps?)q+Kf!%7`n%*eIJ({8@VzSN@J*FMR4iF7hwxx6#)qw_C7MUnBF_BXwHIT48 z`+D&=S%3b}8P|FlQ$16u>L=5G?5gyxjOth*NfwXqD)+65s5Hs4n7%%f!F{J|F~)q7 z>@x#sFsrlrfG7El9rgWrz&r}w}o;PTKc%)%as5_l1C5y-`) zC~yd%^XSr+qq3-_rtA`*?^a(kg75bFhPg;>0y3W}%W4`cP36*>x;2^HiVa>?1L{H* zzks^P=d1p+s&+||JzZ$a^7`qVA4uHe0S*T&$>dqU4ncQHyiQ1fy|n^VsUcLNpe%p~ zkdLS~#PT^pokOgfA?{`t1B$H079*PCAWA2JE86xj>^-D_8-Era=KmgRS$M@2SLFD$ z%g`k)-WX{#JZi{jG^9}2BYB6tQjlVlN=i_b8pDlIO$jPeqgM%vDoW9WDx#Wk`%r}c zJEitWJoqIX70?a$))#8Yn0-_W&($OZHY4J48#|&H(#?D$Y zO}%3k+6P!zXGoWYJy7cMTlGy3SpK#?S@sywK%D}rVQL|lHTY_SDaU-8SY{GH z!84R<@M)T9+oq=Z8cqWVwpKGe5NfIK)QfQL<53g32jobVMLiK3 ziub3bpvPF?Q<-0j1wBlX6hj1QlQq*y<~=f#K+8m3wBxp->Pt;M-O9w<`XU&!D5*-F zp{RzI!+wv}l^3WPyumAF{GF<#hFa@n1&jv6(==IB`?@?5(>oh|wyOI(&>u;0Y10^J zlMg(19+S}ob{lB0iPI>pKN0|jYy#gJC>CPiDQSIab=f`D&2rFUBUUi32Z^B!>c3Mx zOf)y~D_bImtzgg!%SpZZE~S{N-)N{Newc6KZx6DEfS)}=1hXEAWizFGDOAuR8o1d? zDPQQ1F#kCp63@A3^Iul6vsTR>5%;mLvag8DehLmbpJ1D5-LOAhUfvR-0<6A6*mIR~ z3=|tuL%-MUvrLXH!zE!Jyma1;Fd}nUrAjj0r`!?fuFzH)$lFtV|P2Fhv&fLt! z2o|TR&F*{1p5YUM#IFXLB7It{4|JrjlJASsIRDIVO5MIUS*^#L< z^m|&?0k+AhAo03s(w-g0dY6cX|jB>C`k`U5ag!k*yUeBgs3sS#6i!)wysUG z=yEWh_gQE9%#A95+~-@l+PaOu<22qY)@h;A+Ni1)t;7L$miY>xzr@E|>e8Kb5tAWYH2v?#<- zf->1<Q;6ZDTlSLpub#x zt~`#$vI1Iuvd3fSxcfdlOcuq}$a?1T#~;-fJSXT3R>hLjf^%U!|JC>1#zMzF8e=-D zKNtxY=QaMEAq=pQeUA@8H$1g59CAlF7yWUD>GbEwLE$&R7jp$6L@Q1*9Y@nxcM{%W zoTmnwCODu5;HHt}yc)p@XTqrDRlmpM&$RnG(@n`#ra75xjwds=KNt-L?075~h{w{t zOebr!pNjyAq|;4Ze`|qQ6>s@{vN>C~+qQRG!I1Cw(SU6SqJOJTCVCs6n<0Z<%{Bp} zwSvc4hMrQVoQ<6&0G$oogs%4SGO&x~QXhHNAj5Ad=57*>-8Z ztV(armlaSz&)}dZsL!9*&2xHds~*$~4Go|TlCH;My3M*}W89EMxoEGnOVYN}=YzC* z22MVCz+>z4a>NtR)PHeW@_V|eIo*zaQQua=RkN4R_kT6l&OA;} zZKZtFJVL*55+=*QTt%ZEkABo-73F-o&6$sAHbd2TrQju7HhT^2zL1k!T3#FuSa80_m( zJ$G)d{w%N{v^luB`YWxgz88ttH~*_{h~XtLIW7r{hTaS6DptvZ4SJ9RR7*b2|l=Q|C^rt*DuHGIQ=<#PX32)ojD`_n;y7x z@n3huodxO-&4Ivm2MQn!`out?63Ay;!m3tkVEG295wy|}gJ`<;f(zENbbUNtUm9M! zcDQHu>>eg;tB!3OuJ84J&Fs71zxDd9{w{0vd8@4&UoZ-OCV`d57$bgWL1J^X5@7an zd1wv`O$rcL6A)Jg0Ku+=YD<)5){=ZFne)W-#sssfubV6;YSjsY?Gv$?G@n|1A(_u5 zfpM{^Y`flA-EH5;Oae20yvp)*jR827#492ys(3a zgiBN^^awEU^(=-B04;Q(zucSD46oe~_Jvh{#5N4gP6Zn^*~9E8#1#G4hQ)$Vt-cAi zB16!fRzywKUV(N_l;sSo1$HYqv-%i>4&{7gRy{B*RCe0JRpGHEOt&gSyOaI0FT2(7_9 zhLz?*P6q6qs&z1`c2_T^_7^iz1k&pDz(~Ns-48AqlZMG5E`%%j3jM6L4jQ*)bL0Fu z&50JsR*j(3TRv&9idnDgjlH_w+gP8fFyk3XnjMd?kHwr*Q?>EMN?@vN2~~X9#Up(&u1{m!^a~E9JvFdHK8&zVm}# zH$gwzja@Sco!|yx3y$9im@4Q3Ir1nGvcSrLNdw#9GSB_ddR64qV zXbk)tSYs4a%JabPS(4T*SB9iK#D7{c6hb`!Wh2--=!nWOH2r5k!**bP$!E2ktPwsC zS(l=z#vCTu^L(Z{iz!T0|1hX}%{i#+(4gPz5?L@4ki_2KG*KMVHC^kF3;v*Hh(Q@k z6J#DOs4BXO&dilrAQP0>;l8w-v@>BQ`$J8kXiuh4SGspjDiBarIT7);Ez={OR$FfH zM$(w#WA}pWqMp2?JjFa>lAz+vaddvv0@)w5kR%Ts`2+a7eONIeP;~Sufw1$SQV{-8 zLG@Baxm0D_h^47sr^y>6X@jhxFA8iNzr>jD!^#IBuh)}3vBG8Syo7a%g`i-FYI!K} zpt*zcAqQn1skW<7JV~1J1}U5#Ds6_rYhIy!ov7|cT9$@*S}~zHV%I^TWLB%E8uC9r zx#VI=`odHS?i&t$U>my%?^AerS=yP&4~QzzNYU^a%_W zS4!vd0(3DH>I6lqL{6D$7|PB%v43v8Le zVx$3BPW)Y_5Y?D2NoJ!}ujwE}TH0WmXedTzcIRf1EPkfKzV-<2 zi67Uz=H9)gR}-U#+1;dBhGD5qJ*E+D(G|aDMf`EoG<|V@1m1Fr-essQEvjLtii)36 zFrraIOayw;!;5qX^+2SCq%eKaaJnau(6ykQ9+=e-lO@}heE05&v?#uR7$P@Ku3 zG4!3liMR!(!CanmorLaaFY$H8jPNGx6g|>XDz}6@J^OwbSdbs+gn3Lc>}FdM)kp%c z34Np%42#TfNT%gwriuLq1%zy9O2`ueMq_IXKNG_NO)}6Ls0KDS2@f#942e?5to(ui z)R~@8%OY*>3TtQc=Nzn87phOsUvieax`mD5eS zq+&BL*$8-4#S44mg?=wKRzMe7Plp|55^lrIu(TAUpNicXQS^kpUU0PNCB*8cvc=gf=qN5MIqbD|E|| z5U`^NW_4(AD+-p6K!JTyQ+%RS*8m3!5CG+yW^>Xvu4_uXCz%mpR8qTuIC?}@{W&y4 zhOQfIuA+wgO?3^rs66jWHk(gCqh9H&lf1B{FtJC{+25hrCM6p5K2<>n{@V#22Hp#h z8KLdZL^yXnj}^0d>LjFIhmvzrdwOn!TI7@vJo@ne(|HSlv7|+ z62p=d7S({Jv`F$Uv7c9;CC)zxf-16GH1ADNTz0E)`cscnVB`_So4ndBa6AD{27YSA zoXr*%!WIb6bd6R?<3bN`Ejr`O9`-)^=3w6pF>y{oi4Xu`0thY=d89yo$h$FXZBU|$ z4WpYOOHmOMDkmj4AxcTfRHcX{du%bFM3jb8FFW-C%WAf)0n1tjQ9;VJt6@(nrF!Iz z9<^OD)Pky?Da&W-NEk{xW&CyZp0L`U8$9{s>f@m7x(R%Y0FM}S6DyB? zL#&xfqqC7P6s4tN3k|8J+II$s>(pSKbe7#0^!b85xjH5z!cSzI#OfH7{Hzs9{-|u9 zZDU|`eaq)L;PLr9sw}G%^9=Tirf(#Qyb&%Rw(XOhD|99JW5d8vWNYYxwqc>LTsRd6 zpM^?;I0&Z<^Z+($r3}6a$F3T1=HH3h+q|c2K1vsWFuKVZE^5vg1KZf9n;XBpXp-Q5a(2Y;7R^Sd{wfvO5~7)LCuBQluL41lIck2 zoXv#GP7GW_G9D~!Y*qLC`Q5M6WtNf!Xg14;z>g~1Y;Q<6he+)b^4fGQ+uj`O9@;oO zym9EGQ8eQ%=?0m%DZ%e1cd|+Ml~EAFLK1&tLoc`u_M03y>1hw80wbzP8y#ze&O20v zRJ2XNLokwZLaMR_mcROUz<*PHb3>|Ajc3y49HS?avLliS>toP1%=%Q$XV_{d`4+JT zZ*P4*Ro4*-C*n=rvrY<{hG9M==8~bHPlwkP*JojWk70ku0bPp#Ss%iTPU}(0(T846 zF<7tZ3gmflxj#=*GWDJiDRi^c5VBW{if5M6mWt8^;wCl~9?3Qj3_t;kozT;R-5^Va zY!+x0cDz(d){TQssUi;ypiGsED3zh2mC?%3ORcF)D#P}cPFPyP9q@SR8k*OM+hw`0 zskgTYT#X?omnHE6J=%Fyr;HnAskHQjk_^jdH`M^^$h;|tt*<`RZ2YHX{io3kO9F85 z+eiM)u4UIkD-Avr%fc!DEQpLC4?udv3lS;|gDlX$N*RM@ms*By*$wkgDE48qh5kH722e02pV8r%-yMsDfsqQnv2Hb3{ z1?SG`VcX-W>aUwR*xU>zzh`~~jlc&hYzrD~4*05nDK1$(Z(dW1MH-4lwxIiX*zE3*j6~XigsF%93~NZMMB_DNnzotW|s88d26M@3nO<(-=CfEemFX z{tfY2K5O7bt{xH7X`3e&$LkfP-qCRhWG7W1#bjX-gY_elg)KH$A}6*PxDlcRI*3ug z)ERZnp0~gOoh2Shm@#;*$HIYV06*QtuE*w0r+1`Ua}8FY`nDZ{*NG8W)=YMCx>TqM z7=Ib_md3h`V4u5QnG7~hhl;RL6NxG?%vCakncQjWFJ{Rj4)kIa2oaWbAV{Qcw5d^;Odk`k|G~a;@H6(x*fABYX6eDVn(UoI?UWAjSPS zf%Gdb@~_3<$WF5&5v%%u6*<)}ik9(TU6^R$pv_S~c46(-h}9?hq3WZ{`5%z_$5d)F z|B(+8a3s-Z@^NhBdb)}*548Fu!k3QjQ8`)%Nt4NmbnKYk*I@71(ba6P>@lbwH(+Kl z$2`7?cX&5ldpN%VmIJ?=7xeTj=%Eohd0fBS*xA_FxgnM6h2n8h#CnYG!R6Id>Yh|; zADZ_pn9bAcsUbWj9Q^O>Ck?t+k{Dfx1BdCt1PueM6E-;%kH9iWlm83Fkh{PR&tuVi z7&14k-dJCi4ReRKa0AKm01J_AW$Z-QybSq7CI%Bt%~6z{h^)tRB4a&DCArGq>;J6B z%iyaN=KgTO@MFYy{2a=;iY+Zf7?^u1hgQuGpIcA~mv%t$qe7G?pD_|E+0{1F`vP=tqJL=+)t zY&y=2&RTZ%aXlSS20_^O445K|!jns$BdaZ4^Wnnc!Q)KNahqhQOPqBPTwlXFqRZeY zruGf(BNia$5JlKgd0HIT>7Wehj_^J?bYT9+>B<)A)#rin2lN3^+zsuNG9XC-usof+ zaABiU?S`?>??*Fg{vV>eTcL(Q#=0(N=oRJ|{TKz`=ZD_yeLYeL7BHLe(?xeUbR5+Q zQSMP>@k||!{_6H2pKhvvR zIC9MB&iQYA%ahYG;RlS-kpkHuq|ReU=Qx(9jvW@s_&UE37*Z_IKV*C+nan1WuPD0hg%rsa2E8K0cFPx%T^r5_=$jXQf!)G+pl?Nx5=SU0 zaZ5jlEO5zeGV?q97&fUkjrgYk99Ao?BgD=n!t6W(kdDWpik>3oaD@~H1<)M(c^khc zE%6>PXu&?^4@dmED0aanU~0H{ZzD5*^gbq#b z(J)I^oo3Ff!M%i3_S9wCp8(?b9e}8tvZZ&cQ^~?isJ+3pnR`n;)WWg8A2A&PEFz%b`Oc9l)QYzu%^%mVV zAH|vzRqS!C&c|XY?&E{PC=gW{QXrO-ixZqWPD$O164`8``VL)LD<=9Kj<<9xIENHx zFVO{I6X@a?+C9bFElFgnSFj}<&pm}Jh#~wV&=ME$<*uH9-;WJkw3I=K=PCDSK~HX3bOoNbVp=9Qq&{`--CV~?=U@slx~pt*N)9y;r& znKZSV;k9(ugE;tdzN{eDpz7g!pIk1d5)%9ku#@`XdJnZojI>~TAl5S z>pma6>4s;G#G&Q3>Z&&cK!-!BdbjDpsgu+B^(#z~iG_#X2~_K%jm-wN9u*KNg!xZ| z%QG27WG_Sja!d{xBFKX5lS3dx_!B*-)u4d_UV;-MxjH{SB+XeZOMM-Zm>cL2*<561 z^)io++kBp@3~Mgme>sx_)>{zy}@=E!<` zT{w`G>T?-6>NlFhb%Y~`xTQHiey*@f*eBd4JV9_k7!fL6@F;}f@_aD>p?FgVbINih zWOFcWapMC?w;Y`kzvDQvP9s+w>4`#VNDXMkxj2k{-vU04ONLMYlNyY3NOUhL#_=jV zr~#Z3Hbpc>uFzD*nRIf9Eft*%Dcz|BuI!$uA(Jn=s17U4v^=u7xOcHAd!Q3m=3@yY zrplOT30gC(Oh^MS1?7z5^J~qSp6*PmWcxxQU<2}W1kP`0CRM* zqSdGCni!PCKsZ^C1&b<7lf=4Ly_V)_ZAc^=ntdQkzFV%8k_}NmoT){%PLwpJMBlQ^ zROSq(*d)V31`S9^vaa4Cj}3?f#FCDW7T*Afv>8w@k?0O?m-VWmyi_;y9o;&2uk)n6qXU5=#la!gLY3S@S|f zGFD*bc2V4pjb(}A$Ot4dQ9kHID6Lgos|=~SI;7}0E0<5@p?tuE_Fag(E)=0Ayo_dg9jyh`K4kz}(<8i5g(4RG0JXCH(pi)BSZvB3}Idp`6P#vHS*7$>Qhm)zjk;V6}Pw zil`_$s+<<(1Lpmz+5$|?{0Gf3%r3P))}|Q~>gd&pUXpGHXsRU(=Qg;v!NILi_ndw9p0nTMw%{*Q!MdA~KYPz!juhQzj^de7@Cf*7RtT;P4hjLtb;JJw zYXosci{Z!(l`9TSCZzSnhp`c(nz>z%>DR(Ix3=F(wOT#B_5G^uQ4QAE1wpe*VoM*w zCNn>*X;`AopTTwh4xU~;X3>sPEV+_}Pu*vQz}*cpH47xE*hLXLbLYY%s7;JwR*YjJ-*nsxL~ z=ojY!$&&37Jm5SRFJb@%P)sh0QM(YY0AYkHNG!y~HpgD4!SfEx6qn5a& z!+l`lkOaQe8rhWbZtM9$J)3A?%mP7^6w&JUK>^(C*Ku;j^5E=D6KK>tS`aD(>;HQPor<$vQiZ^QxlNDHL@qi3~?ZIxprd$Ak!*mxZLcO>Rl{fN+p^W~XR|jv)zIG1(7vQKbyuOl zgu8Y+&vA7GnsD_DUJd*+m^DHwU}?ZFIaUL#8<^};jtu1_R%4H1$#9g_67wodh+u`I zV1S5Usz6Cp=Eg#(iNNz=L5C#p+OTfoPG_S-f}qodwC*^V?Q()=;u|_!mmXg(CG<=T z3@#i!MDo?w;oJZgJko1oR$wPbsU*UzZfYs53+vBRDd36Wv=i}D5X@x>Qhq&51aiV- zhrMv%0V|;7xfu5@;zVl=ic+gvQ2*xMJ4RxB0Pzx4(VFQw(E35OyuIRu&Di*b(b zUF@CRz=1(n00zhc3*-%!(q#&WcZFh`gnh{WoYmxKAhI&>qkHUt6a#3Wl^vCUb3lTt z5Ff6x;xt)MRBku9FS8E1BG~WvM&U)wk)Z1b1NQ1iV}ih9~r~041xV zHT*XY9AgP-;zhWQ6i5W~fw`#Aku>CbL_&$c0}+W(;|wh;EEABe>Lof>$9AY{QdM6N zaqbEpKrj!9Qq+(nuM7t2C+t>P%*2lf@oYAJNRd7b?pDfS@wT`(=}B4qH);tXi0%R+ zVbx!ERkvrgw9M*Vz%EHtQD?T*)%A8RD%E$Tmk%$mik+PcoVmwWl-VuZCJpY|If3eM zwdGhyC2c&Wo74|l3s-0(1uwu{iG5O09#_@J`89|Wb_Wouo1FN7%!Wim+$c#K5v`J> z>e<-IGSMBh-vafl9QF!dQkXNurT9hkZUFrWhpgci&kIH-IDQ;35E?2h=}CBs|e zEF6DueAtZd-8a7eg2X+&54MhBj$lg$JZ{Fl9o%DdiLj9@pB1S3M2D;pnQ<5l!e$%? zmF7t>@B{gJ)qvfIhbqKCjkIDmMh0oRo&STzo={vFOb9R}ZuzY@B+FL7 z^n2BGtS%G`hU#Frh1pYuVCMHr#&(|;@@jLR4_o+H*cIt???SIPq*&+o0BNzulet_H z=V(-~Uoo1!GCUfYt@EZ|_D3YiV+7-wa6>da7>;`3f1`RZmr)j$eRpYrcrX<>?P1#l zixJ(CmQSxs1sg2+Q}gj+Hm7~C-R}=);+oL}dMNuO?>SCOf+^Uv;8RRGM-3dSA3Uot zk2OU!Fs&gR%g_L=bWFDwAG#eL?PzbmyP>P$w_Ocgx9{3DeA#7e>9Ez%-GCo`9URXB z%!~u41;E$Q8496=%iz$RKp|6zMR5i^c(e+>NhH@?a$bNY9?(=^!^)G29EB=l13p3! zmA69|RozA!DYow=+kRO#t2<3uh1aF1#Binuo=caZ#aq0EZCKS;?YMls!<}bkq+0NqhUeSfdrS z0*OQ*)7O`&!>JKIr_=A{Upc7Z#Tv(2!wR+hL(7WAWyPiGcsw2N=B(U(8y7CzxR51L zTwJyS#qsn(j!&OQ@xqNX)wFig?+MXK%=e9tBoBn62K1|T{2eupZ(rF4v4Zy9J1`0D z!TyKdGvpp00}}^rSUwER7N!Pxn9jdKx%`su)x5?sud*i@8VTadf3T8V%UZlTjyKKo zSPEF?!(0Qo(h9=nT@^;y0+xm)FeY?jN0PTGcP)k%4Z8|hgkyB>89AMG3^A`QOfDeO z8kWAd42M!xZ5VD(q!4SCq|eYHRd9Ep&=Tvv9)^)W9#;p!J|cCWWU1PGNs6$=vUHEC z&X<;D< z!=`D7wEzJ*RL*e(CECvC8atz0;HrOY5M&B)Afr0u9OI~a@Q3zJQ@;rC%@)}$;BMfY zASJ;Y=^m;2OC8RjNeN5~k8krq&5qO8%7d^{Jqn}NX0HDo<*Rj_s#HG>h5TmwhheMN zf~8AeOy@3i?778oiB=Ztz81Qg9om>(q#<}Y$TutUx4`<#(aUj#je3(kZ$LqO&6VV%PDN^i>IBwY18RA z1~4rr5xphPj$?MVaxB!d*{{5E6wqG)kf;7Z78+wCz*xW!A;)SmJ^47e1{FU!>R_c{ zkn3Q;ikadF_mtw713fr$3V4%`L)>%Vo>{f-6`)&HF*3cNjNf=*Z?1&Q@yd9XZ}}j<29{AmJxrsTnbbQEElJ;%q1Z9QLu7c(WSs zH(BHTF2$FQE+p2E62!p$gfn<6+{SDZ=jhx@x9V8lZ^fn4yx*lO_!|5(OS4BI$8!n3 z0tG0JtP@8-JQ}~|O8FvmrO?Tu0Q)>gR-7Ku)rFyq1VqfRV{+zB$-nPD#oka-sK?vC38E~$q%D%^T148RzcPryu?IOSe z;}QvZ<%G(W82V0{Ua$-?V4!G=3Vw@RFES3_6;uynjH@HyPpTK~d`rwRLxUy@Ro`Kh!#~dbSgbp3cz64b|gc38jA~Wq3kzhZ2&Y zH-*oULo4W{hY;m3Rz5Q-=*X3<%cC1-5INO#DPge_;4Y%|T!O1O=q~^ss z+?h%yyuQ|cr?!io(l&c=4ek;M1Gs&TaUZrV(DC0dd`fHw z7L?FXfK$Ha#G+d9cnR5G8PaT#vR-q!F|2}z}Y;^1LWF`3VKikf~`h= zn7qV!8_C1~=i0mSxYzOVqZ^&uVmKtj9}i$J z(&+=X${(V_$y|@gnksp&f=SM+V4L}(HqPEcQLpM^I2FM9hQ0iKMoNq2eoTMS3rY00tO2KxQQV4yI$x*6K|_8EM^>NFl|vK}-lON3;7xXbeu8&|4%4A~;Qaxl zobe#9Hujl7JRUgj^XF2;E~?(bc5vd>+RCHqZ{Kq32i4BK2-ZoYWP7S zF&@HcUqJ&8nZ`RtKzZn#=am0gxj&py$o~V|y&EJtQ%kxUCSWe?;s#dxC`FCyuEphJ z^vP>-Ikpi8QdKS47HXOupPdeMBs4W7+kt! z>7){+}vmWjnO5^p@fughknX>EuP!v8FS`Gi)_ zCQcN>CuWdV2!s`j)5A;;yUb&%cPKus;#clqXNG+^j(b2ccI$?OQ%n~a$^m+o1G~!r zyX0Fv?0%yNoRx#;;r#0`SwLmv55g7sgt)W_Ckhq%;6~0>!3S#}XLG0QKL^{=aU6m! zX6?qd!M1>n&tClDUspKE;_3S#Iwdl*`E@@f6KtfdK9N_NQz1hOL|W?G+Uk?x zfby`6Z}?Fr6$&U{O6!^(jw!iBeUaZ(y_rXo{5c$U2LZc_0lAP>_}4Kp9s)1^Ne)iT zqA}Gm7(~emA{dnVT- z5G^1;#*2t2BNPA8QwBmqtQZ8z8ec=+2Qy|E7GnC438ozD=pHa8-k;N%nwRYhvo&oN z5R>Zhw4PQ7;XJfEsUEZ8)HYc+oylMqzOO<)=FT*qwVksykFE`Zq4KnL#oG7Goas-r zhGMO7Za=_h_LmA7huuZ^L_QR!Dm--N?Qc74;J_8(#7^j1<`B=sPqzShkn=-6a`eDw z%o8dKL--z%V-SPVg{NxUlMT}Q@pZOfdQn%*4$g$Du8u|ZhLZmp??J|aCLfP}jb`b% zFFEg17(w0pV5%>$sLmTt|H!$e$nXEjvE%6Dr(u?3&v3~D4()z6V-(mQM=vt|6Qt41=-NCPXeLP?ZN1uN^yT9qZ#Q zYQ+Wb6#(ylegAT9`9L@v2zmp`=VmVO{SGMCM=Lep{x@fdJNYxK&p2xgTIbU55Lwki z_~I`AbXOC1Ip!J-23rZ1JrGX4@sei1h{J|$yZSI3z}d)fk(|V5^-I;v>~R6Lqnn#Ye>~2Id?9S^%pia`Mq{~AQkPe3q|AInfkcT zT-2m22iv$6!K+QEAMja*YbT zsFoZ^d1GnCEcutR6RffKIosM^Y0oGZ4zziVO#5YZCN(KrOT{JrlETo$tJG&Y z%Iz7PvBCO*D2}n~z+b?Z$mLb0lpy4tgO77$pbm#02;0Ox;a;Wd?-THZ`*(jrk?Z{| zolQJQg}9ul1g&`3kQILtx&)GC@l>oSw4ims_4tB>BZ!0GW^oRS=) zHi<9SZV6g1|Cep2Zl<9T{QsV~ol-2w+;ML`f|UlmR;C9-RTV$L-awHV+@jtvNpNHpKfu zY|3T;pIojY!y&{Vs15pKzrv^TlIFlX)6Bz1t|f2aD}X`q8Cf2Hkv0Qiz=XTE;Zt-Y zqN*W92{YEKro-29$!Q_v$vA+3PRc3^^dF#0YGwAmF`2TEY)s0X>36^i57 z3?82|ojE=?(Yxcp@5O`F7lX-UkQD=o?*-%S_A@qq%jt8W5qu~V*9(G)2>kMctTPx- z0JR7Gw!PQ3b1Yz5&{)!ygC{>zJ`7#j0J1f1oir-Ww@RGvnsG0TFhSb~rC26tc4P;= zVMX@0B-2u(9P3D#!RdeOM4$ejZAEx(d9sapIRlkUG#CFloshfQ3^bHvzmY|MsX4Wu$K*;#E zuB-QiJhSn;lhtoQ9Iz=?4lay;3L^p1IE_`WF;EFw8#;pEi$+0vk|S``z8z2rGpQ-qf{qI{OATH9u>L72s{bRk(RNXkTbz zxB0~25h1$XzA__vtA})5oCPn=kF!zHy7=mmmrW>XM?}@}e{;^!1jstdHKh3PIrl)s z@w-w{c7-^2K+@EM!y*ipp>c4L4#AYrSC&>rzjpbP2~!aH&RD{u8s)XZ@h8)tony8p2dVO z&q~#&9-B35`r^wUI+;ZSt*ryC-)*!`^+nV+cd6G=ecRAb8?~uE z=;TgAyViko8r#(vo^lMV@spu7Ep_db1tfQpw8&QjIMng9$PO_aS;Hqk!K1O{OyBh% zrLw75R!YWgZ(M9QyP^xDxnbDOl? zGpthNld6W@E)a*|Y*aOdMJhUz^WC5s@%V<&hx#mQ7V-Iwcv8x`^YNsKj{*eO2I^v| zhD5^W@mqFE*KLj)-eUIyXQgrCvKKP@6mH<~KNCBUt;cz-BNsR;L_#_~C|ZKOC|1gn zF^25|i3(O94a5_HZn-6y2^j`H#ndAA1x+Bbz5IIRr~5OVzq+6^)6WJI!9NG%aae=_rS|72h2YY{u!r(d)p~I z04h)fnInA*4jmHhBaI7mz@TLfWMs~jpxrK%V|2EQx5_&S{;?eLIi^zQwitIR#+}S zxlrRleFoLhhu}sZhT^aVrT9*l0k7aZ4&;K*UDz&)__e`ZtX*uAq`WBRBq=9~bD*~K z;S)McYZ0aJaj?JPqY-$7=2yLv*r6zB38E>oC5mFj?F9UdV=LgY?~B`Ue3}Q}_kv#x zK5#L2%@Dk5=!l4?9X?TT<>5Z!3;4GMI5Y zjM<=LCh)-bx0TEP4`=TIAlG%>ckg|D+M73hcG}MD?9Oc8**c59Sb!i%g5VMaL9j22 zDHau|Q&d}tw9HQxmTgf{pU!_uNzd=YPhMN!+H&3U#D!p<_OZPhkE=h$%GifLJ@ z^9;Mg(m}+><}`I*(TiMJyGzoOPJloS5gGFWaWPqMjP)?q-k3iK8tHcOc{Yep(fTD8 z_p`VJ!MdL@lpjsN0pMS*)y;GAu5R^upJy_<(tFf4KV}#oGwt03T@2$iz`G9`*@R?+ z%KMwqX~S=9kP!Fm-+SKQi>@Gg=vEt(zx#jC#`I?f?>$KV?Oy{G^ zU>a-*5DuyKV$+s-9ixlQSz|cIuwJkW^Gjbl0u1fPJo^^wl`}N$v`LR1w0x4HObA#E zb5|@$y8{RPN(`Meh^16nC1Yxw1*i9ir6jw4*LHi)I%)MfXR-F1P-;0KBiw(1Jj{3B zY8^Q)7`HjY8nl|JSccc_Djn;6wSQXlOH^Swo1FI0&zeuLBfSLi_HR3ny0(#WJ~0J@ zy>Kuv1h(-6ee`l#lt|_wm#AmDuNQ62U0+HB^wC(Wb?eSKN`)TK;H=8-n3hDBzU187 za}P2-w>24u^UPnhVshdwaNg(7o;|0}xorcA{V`47k-5`1`T!`=XqJT!Lr=Gt6!>F`vikBypJo0{r< z;WT5l*{RoR^-gnQe)u%STf%t18zAt+4)?a4FvTT!e2A=-wqBIxy zd*=6g8_#SCf`@D(m$-pZev>^%dL^2v#b>nA69otl_u^enaNr{QBN5_wSL4-SisL4`l=ZfivVwRywzzE;9q3X$Fna(MW%KM>4))InchVi73EZo&tG=r z&Lfd1FksT{3Zz4kDeHI%*u0oWBgT+v_z`C~j@vx(3-P8-CivRr_grzsLYe%wqDhuh zOa-o4VcK=lQ7dIqkAPSy{6WJ}H~CTP^I@I=G8yi?i*V;jjIJr!AEUZplSI7+fP5olhIQp7RWu4tDs&61oQusKQP?BHeEb>8Wb+`mM0$TQwYNlU@k-zm9WG z5XgK|qojW3`s?*`_?PFuqkc@id!QutH#uAmEiI6L+FRNh5IDLtcya-bw=loeM?5p) zW+#$`)bfqZD@uOUFh}mWt2#Lyx5lEcJcYmJj>}Y*xh_$FbSqy!^rNS;me~f5-+bkg z1v|yaQIOhqX+5f6-y%kPidW|VSJ3ApmoA9(3jHSFj?kQ>kJ1sP!`k9AXMx>0cSlb~ zqgp-hdFQ=!n2dBnd?gs{z26MikI;Q((`QAj)x8r>3pU6DIyYh2a)@rq>YLzYF+9R^PI>lDK z?~=99Cj15|BOgLiY1SpGge@&EWrqRe&kJvx+`495(u0GcsRt%B%Nm~~ooxZkh|Di8 z1VH&*9+XmljNFX&P2z+5z*XcaT30>bTJyd?FY8vt)~k5*lo9* zJ@mz2jp^fJD|}^qcVDkqRX@nnl$fy0#QkU1cX#kSYpM!L9>qXA7IDanl{a@=;#>Ofg zt(yeuarjM|g0B(XWNWM}V#((jm&?ex7MeFu8vHbP|GPR;DIH$)_N}m@I+H1vGreas z`jr0bs00TgwHgTEtR@qIa#L~I2DD@bPG&Vu6kTD8?8@g3b|z9WIt_LyKw>k^!SOrd&d1* zwstRnUu2`jA*PuOCOE|2Wf(s-zGv@=@!p^H50T#&`{W{X#5p24^rq46Ns5jxwpIb5 zq#t5s@nUf|OhgJf}+;68%FXp69EHptV}EwW-M%CYa3x=e&;I+bSjE zQ+ddtfE>ea;U|j^6_Y+B!K_45bWNNL*K<@Ula2emw+6n--$z!n>%hNvB0Zxqyi{=dHfEPDLTjUs6+*NjZf!?fpRGmX9fo;t;liSEzoAyB zp7(Ax6z(;9e~Cu||ANuG+qkgOm}xX--qe5+w6QQYe|UcEkZfqE!^WG8s$1M^JpKv8 zc$*RUeA(DrgzEhlq+{dg`VZleA85_OIl9zo`Gd2=^Yg>AgMmKhwpigT>M*I~i?c>nS%PJ~;B#%)~rE zLGo{*YqzFqMVU;$$G=GZrg|)yq28t{`hFyhvly=pm0a!dA@E|U*<`|~jaf#yJ~A^s z0-szyMoG1#3n#|VmzbwI%1o@B@sdyxe0peV5;Q~gmTE=o z-pF<8S8S>dIPfHM^*}hA%x7IatGw{3DAOPjcS7%%eyX5e-_WlY>*ycD3-PtBb`AYCXxsgfv*oRM zs-Dl+^N;9vb*29J8XGQsg*tzoC$+J4zO;-5mQl z4o>mg&;KzvtsfVyDC8ADlW1zsHxdmAhp@w~FWmg%%tVOd>etNt2ti#^Y60`CpuTKb z*I>JMKc%`+D0r`tm#lVqf9VQ`bd}!syI^MfM+$ZCOAo!|B&70&r<6Ws!87xmI>eZ_ zi32pmW~96oUVrj+^$a28>GY0_C{da+8+8edO1x0?tI&*~Hwka{7iI=Ge&nyV`P31; zk+Wl4#Mp`d2~BqG$EmmGXOm8226}9d;w9=0y|-<#s~f$i`c&An_1}$xD8hiWUqpzl z$Hg|!w=E2p;q`W3%IdAf?~ZGG<%@~Bv%b51Ay>T|4>u+ILLTnE&KAbsG=tGrTuHNv zi^3?2AwtSVl@q<$mPpn}xzD(z4s8aph7naRZkHFZStJYUxVDY=b53=t-b2Gmtx>&#pzT zG>IKM)w@tl(#n-6EUk8^pFf$7yvHgA&ku+hpax>@d;Z!h?RMh34kZ$Ie3G4R?4s=A z&3extd(NGS#GzerXLm{31w&-HaMc5)D09i*AhRfPE z0>`{#yXrc|)Y9U#;rs{3m|k3(GMq8M0haX|D_uhH|FjE{L-`m&)<>Bgl>y-NakiOjD|yS3&{au z3WV7>ecPx{>n-Zba(5rJ@_I(chNe7*;Adre7m_F`$&!1tUcVv`T8vaKrgM?W=d|Nr zgj5|>LB(P@JN|P*4+b>Fg=zPPQTDngZ5atHdRq> zeV>CvOPa>eb-mtA`>aW9L@vHb+|R14%J3ep#ybMoY84ojA2{=cx!T+iVt2V z&1$RTV)GDG)1c%L(zM#_Mdzob)xi}CF#O^#Mh$l*GHzsmA1Nf^=27~}h5v2v7Gv>c1>&(@>SdKM;NIwm2?cn)H!h?9d#-?WRl#@t*Z zSA;siCWixNB`X)VU2+HL$+mNv%0khKev|vQ`CDhck~&}oZGj?1btYiwS3qN>gKB+& z@}d$n7jHrvP{Z=#d^Y2&w+lL@_i!Rha;kbfE4sz{<8{-rcB~T6WMHH)v~BU zoJ>c()N9Y5%4WmZ%f$gS>;CVOA(;t%2r{{7uu&o8m2FD7ScIrhE3lp2SOg2_U+&zm zF^n&x9iGc@L2_B@?fSBM_vp)-GayOJWoD& z^61EjlbLS~y=|;q9xJP}$5&=PFxznluQ+sVb>+2eD$`obn?1(X!}OgZKAFXV%UBZ) z%9OEUwuqDIIYEX*UPwH2{8W@*Jb%)abfXFn8y!tFY}rLng91J8BoQ(7I4oG|aY)LD z#~FjWAGmj4uJ>)y6n&Wz4WmF8d1DFqQs8G(31bu_lT$3yqb$5XOuOntEEzL= z7`ZBj?|SiaIr^Z$(h@Kb6PYZ45c zFgJ%GV6DId0MNcn@mY!*sfB=q?SY{1U*9XDLzba}3co6zC=%zi_OE`F*m(ND4<6sc z43aABCFM0{81+GTEW9BrWyGuX*5dH!;Gmf!%&xp)#)Dx`B%(iJnM2Km<_I^)cRC{_ zaw{U&PR?~Q(IU}tl6m6Lcp0&x6<0&KLWBC-4Sd(!nGq#PG+~?dWGn*LTedj@n+z^& zqn=B0!!n1}(c3q$pYy_4s_Xn9BI$Qzh)YS_Nh7sb5UI%~W|0MN!{hbn8P9vOg4c#M z-tpnXiQ2m$@8<+Tb~eN^4RG#F#@USYkuCdA_Y6_ub<&wA4qAY^{iKv|B&xlKU;FrL z5A)z%+wI=6c}v%&a`T(K81;l>F}1$y^fhPBTyuJtjs5M}GncR4eDms&S&I7jKM`~P z4VlZ{zwx3wbQkdlFA2H>jjn%xq5Y~MYzubytKmIrCs}xq_A)N4GyU^Y1A*0h7UY5u zI)lOq;@^t%E-RX0Gf-y(0jdS7>BP@aKj40$n7$tf+s`B@NGo%7sGmqxrg>t0$N*_o z%`GTxyJa`avK}>y3#L9ou0pOFjcY_cWp0-n5k>SJzQ5Ox$1ClMDwo@pc$`&XpWYj; zs5SQN36D{mmAD^g_nu0-UFLHytCij-D%&e(WS2fj%MAL)Dt)6U=t$%hzZ~YkF?2;T z^boh+>L@`l7Q0r%!L5K7Gl_)?~{jlcneub>@%_B7dV;4cAcB z;q|a34WxNK{ZY@HDZa$8!nR0|u22WERg>{^&~STBTp@ZW$UqS9NGLGm$T_W)5Fud? z=ajq`Iha$*QCzP~(Q;C>l<)>B%fiI(So`;55E1L{?B9>1Gb54ZaL4mx@kPl9WD+I0 zyZtY-(^R5iX|zqMx9yyZL<)HU^Vf!~_*-jLNeap3#T9)*8<8sUu|1sFvJQRj5Pr*8 z_Rx)|57{j23AcYoX!>n?_Q2XK<>$Q7mF1t9J-9l{FGNRQJsOSJld(vlHk6n1)+Qz? zEK!@HMk+r@IVbs@wzgDvjMu&&L1+G;OTUB)mQpT19|WJ-iA}gruYYDID1ql>Z2K$a zeA}pmEoSjPEHFG*-{82XUT2u{-KUrmE)X{%|4v3JPhjC2LGTw&G`LWYI+_z^U=wZ) z>1D#MF|ZG2jZre{hr5(#ivWTN=}H32-BmZd@EHnJSX^MtIE3CjP*WFG`X;A|D6xy z8u4Ebf?tm}BCF-fy`Fck{9QA*wG|P^CGd9>&!@%nfhk4oR`9%9&T0XSTfRTW^@DKs zO1qCMJDW_>+P!aMG07<0?R;U6bndZaBH!`-PJMy9aHLf zckyc8_f&AJ&NeD-Y9Uq95tNmoNpzXEWv)Z>bIh=&e%iG7u-8qi&5q$|qxx}mY_WS> zsjC;eSO2~mt2AZ-B32rmKQmBMF1yXP4&u-Lew(5qruF?SQu6sq>kd=HEx4zC+`&ca z4hc8twig0B1l3Y<^~KPYOm9gL?QfE$aFoAiyXH;2-MRw0{CH<~2U+>}_V&I2sBKrV z`BxDBc%??8^XZ6C=SxP&XIa0!o+DGkXm3DMfLrnYrgJ?jzf@Db}5 z^}A<%#`B)GqA}AVfd8~*eU2JfS6Sw5d>pgP>ri=bV=4SlbGH31%X%^z{Z};gD{cEt zFa`0*b-x2`6bl^td6tYn zHVMJJhgs*KtsVdvccEgfdHS5Z@hn%dMe^dq!u?A7NMGx#6Jl}gGr+=VKcP6^r7yO3 zL~#5mmWvfOcTu*5P%RSVO~_pfqSZRBeRGRI5DmNTF`qH=5eIqQS%MLo{X^ zq&z(;>lOqY(${*nP#aPVc1sI#a}Zm|h^Oph7Q<4^O(B5QKP6lqZehP6KzG^Xs<*^l zSP85;)VrDvVWUoUJUed1DZUhOlXQFG14uSD9BnlMG_F%R-ge`S5~O~DlBW32#)g-} zrnI7_mGI+@?NefA0>XAShJAg`L=cHb0dn@wS>JGt1hE>ZfB(1VyvI#=MyBoqcOD5= z?xKz?eGN~r)go8eX~7o>Xq#?lC7rugf{}zW2{mR65AHFz#v;lIA}iFocU083op?r{ z&1H6{`YPwU+ws5G`O?F3zM}VC&$pv*qD_r5U1`?^(LU*-YGjKA6{51bu%T`-qxNl| z4L#Qj&S`dFV4>faw>oCuFl#P|3KSY?%^f{=iP^d%cI6B2W3tFgodJ!*j_`FstWjN{ zgC&t+1X7p_S5@eHk=is1)M9(F+<}ZS%dajrx6+lj{36)z3>-uhd!;KOQz2)ilk15R z9ZdReK@AAO+j)5dcX-D0K2Z#iN$2(Z;m~}H;<$@j{so`+XmmafNW%GH%3%VeKi4Wf zE8pdfZ}gC2@@@TklvvqD@N5L9pYPM7ybi^{$lmcN3a0f*DiEn#@&A(XF~UXlQ74RW z2~8wHogvfEsJL8-zKE(;P_Kr|=r0n9zt|R%y}yU$2n|rP9O*qjEp$dZr0lyOIue3T zBP2TNT#}a)RvyvOfh~?`&{d&S$E@AL3~lYh)ZfOlZfW+*I+OPsV=F6T7v-&_fo5SY z`X9V#>j9ku{N9!I6<+5w_UymvP0Kqs@$7{c=bP$l>I2NvcZ(DY^%*UNhA5qli0QMt zhZ0JjWhno7)FM;FvxE5HKTll#ceg~DM)icJ6L(Nv`?KUL>QAH52@rsj=onZ<894Xr zr8-PF^-?;HNWtxCn0~f0Had3Ao}*3zdX+u0DORkFj+_{2)rNz(DO>3z{qsPCYGtB( z2Zt-iD&bkoUx~2OoQP8PCp|nmUN0s1S4!s~MzvjQFk4F|m)Gt}Sl5||y*0zezsMB+$Z3WIEVZIMu?C<kJW z2vRq`$cGBZo+uR&0KXm@a8!xW+p4-?^!E>tEdv-;}`L_OB zdqMZLmt29X=DFc+Q^Q)tWN`at?P{ZO%i7vZYj>;~nJj^LI6OGr*Kv>D*=VfYvNqi; zR6$Y<0=Jj3@*SSfD$l1TvLrKK0N_%f=kr*^X)8~MZ~)D%e~)3InU(%wyjDwBhGL14 zs){vJ>1IsThU?K>t&^ONMW>=xzR*y1VG#6ZYISeClwAperTH^Moglag*nM?~``K}S zD+8~hPl%}M+r^AWtUn3Ff>~pnF&>+a9*er{Vm}DMB_ZGz(xEve%~UK98UTT; z!}+OdEx+oTZ|xr*p}r5goiSR5064{*+dr6eW{%yRUnQa0^Hzr*P+9Nb(EiEk+F>j- zVpYm1rVD{-CQ?y~AV^^cPF|}{@eMV)eH?)wvz*Qbz(11uIEw0ohaIqS#vPFSQ(O11 zHTsue&!vjo31))6)DosoO;L|hwO=u_O3P7eGtA9g5FJi8sff5d>MPNC7$v(x4a1>f zE)-wMA>Gt`fbtYni_Nk6_zjT~rBHDto5{)zuv&RXeGYf8f>JgyRBCF*D>O;pZ1}CGCH!VJRmAHD0X7-KYMpwdF9hLy=e_lcrgfLH%J?M1dGh9|srSg|IO`(I`*KG(Fm)BJt@&5Hjq=1r{hlKri!+hh zHt$kdlL0eaKongM}G47 z{+UDRXz+^C>spJWt>s(mDk0edLG<_QbIxbvd+qzu*=rt35rI(ZXLH3C#eTDq$Pd{+ zkeE4mduJ?P_}tWUYCN6jOh`_BK0iJr9=QH}M6qlo$}Jpz>jO6p+=`@NP9T&oevP(B z1?WAA19h1_fJ7p$gnbli!}AKqe}v6q*uj(g{;)I#r7)6<8)Ln7pAGC6j<@1qO# z0fV+@15?)mc`8sK(rIQXw!Y9VATyZ1>81pyR_}T2TfcpvIgvC+$BfmH-x|wg#?)t3jS-?f?3)RI+h$$L*`?Q}17M_l(7eAa3gK7e~tpAaP3@c5PR_F`8~1NiE*(?VG;5 zDRl4g7+xJNO_U2cKLy~??1A(c4YsRzjfg9wLe?S4<0@|m>1it z?>8Cc+44vQcRmlAQU~3U=t2fe*uCJk7^k3b+~#}V=Dx8pGrAI8=zeCNf1l|tL{~oubYgFeABCHuBd}Ms(qij9(LcaQ+s4MBO zd61@i<+r3dgm0i|Aj6SD5}42IH`*ah11cyFSQG&qZXtDpIB{fM4bBls0M`%e%TWeo zES1dVpH-=xu#x@>T-ryxh`&mfk-{&2f}s5dmA=pIO1a@o;<*Ej~B!2uziq=6V4_h{q$F7yd|rujAHe;DDr* z1yoWzm)5LWaA4VFwBY-2+oW^sH)fQssM$t^%}YiW_aZh%D1z|k1G+GEtmuH^OvoYM z;#`n@J3%$W@sk#7;C7=Rh$Tv{gl6+sTZM4rBWjR1~TwQA5wQB@*u#N%Z1^Q%t4^ zFBM2@B1&&e&lz^irFKQr3PIYrSk}))(_=vZ0Vyb7Cm=+{)sgS-5tD*dGH;DWlWAr7K|(a7DI-$PMp6>V zGORd-Iiwf^9+w0_d^6_7oy2go6qzubT&#L9Yj}Bpe3(PZgc!i`2E7vLT8{t%u=dzy zdK#V8byGnFKc!{0Dz&C*)X2xw<1EzI(Jw-zgexF+nI&~e?`6C}c_S@M6~C z>(#j*xc#aJ3vo4>uKLdG-jPzZUi64=R7)d!scD#X2J;49X)BgC+Ofi$kKNuMv&aVF z)JHaqf=ETy z?IQD?mvC;_wP$trsndJ*E$yx~+e_Wik=ZenORcXDRE+_37jY7dhZo|U-{sdtrx8t5 z>z$Mfn3z0tRcCspb7XI)QyiWetW-;rwT^T1Cx3m{_^w^!e-uj}nVgxQUAt_iGv3J! zRwgFPrFwl;_U+o$|NU_8FeM+8Y|93o54YW9LXt`oUs;`Qjm@r&$?{J=c=F_fM?)Lq zBC`1$nh}tkluV9FCdVWLl6jF6w8NP(Wql*@6VB4I*>Uc=(|^i>8jOiiCFeiFyx2Zo zt~|EDHHfSaui=G?#{(FxqEBF|g!QT0mwLAsKy3EWkeF?fN!5?vs^DC`)2Zt>QS8pi z+plRm^&agAxmWu-)JFdp4y^Z&;!rqqV5X^QN5~QF0_nF=$R!g;XTpWa`brU}@y~!w0(~$=2lJVC~k+)Vdl*T`HbPr4sS4+&$W=6ra2U&f3x2wA~QuF~aXU%yotH+RiJX_wd8a%`(%`Tb1TF zkaFH>|4&yYCRX@+|B;E62`~%(^8>P3@&5e4`NN0LZ!9lw@K0`8Y<1~pKhB)?3c=|1 zV+zL(}53%0cX4OH#p4pbcMczxV7#?o0kZFQ6f3itk>*Hy_$q=1 zS=*i(&tTe3jMnWsup<|&m6A--FInm~!?;aZUoy#8i^acS+g})jY%!YsGzU}Y0el0dh-midGl=mIv?i2!wD5_tS%sWUgdaMpo@oE}6)sl5rAsvC0!uhx23Oxk{~qcg?&s1!1eDsuY@?1QTNs~Q9Vi5nb8S$rO67e^*cF$z0^b?rAnOrfJ9Xp6; z)78Sno>70WU9)B(C`-gmv)1nYx9q-=0u(ExdQf&Kk{{ilN$;48*7RJYN2=Vb*1x$y z4G_`#kRG`BX7p$VuWry?^nO$YTA|RNjvl^sxR$nqWPAD0`u;0V&7dQoHYNAXP0f!D zrSlfGd;v5K67LuUr@0sPj5#b)5B6719a_BlhNVLpD@yf3$4Qr_4$QXZFB?ophf5JZ z+Zc?bZR_52v0Q%jVJtIU6N16O^Oj0KcQH%!pC-bFUe4?(qB7M^A%epH;9<2Zl?jx4 z%sKdZ#7N^Y>j#{3!ZRe5*rggg$Q_1jbOL=6bry1KCm!|l*@%O)WW6$bAQxlmjr4v8 zf^{sfNHpm}5nstqPG`j?H=StOOTT8n`XH4J{P>f%j7O!~DaR#JcTDHK!t}6Bolftc z$dHM~pvit1Eh_4oy{Aj+9?Q?f-Do_P{t{XSy!52ZSn&x8x4KbkDG(oYsa-ysHCQHE zxTjO|iQdR@c72XSA2_z{NZ;=Y_ueLLB|K8sV%thho2o%4*6CKFcZ>QhQjzga)Ka`} z3zSyT%udKoK_1~mU63KeR}2KG%t7$5?n5CVYNxG*rNwvUD#`q?W46lg+(=hSnc-Zf z-0!Em|2*alg(J7d?D9(mw;J+%c|!l&2}x}tFdlS%~7nBx)bSL zL&Fi{Eh#x-BQaK33Q7&1e~slv9SzMK9&DM-FKbLH{!jkF&9aGApMfjt2v_CJnw#gWtxS*wxF)T*RXNuRit$Kb?qsr8g#Ovz=O^ zIG(P%=VVfo`J?~2Foa>h>)Q2QDBeT4YNBP{nW~gXG)((fo2^9khxwf#|F2TfTEWSD ze0VP6#0S$T>S}Z}o*s-lk-6c~k495|+9|v`UaQ56aq+dAx~-*8^|4f2&W|P9xruPt z`qb$bjr$&3-&p_AzgT~2^Nil`vya`kzH#9%esuFG&SO9S%>kdW{6;uQJ~i-D1D_lC zx1wj#rZPOW%+(G@*09CJoMA~y`mxIg3BVf1w)hZG8#an8E_dbGaF`q)ZX=#sGZ*sV z=tdZz$YT4jDxtS!?3@DjkZjNv6T@L^sW2y4W1sl1Y!fg@xGbn#{6WidQOm}Fk)RMY zhKG|KZn=?U5woHZvFnZvF)E;`c$Ts0K};FVM10`KzGG+YTu>z)t{kfl0sZp#x{Eb8 zwYR>0TWi#@3#luv0y+!@kQ?=#JkDLb5ci%m${h#4t(7Z4rEf%FnsYpu9-}cU z8T`_dbV^8nHVcKip6tS1FHGrMlSX((`CeFdK_?{WQLf$?+doyw2kB!ESjqiUL#1f$ z*aJ7leIL8CoFydgTKQbTb0di92(U47q_AKc*+L>7BPFU-v%ngcilPe;$BRefK*?j7 z5=KVpv3zlAU);R^s(7(nn%Wl__gz&u5EL_|h)8@YBjb0lsJl!XxpojC@=NsI#xovd z^FBHVLc;VMqz18kFGeMBfFD6J=0|}Mq9>t0Uc^p$^}w43-aYW%{>%vk1szDn94#o3 zjj%1kglm?GcgUVrdx_n&1xnl8nX7(Zi!4k+=uJ;Zuc^{b&)G@#UD4 zY$r!7H^F`!XDK2e0PYQMwEakXl+t}ZC@9U!Am8`wk)W0A{TDwH@gt`xyP28K@LpK+ z!Y#3A+L4^tq)9q9R;p1hlRZKLfQp-RI>Uf(C7M)5ayZSHz)zvPT#U#Ck(ND^)6;+o-ofy5b6&$N{XmQp+G=%cu4hE%J-(_$j$yF4&@D~+rEbFP-l)uwij zjaLpC)htn`--so1LqoYVOU${Znmm#%S6bzA?;auIr#59QV%ddQCi*WlKoF<8XdzB+ zWRblC&&$bjjqyr#ypt^#Q^(z*iJ?OJ8c*%7q|2Es$sDB!s9Wl~7h*BWSZ2@QODV=V zi*07vp@**aIS$}gXo|Mp?e{(zZ4#gj^{_5ANHOo3TMPMLZPbQ+lI(LuKj}D~TrL@- zqV>jxWya!**@ILachR@~WcB^K-Bi2~OrBZ&z7{Z36oateuhQ?gW6uMZnu`qw9vod! z4ufC8HnLq9Zad11(Y9SrPGZu%`zlev;c_#fU-KOEA=bY}4~itB*OT4JRD`!i;-;sf z>HJ`kLL92>EbLR8cfS8lqZA{`XVj~?_0EyLeK&BP>&ys#O{^3hs@#zk3f@7R(x|zb zT!qJ+%YI}6%Y4Emjpp(WNj>lj*s0uys`G+vn6KL2SA;<0E8Y(_i?U(j80}1y?fX`P-v#vu>3DPo z+T`y_qk>1$wXq*r4T9C+Rr2i=<4OD+3$Po9GPen5i@K&(qOg<@o6+#6)yw$^=ggPNTeEc zjvl&g36(~6)(RD3^JT~82BN+V02lh3-MJ@1RwUNny|gM8yN>eH-9}?_x&{w-MLL| zr{R3TUjr@o{D9Z=P}Xy{8c7%|+c|ZM-#y~k%!XveT?-3EGT~i|dq0&MvYqBA6E@1# zYp(JlgGChRT5&MqT?KK2en#}ubM(_IS;>dKGkwMSmIT%!mp_bksO7j&Gb2(7#E63R z!fqreE8MTh97K?M#R}Rw@DGx2VYEax z=CFCST3$PjI-M4-B#IaFS@@wX4yE)D=SQ}8ImR^y4|rJTTVqc6uo{9q@Am{Qi@u

                                                                                                                        r&t+fbm-y)Mex|N>O zegsD5GBfG&z$zPu+Yql7gn>bIx#S(Eg`o`|W^Sy_0g{XS!b+~0b#ftvvO410f9)3C zzlMyV_nn2Y?Tb)nmJ$=YL3gYjC?x%{NZOk{q&kKdsRgcjghV*a#-P0M%igwil`Gfo z&o3Rm4m_>5cGGODSR2|s=A|QZYh+TM;G1>Q5VrJ|0re@JTf2MU5IVt9!4({esN;yd z^bEjeVqx5s3|I00%FvZT%xLAwF?6-GWAX}}o}^q{F%xl)z&u2n)?>A_RjQ?|35q2K zM$)(iY_g<5f*iL-)4S{m$4(@U+;H>kqUS6`$d`m$eui(zw|XB+S;4)gahvTNgK~Da zBv2mAd37Ur@UUmR+Tn1%yTpB%8vpef#=TSumbf*&JOgPiFkfOLg>4k)FGNNnKkKDa zy~k5&@6SgpOe{t~Or2q-_@!j6mi(oM)-)NX#@^CdM3&4^Ddi{_%=Zrbu#7_8W8~q6 z!b6mjP?rfEG+LJmcZEAlnu#`IT!!m1|MO)R3Kve%ACy~)fo|G-#^Go>kc?pB;y}v< zNg!zpw6&;B4x`?28T;5bcn8#@MO?yDtL;)W)rC9TbX;?2CKsfeOQY#XG@BY0lqQ*q zM*BT6@*{k=RVG+Uj$I~`FSx;hMB?z$axvc~IUN@+__b8_me0e=i=Qw3xm4T`?&KU! zRj}Qa&!rNWiAWDGS1|o}+LSjnG&(&#gcjKL(U?Z@7IPI<+yv2jGM6ilj}BE36b{7S z*>boN=9=ibSBEI4ZR{i z9mD%c?Frs?$`#>};Q4G@)iiskW0_$9x3=@)itO7^1GhO&*>)PU^RJwr9%k8bk2}u36W8wJ(L46ko2G2%nj=Ln z%yE{`HaAW?PKAO8nOrVY*NdE>+to|$w)nE0@KEuaiC**dfeY#*uyGP=M7rT^74w)r zOV2@9(Yd$uIqh5Aan7QfZ{r@na7@2=S@o#vgp*rgS8dyw`_$YA|tMGUBCgdg8&D zdQkk7EqSieZs9!Z@?^L3vuqsKMAI-47nb_K)IFyrPMw*@~)Sdo%rEd#j(S z+*$ekJ1Tc4z@4r=(cG1vJ<`TZ9HgtA?mzbO`c@M7w1l#a^f#O_gW}Q$H`C^}k6E+N?_C zGTi*n=|QOjX%D9VrXC(EzS`}!6Y0C%dIj1}7+AxWdlsxtzuA6yZ0z*rCYLC7^T0Sd z=nX7Ius6^Pu*-9}C*7s|$b6w{p@8qR{8H=lttEN8bM)$5y>eu9^hl+iyZX-h&VO6a{XF_rZD3Vo2Qr$OThALfp!6!! zvp7P;6Qx5|AnY`(ysDVQv-nGj~GzeHorggBS~UJ(dcA^ogN;G_2UKj> zp>v{2^)ZFw8<+YeLm(%{wKVESImfQOmXFh$|`ry(ZJGwgaiFbeKLu%~yPYl&IzB;*Y-{kR`dcF7c>rZm+FZAaO*e)5LJ3Tq5JHlCM zhH>_Gquqd56Q0vAXUfq=G*A>D``7Qh_LghwYG1zhx9XN?ruUykGgggEw4F%we)*j< zGoO-Vel0U{>Xdpwp6F<`(@#Cb899;2z*WAxD(A_h+M6ss&xu&umJeKy)feXQc&nEFI>`coK4ElY zMy6B;m&YlBtb+CVpmhkfO`2x0j5MtBXTBiCId7I#gA+~W5{D*UA@ zk!$+D8>nOCpL4#h%xHbfnp)`+-a=g%hS5Nd-ueAc>r;N^lAqCSy?t$6Og}D28_)d$ zpUj_G_xE4so6VP;U!QCHy5PYRKaVyiMbFn~MweEHUh>61dzsU7oBDj)?b~gpbhmDw z@3$+Fp|GKMjI#ii4kl4BEHY)Y_r`O!SSAfcB=z7nZtB zN)yU~?3N>!y8=AvF8?u>u8n5t6D+}{?nSQEy-uy0t9$m2jyS`OeL)g}J1>Z&W{VKo zEKkqQm_{U;f<@Ak8Wn!B45_6Vj}-`0QW~S3%KV*DYccQ`>2lovjPAVadykBcykiut z(WOF+QLW7_>|L2FCz4Q8UPlf=K0jJXr^piU3xm=|&tDw)TXjxns}T66p~VV*!8^h> zCLOjR!%*I20{XrBWp^H)Ke8}1Q>(|*2|id+tA9Ip`0(66H|OV@|C}GH6@Ksc1iq>l z^+p+g$m1u}1~y)a#}obrmeH)(x&=+z4ZOSnS@(NT)sww{PQ^AhVyR~i92i{XwK{lU zRc+*w-%93!vuA^gY}k6C!${4Pi`1ogLDmb(eW06K(Eqn&e1SEoVwr31Q>lGwp+VwQ zs)`q$YL`bl8=VLFD|UM4(F{(j&gs)*W2=fnTk;oN4#ckEgZdTbxIq5jCaIwZX1JXrhnq5~USjbI2mn;6v|pi= zJ4y%#q_W`wq+5gy+QQr524STZmM&s?hmTa2Fug-BPX8m3NY3x)2%aeQPMPpyJ-0H#)Jn zef*()so^43X}?K6>6dD?FL7n@M~ieIgvCrwFxbTkg0 zKY9o~#mvz$mZ@~gvOGQHjyz^DuJu~p)N9V!&i;ixr{J#TruC~9#`hoG~qa)?UFO`QcUoQV@ zdF1kL`T2q6%ZJOOG>y!Y7Y8mP6GW#Q$j~?>E{cClbaR}O3pvp`+=X9@r&Ec~#M9~c z=uL-ioW5~dy*?f9{iJMFH^kG^)4h*<_N|}2a4zvxt-B(vi8 z`|>KhwwFEA&a=Gu9O1LqxWaSjfup)Yj+mv4kQAb?e~Xx)2=vCnJl6UW7l!oCAO+dG zMD&OdscMxjlvNz7FcRu6&um^#-{3}L!KOd7^WVKj`njSu#Gg8I0 z_oY~%g1;oC+LAV=4@zC=HSi!mwj~cI;o%RjWFOXM$m0Sw4>P|1C((hNi>Vq;J}A!; z#}*>GTsw^N;MmjClYAjB&SP1VUTts^3?X94GI& zaVQiCi^gPgypWH%ptrhlij5M*hv+D3#=x5@AuWV#kYmUehy-@g_5sl;D!{9CD$z(4 zn#Fc?<8VVa>`xojOjmvx&OWmDTcv#9EY2nU$Y4Xts1aLRUM1id1y00e$O4f5Y!D^; zJ7NNqkK#BoV^pVXg}XpWJQSonIL|>n|{>S9i6_N z!>p)HWWoqifQHNiQP0t<7IM~$4pF-**=!|~Jl5?VTRF7cYAv^uwaIpUUnX)il1Rmd z_w@eLv6Yo$-L>U5NgHZkMvngxHgu1@f`i-3k55n6&zx!{Dv`?~!QT4lj$L{Vx`>#y23Drhn$ppSH zYrH0bZ!vkzL&63svQAp$8H*%AIatM zc(-q9zRx4aC~;@1w6s)8-I<_cxbLGf&xFdI93MZ~d(O>`lybRJJqSp$4)uG9?_T0N zDKt~sWaqu{lxAFhc9Z%(n-U4uyvz^wo;!P11t<#xx~?J8h4xF*enSIw#^*F1tfORE zgF|M9)hZHAK*paYRS`ASKua7#pJ{hx_pB1?v4TC<#8Ik4N;DFKl98tMSTxFvh8ycp zo*UZqE!?nVi*f||*2TccRdOn2`pL1|yrAG%OR#Z9FH>gjupf61Fi2dqko|5vanLo? zj2Ct7C1tw#fXvSiE$ljQ(}5{fnHWsE@p8+{PP7K^xRJU!P;1h=Z;fY~PM&0rH4k*s ztkq4ZwCftcYds^GHe5H2UsHgW>^^9iuAhZ8Qr#KcyJz~qf$7T@om{P&Pt+rS-&!sc z9~w@f%jr2)czj={Jpo90rAdON#+ay+L&lOM(Mny)Am4i8iB>*%;)%yvkEt_8G5E)7 zq+X9y|1l^U^>6=U{U3RWoaY>M#vPWLo-x|4IE}s)6wjV525Pey^gg?~s!j*R{(R2! zq|Xn@e9n^yXDlfv(r(h$%wO&c6PTdmyU>l|)yNeJEe!+tx~zTu`_HVX&9F+3JEA6r zBb0jXeTCA_xJ)L}gXhnktB3bmM|N*;uMItmhXDviMX1uY$>S9(NV~ZJ201ybHtp*I zmno_=DKP&yCcGZ<_L{tPe^G#p#rv(i(nN@|#MZOn0diEa8e}gIvGSK^gX*IpcwQDe zvPb$p_kE5w5Ff{YTG*xLJS;TaQ$dlBGeL3ejOtL-OGul&G5Hu98`I;6 zGd#t)#H+K_ni9d#H>8A_ZBtx9y{F_|t@k*VwTpVKo~`trx_FVx3CH8_FdpL);lie1 za3B{%rII2g#G2*{H}0NTY409kl6`Lw{NcerBqa6W@oH;%W-td2S`hrffj@9j?&%N6 zqD^EGzHahhkUSbLBSrUM6>7Cn;Kh}@Bv}uFW`+65?KBhDmSLc~cTml@+ZDtZ(YdN7jQU_s6}rd5L}5bQ*|(dc*OR%f}`q zEHycH`3l!*>5JXqoKo?pE7F^Ox8Inr8R!=PTeiZ0objqb@IjxLG1l zkTByBirYRxLEQ-48jiiDD|Y=y{f>iWIE>Z|ULEXHEJncRt6@G1fx`X#27n3*vQ!pGJ4k*~Zz%tQw7tjp4;b3akgk)yC{> zb7L)_hreQ5znyv$*;WJvI?YM>(0G`>$ua| zeBu3qI!nhtuRH!K9sg{nb6UTi+Fp3{QI;3lAPjhPh%;o%8IY=C7N0CDP z@eitp1V0?jFBUh2SX+>r`x6ZnL`;B`2>Br=ejgQ15v$u9;p?H(izF;%C zJgFw5SqDNK!1FJ{L4VH#81;*rrxNyV>HqUSBwU` z*KAQz@WzDi$(0d&_{>QM7*S$>XR zX#)^t`j=G`DGw{3BXhSV*zM&4xNR;#H2C(6!=26IVrJmBrS>{6Zdu*00EL?1AtD6s z?Xe)0HOO7J3rTO-cXPOwA_jo$REGK7Fr5IdJiBT{l+hSoBe)5W({sT&5aA@gYN}^c zns^%s1WFnM$xvv^!Y^*xgGD>zJB2r+uE$LXvtnd_8Y#~$lQjb939zEW_$N#np|(KG zC(o2$OGIJ;iNdITfer5(N;iBJRNRRt{Tj5&sE3p(2E%IL$dVGpGcdUoi`W5NYX%q` z*9YSdVcU+A6n6n^ZA4;$MA)fFJqLc=RWb8ai66xS0KOVW8=Rg65^WqaYQ*z)Ws!s| zTUv)wcu;^1Wl{PwV9Uv0acno`4zknWl3-iOCz`g`u!43TrjE-Z4G$>0H(i*@liPs@ zEw-8%vNCZ$Vo)MF1K<{9Y#L1oyam*Bm^UZOo@;nq2)V+IG(hs&gip)JZyC9nsGDbm zx$&3*u?dClVBhy}?$Mj9Bu(Q{pvy8n8X=kx1R9c9LO{PBw|Z6Q}z;tIf<5tPmQ@YS0~$leRUN^)82*k z)s1@RT!(DW=a9&%^VEgjbE~WC@8X}FHrE(3o<>Tj5ND`QiXR19E7aeG0sItxp( z$Y2(1h5pa&%J}8KSkUcU%?wxDOY(I++Vv3CJM~x89-9Q^av_#pHA=NyzNDy$=cmep z^;iT%d>j?j308}hY%UHO)XpVcD~M*yAVtO1FEC`Feu;hnRGn`Y9M4ZgelQiU74nGy zXm}GRKoHE=vL(>)4@w$bG>8Xf3AXHObH_faci9bJ} zKc=1H*NeSxlrlsT{-=Kbx|*neU0wC2b27^S>F532n{pSoGy_zG8?O)Nn=tP-oX59j z?n|^#%@O=V8ET33J|^$#p5Djw-}ZP z*NH|d{_aI{q0kWJ6lHD_@tp&q0DBD29KdCBpnuSP!^Pt8;QHZ=T4ZQm6&w6GX-fa_ z&Fr8(bmfFv66Unx5snxfR<}>!3$)&q$0ccx<+E{b;j!Ld>0SNyJx}|ZXee3>ki2W6 zFkO5&%^a68y2MX6@%IusWTXLi?5&=w*H>F5Qgzo$t<`#cy+XbVCwYFL-g-l;)LO4( zJL`PD0ng0YdYy5G?#=i*$2d#s$f4xMa&JrA7J48|?Rq`eZbE4U`S5Ai{nAal041vr zdfu*^-rfF%K?=rxC3549j`rJvZ+>Cb8X3WXT$Mf!%AX0%y0ul1{T_#?{; z*Z)Z>@zvd_M6?F~Lhjf<__>_F?k3W^RXUOSbh4&abAInPmva7J`q&5kYZm>*CJuwG zE%7j0Yr|WQT^>y8zO^sZp4m{*$&%P+rBdpdXa1|+bnb~KWK~V1N|U{>>^NUi?2o?g zw{@z83~qG%;@8Vp!t>mJzV@kOHMP05E+^_e!^W$HUQ5o`k00715Bt}*pt}&tfR4TE zg!H$r{#^CKt*SU7@t9L%t$MzA*&TPh_l{>*KgagyDG5~ub%!l?TzXzXV(f^M%Ju1x z&O`tDeD%{@Sr{$-cl|38Svtd5Jwba7z=wuG_0ZSgPkyNW%C8Oe{>MXTn7YqjJ07ko4TQQr%JhU zIY$gAk?ws)tsXtvJ5Md0?RE-r0VO2K7_k36HK}8}u-!8CA_&w$qhXek=?{iE(tv`l@$Ah&NJ5)=W_n|-XJvYf;@0aTo zf^xyRmc5GWC6ZHQfdvV_us(FVk9hPG!AhNf_lBFPtO)hBzs`ZKS5ftPzs(ej1&AwRaY&JNm8`oN@`P}d9IM|^$s88LmkYU0gru5Gd=3r~I)W4LUtWDLLoo2Z;KdQ%C zo%q`Zwf`8q)GL;mU0eply~6NlINTm?FYg)eeP{m2{^`u+lglT5?gO>gOx6AiDB1Bn zN9Jb^+oMyL{U+O{YjSVT|C9PH^)TrF0l{H~|Cx3B|FsK2G~@7pI78#FrZ32kV(0u) zw2-OKH;3y}<#aSzu%nbnj#hFfYUw%-dlJVYG1zA7f$7K6Ie#p-D;QSCXBH-=FRM3V zL95vAUgKwM$o%V|wUI3qgjaxIC6o5!Hr^`iFa#|KvX?TWj@ zl@vW)!$njHiSaq%4d5cC-!IBmrdPQ+$Zu@AIM@FFeEwbUy1BdX&{$nvf%`3L)J;e) zlLVJa=`6V*0*=I0$D|E49NCR|XpiGTst_BgsYpqkd*|ohS#G~^Y46SdChHJ%#*OY6 zDOBb}Dw8Gs+Js;oyB6M=+#r~Jn;IK|Zzs{FflbNWvGpvGb1(NSDNcu&P%nO%pFMo{ z-G^5%eVDJf`|e|xo)e(k%bXL|ap`_KKC#vRUh)IhV6!<`TZN7>>WkHX=}-M(bG{j! zS)FdquHhy6Ke>;EHV&kPm;B7VFLNKS(f1+aZL4iw?k-+(s!Oj>=6~jp^UR+Lc|0XO zJ43pzj22O`WVA4q^FjpfOu-%t)Ja;U7^Y=Y}MrLT``v%kl+-Ap)VWMR4e&6%}@v3TTvG4>{Ka#eM{c%8e~ zcI(!@cI{hN^-^8cRn=R%D@k|A3Y~;30zwf2gn%)E3uZvt$08zNh`@jgwu}oJXN)`g z6#74JX2g-1$+$2MGip9QMaOacGvlZ@&#C;szjJSOI)J`^FLycj-gD1A%Wq!_Q_hS% zk( z%5bvVO%4wymzI(TUN~?7dzOCNa0-P(^Stl?FC@%o)knHji&ks{29o-mw#1{ffzwp% zA6rx1UzC?&*LC@tx^95*lmDPf-VbIwsb1UK8rRmc_IXg1eVyJk?ANyg%UxpY!V&;> zm*k6K(fNxfXmDJo83I9Sw_*k1pA2S1rtb_XxlAPckh%)N!67(x-8}}7~ z8zB?`FQu}ToTwzzNkrqA@EZP(-|$ZObQek#G4}^9nL@nxq}`)zlQ%k<-Z!64Lo}K` z5cQ6xCwC99QTOuy-@49w4JYfbE{0=Bu;Hq`E?}>_>fbktic);u9`M#(|GQK}7AF>i z%$n0G=Gsueb<*5uLkNOiDXB7vj?Lw9C<)cxqfg#{;+kvO_+)k@lhE0X$+I@+L!Y_t zzH6`btxJV7nXo=$@G-P;d7F=0%Ir~S5kJN*!@tR-8CH1+b zm5bgmH&k@{5w%laJbJXwxue~Dd+VBGwsi1&*yAlOnXNjJ&&dqtpeK9)T6Fdtrhal-{fEN79f&a$kd{vuaAw!@HaZOp5=Ol z|DKzl|Eu}=Hx&w3B9=A&Vqd}L(gKLdK7F|Y`qHHJR(YyblPSFCIb`+-cs4$H#~n}J z!MuCExaS{n>IpoD(>tEL?~8lBi1h}!`cK&p*@Lz;^x@#hi5VlOtWksjBfqybBKD99 z0UK%4V61^l2m^%01ZNNKj{sN-r6h;~_CZ-4bh&Qq>h3C{t6irj=c6&Vaba_NYHO?+ zb5DIylG>7#gHxJr52hvum@zz9&u2YQp}|1_*9;lYzu~B^R~4^xoyX;l#W zGKsB!sTcC&`TLiL*`5pcFpJWfDa4|MLNwNUX=5UvCmR-mdp5vP(ixCNNtWhe8Mc`Yq^(j+sProV8=wn>d zqy>Uva2doO!{URo1wv)kZdMWO7iif$Jq>MxW@X60{^s4eQwRWvIQg}1+Stqk<{w{r z#()Y5l5Upf2gAEx($dVP_0DJ$Po%rFH*t%N-3?nciQ=xoB2>-6@QYN)p`S1Qe32ak zX3{+k9mhXs6*|!yCS7Lrfkrc_&_u71lwZxD6G4s&qs1bUB)wUK_jL_Dt z#dkakh3li4;^Jb+_;PV8`h{d6XE1-3q2U`e<3^Ic07fJPydWZIH$a;b)U~qOfC@p( z=LQgysaC*xquYq@WuKKb{Zj~~0{f^>3l4~Ig)b?(@+CU>fBl=&Z|_>iMD!GhqB+zFX~0V-#zk zn#E(VD_OV4RhA0jULp2{aG_i%RlaPMKZ4CeX;Z;adrAjyb90CDD5zv|;glDn98 zD64R!k4^frEORY<{K9to!uDQxR2pt;Nqi0k?F(m6;5Pc}se}5+PNcskthR+4r4>we zu3)k2At88Ilx56U{r%a`8sV;D-Uy!6;( zci;UD-k(HQnJ|=OW@~KtNj=%7q%2@G(W$Ui$^=yeb%nP<+m8^tMEfnm%?jpMOO!9Y zw_=1R!}q&3x$ejQncDHCrPGwOm~s-nxU#YYdG#_F_im>HfdHDw=Uf+S1fB$37t2YI zw;p-x6^~!RmOpmMr3VjQdP)C#mhe3quoomTScKFO{&T7^f_V`0VFF;5{&D+n|863A z{q@Uz$rBj(-gA&<-8505a<(ei+OvmM_CP>o%4KaFx39v{0s+saA1@2$NRtSwJPt@1 zflq>-FPQrVj#=zn8K4gJ{|egc0S_`vdQm@|Mu^)8E7%hU-G&C62jc+dDDn85Kp)oH zLL_+tJ7)skp;Berv3RI9t?2haL>u-E&Y4O$l$PwVoG>BAa%@x`(l4H$ zC{KF>mFae@_ukmF-FNZ)Y{|YJ;-_h6ishoRHkyly1e+{h9KvlT&V)e)RDG?N&-RBN zJ{FH3qs{v+o|(CLW=B1rujkpm-ShLi@&ECeT{APgt_E9}tDECAg74mi83=e%P`x?K z)|Ka9c>ej76D)t?1m26e2{@C+m=k?xg9cR%qF2$q1X(G*1s0kqD=TJMdZDoyKJc3x z3rPI>B99r#jOI?QUPEy9y0)`9bMeIi9&-{^Q@>mD*rdwf_*z)wLn9=Y;0~Tiwcu4FPD0yOf%yS0Y-z4===&g9HQituB2Hda6CMG7v`jqGa`_qB zm0#pr3J_Yw52Ni_TeZ5kQrT0jp6nms)iUV2Gwd$(YruBEcAM=X+bPg1+`OKw6rsT+ zvqO@N_;Uzog`Vb&Fs@L9U!Wqy;vo@<&XOX~B#BVCScx9R2_6}N^B4&Y`2#2-H4b#J zR6CL_(}{H*_v6JQ0&*m^cx)_GPnGzAFd(iO!+kL87y}-G(x-u(ZH+pz5V_QKZ{IPI z4Qml?=J4o_lv8>^D$XG50L<}yg{)ymnj^2r>kN6_+a}uOteZjt;vaE$-BQSFTr$_G zm%ZUkARSFX?E?{H$N{HTXhZ8sgz&#vksA)JoSj(6`h^5i1Vo!7k(6p5Mp&2k4X1oz z2!GsyEW$uBkTx? zn!X@pM(iHhhn!N{l=tzN=JSg`ER8G_8mhyS3g)7f-BNb6tj9v0Xd*7v7KFsxs$~zX zqpWw^NQMK2nYW?RdRggomVix{5y+IokQV`~kMp%gt%EffM4^;ug}?~F2`tNVh^)nO zFuRTynCoErO#1WRNWS~>P=wZNDDpTgM!H99Yw8-b!6%Wvl)4Y`7l5nVI0UWJ4*_O| z{8I^zpCf(Pp6XC49AHDULx|9y8mgXu`h(daTv-W@q^fQuRjsBJcNPBHFFU`YI$N#I z(zg@tP6LK^0hs|-K-+L~5MM{c;52;R5K9qiLb#?ePTlk#<}^-q#o2q8lO1+4kTqYX zqMw1t`SF*Xf9d3Nq+cf}5sq9;;V~yLKVSVkN0huG#O^)!JlcX0uwbeRc@jm}&ryur zK9@yulm-wO*@Jn&M;0L^36~UNAe&+cC=IK-UCOCplWe+ZNDfVTyq}qjNJAxW&7Y{% z*4;lc;IFO=hTL8_?J~dT5>LRQsOF26?7+ruzFhQed{e9B&y0@W;VZWS`L z9GKv^tcLy~4?&*al(=sOQimY>scsMQj$UUG)@QJ0O4r_62b$t|;tXK*GIZo*ZM*^f z44ZFmg~F*_KIl!Na%rU1AZ9uF`kMuC)8VR|z7bB#qJ3E>-Of%$6fXiCr;#GNnD+Wc zLQy(;kz2)1@a=c`mZkH4dnXsNOCCRLtc$U{|C|22dGN3%DoBH5=jRu43)zevRIa@jCT-ZPFy!vYA{Qd>!2R4k3ZWuY!skB-ZzBvjh z?kK*U_s0tATY+XFZJV%lfH@Ew0t^pX%$(~67}_)h>+8vChf`~a`va*m;#$DW3YehZ zE6d$(s67zk{h(>FDf6o*__+}a;p#*pRO6)^5P7SUPi**DzXLu7pv*RzAO4em;U|WD zoo;tFm)OwzjoA&>I4)rvN!v^jj7;x6w40Dq@LUsDzX8~+(aQ7jD`tJ%q#PvA>Ij+x zFgG%g;ti!uEZ<0u_Xzu)5i zp7ExFyXP|j^TeD9|IuGLps(m7%)blzt^EY%#rke{9p;KP2iWoRRt}9o?`{04{x=YQ zJc_w(aB6cbm@}>0Fs(Ti!l6B6Te;>mV=GSCRT&&p6&sR1oMFkW&ORcuApN2NgD578 zqM_L4^K+byIps((Mk19*l^FBHw})h)ahF?bS&+H+TLf#e!_gAPS$2;L$w_p{t;7WPfT8+o z^IONO)!e8M3EGPeds)cfd;9dF#e{iYo|e)5U~*e&~6D$mN2k8cgUc(`JSVsXHV& z&-(XyVfO1R`r>JyuH-!)-i|YfJF!fXxB?~)(QU<2vosE;8H8O*A+MNu!0KeVj>Q@d zQ7{fnDzur7TkL^&1j?cIV8_L#Bu6M9WuX8S+@XLFMI!Hz7c_5J@Hw53X2CqsTZ#Nx zJaVlsTPu+L+*h3;*h%llh=0f#kaXugpC&{6Pf6lCaKGSpeljI{@Cb&I;7eb2OPGwJ z8>~_mtDI=x6Uf>lq6mEU%z6JV7BNfc_)WVWjh9YUJFj_7 zr+TUsf0XB#AoybAc0jOzX&@;I`V@%Jq!D2TemXfmG9BDdn=BM2Ya4>oBjfSf(0p@X zY{SsdhOvR>{LuM1D$RZ%oATA3kO37+016`h!z6vSP%x}yRS2Zp$X!Rqef@-b?tu|k z*`5p>vG&_|W`@lp1Fk^QUhe(KIOvRLhX2VY%J@IM!kASPlY*6 z140#RTO{A*2FUnQZhRKqN%iLX^?qo>1_nFuL;$VqY&*OynNP0IBr1_W!W%0TW6f<_ zoAIG2mf*Q@0n|Wkxi;K&v0FYcd;0Y3f$j=^mN0Yz=HMAl3ks0&+u9kG*i_51qEGn4 zZh$BC<%EA4LiD>MrhiC87)mQnnT%wSmj%JdR?e_F)pRyN&cF1K=<*|cDl)fBlzrAW zn(zzSH$>uFg;g1>Ls`v0TXw#2)UUR(N_T6O=yNibig`cZUFxFQJa_t8#3+9|{|}I8}cVDWM`j=Uh_4mgT8kA&TQONs+nV8>tYS1Z5eL0 z%1H;(O%VagV{Snr!D%$oL}6*Ez@dB*u-gY_7L&zdvOJg^7)TD5lQ(!qlF1Q|H{(Ou zKNSl6lu7Zy@&svi67gN}MBRfE5Ht0m`ubbR1P11NB9S%2Txp7qa7V!4}+ z!kZgJUo=XjA8lEg?@n=2kl$rpyP{7Vg4nA^$a0k3MGuFw2l$z}{W3o`x3~p=C-`>t zI2^{BC)h@V2-rh%!yHy7Y!3O-Y=F=uuQ*zsaQI>{CG9gf?DN~!r+O=?_1pO3JdADc zPImYyZpN4Pc)buOG6!8ln1vW?VhI_&C*5?JUWb9R`k1V_xWiDcN!Vjnm}5zabz;?G zuoEm+V=%+<8fvgz$t_o=2V87yjJXD;E2H}+haC<{ueJA6eG;$Kge|57(q`#JR$Do)(CMvE z6l0dYnLFe_!qPiq`Q_kSS1|WgV2;u`+#zG80;vHm1AhVHV+CN{AO@kukUdQd>L~MM zGHQ2YWn)+EAN=~3eL&01;2f-L?G=8@zv1G(TWDO*{sOT51g9NIYXFtydh!9rhw{f57U(Ls5i=k;{)1xSrIIqDHnu zY3Y_c9?6v$*gBAKB{jEEa=74a;;xN7_INzx(!cF-gzR4S+OfU!wM}`4=tqh-Rv2;* z*DHhwDub=PK3Ii{k?}xaVrK7Hqj&FCWhj%aDw#nJuWgu*l;a1B5t+#NYKJfkM!q3H zWGF4LY#|Q|Jo{|m%*m4{fBg+w$lr*%AWK;~x@V6G^9|H-6uby1zn8Byx;wChTME{{Q6q&I9HVrNTB)nJ=+s}?Liyivmi6<;EC#mcqa$A z2L1qyJoeDd)6Nt%9!v*=>0lsk7;+F6kZ6$NG2(#&+Y_QI$pQb3h>PR6uJ=Q?%i;OR zM|7tX+Joz;>_$JN(N;ebOyb^$2*~S&0=$GMy@Z+oSSc@dyCpW^w)`fi`qriEkUc_V zbabt(-h>C8y{9x`aCi_g3!H2N9hL>Lcd|Fsqi+Muv(}mj8!|6pR)q3y2t+Ib-+)K} z)ko=ipaA{h4_p8Kr}fQ^#^$%H`TDySdcBYy(Jnc}%7=RI*<8n!kEr?6hi-D{k<8<$ zo8YsVtImrVf;9>tg@uac3J8S&Izu5UH&;F@e}OFY_TjL!}cF)CYvS%y~$9YhW`T$Oew?Z3<|E zJy-9)!5u0Eyc}AzZ$z%=ctfg+6jb$&#)%nQA@e||W z%FUHo0b%xqL!G51cr-8e-`N5G)WO@i%yktTkct_)s{VhcTD`tfc?k24kJTCE{#yo( zR|S-SPP7m%A&?HH1Bd@j_yhG-pfJR1!+;VWU~#DQDa~++%}h;AWg}N)21X_qOPj}1 zv9#Nj7<@gE^Ys0eWRX{%L4;wVaD1egNF=_V;cMg!=K-7~a|cCC3xKbXHYkB}?W?!GGBJpkjF%QCc?%9~UMdef zOqD%6kek}4;dT3_>Kitg^XClsnPsj6q~Y!V6R(Lc<~$~141w)5|1B?4W}DzY>2Pvy zGMs*d|D?kw!fCcxsN%O0O77T^3|06^f-J{rOlZFTlD!wcH!x)J^RDFdA3CtD96!2P z&U%k-*?a7g1rOVJ(HlGqmmJ%><)}Ajjmrw!*|%u}JS<^GmYSsVrf+8}FBwnr%@_Y6 z|JhH+AO4qr{DSz|NBeV}*0%v4m;=B!;Q&%b5O^mMELI=nTMdMx{+1#5d=gsZ1=Vw!NWt0C1mJA&v6lT{RlN^a)$39uyB-QL*%91^93Zy1h=2v!m=&Y?g;K~{E6zBZSw z=kSE~=@ZNck3D!`3S0gsI}4@Qo~Gh1Km+eEY8M339;uwaNS?RgGi!8SEqFNeACDO|lDFJC<-?Q@r< z2d6M~4d-85`(OPvR_~4&IbWb|Qa#`QPc1hoa+ooLj7S5zXO+)Cds94*}MI z04s+%N+1uk0w!YsEHR7~gZ$<6TG-~JNuNeCPrLS_W*>qQmtHp5TOOPq-VEM=ZI;!^ z{Ecph2FKAG^OLH)nZIxJ#!4_)xp8!h)8p>FpTrjUUV(ovwSoI9nO}>jqN}g7zB2g# z;4?2bU$Xjf2hUY#e$ptPGtgI|KAJNGc}ld9R9Hnc(04TEYKYa2&yHUZ@Q1yd#%GTg zFKA7#8{bksweITVF^A(=^6GWN;agM5TTp`q*OsxiDZVAwZ9>Ecz=M%!`l-4`8>=j= zwpr8d{TE&LN9D)dA&;AV^>vl`v2@|vZePUpggxeSIuMo3aA*^QONj}HF4p39AHhtr zm9cmx(^W0!rO8StGY1VRsHx|O>bdjI&o5X1A^8vcs(0SWsUXNS;7P{zEbl`p)eB1? zYuyk$GC3Jj!aGfzHLNx8Cis^3VKlf9!kn3)yr!%~Rvj<9j~U%X6yYnM!3aMYsxw_2fD&SMI0J6Ij_RHZmWDAE5ZS|bm()-@R=WqJ-4|?50 zhaTL?((jMn^C2FC7GJf3bx(drC17sT%WQ$Zm3U%eFHL$8;mcJXH$;U^ETtgGg2V() zFL-k}Kvwh?Nkzc(&_7BjbP-%5PZ_mr@29y&)O(F#42u=7E>0Qb(#PsA2EP?ZKC?_e z{)eFPT{3z<%+~7p)81&>ShPF-bWZmgU-kRH7E0Hd+w)(^Nb=7oCOYXf{?cg!VZbnl z@Wb0L0#cB@U=makRPBD6_!JnBMD;3Z-H7+3))7%cgr53`Tr>XFAN9X+H0)B7L3c9Z zsRa^`4I(tCKN`dZw%+m`spcFS`HtAbrtb)wz*SF4l=LWA`cO1m3l0vxDUoQ?lOMsg zM}?78W^|&Q8;A8tA{{0-5(}nxFa}({G=>O^epnS1Ylp*OY_QFy4!RBz{09@Zbd#UvfsAV@_m3 z=j${Bl7!YPj0R!)#>S%gJaP!ab=}=aN+?(WNG5Lv2QlKRs8;+Q-f3%swDJSzpdfiG2#3-KNZ`Rxo`Q$6=vv4%Q z91pD0ART$R#M{Fl@m{SO4J=lX5VqA|U6Ptnz$gkv{>u%_v46w!bZSK-kM}P{eGfq% z&N_%Fh1;zl=2qK@rgdSx+uGx_x-s2}uMR_d)Wk$4Yz3{>vAu#zczSqH`a!3D;jz6} zt>AR;F_wP%M7{F^X>jhUy~j-0d4}@`I{CSnma0gDgt#buEfvh+7t3WXrMtV9$<#7z z`LgxnCq_rq=;ryone}hw*(%L3#X4O=pK!}wAQ;DBS8rgHV5s4{JBUyLVD#%{|*TyI0ty|?*D>~|Q z7O2g9ad5g36e6p))gZ(`O(aTy>LG;C9quK^kc0laT?e~G`p!v7Itk;R40N8#zimQUAG-deX?^QLO2zxO?A z2VYBE#vAAU`rwW+1JEa!(A0yNAUu9!JtQMs^?!?EHMQf}9jU4)RZ?57wA-)TlB)K; z`M?9L+B)3Ij!M#Kw$;pS=12eUfvartYFiz^lri9#NwhhHXfOm}8}+`3u|Hv2eUT%K z=!hgU6D9J*D|9>CXDA)-3Q93Xjzyg#($%vasc38?4$y1yJn&xjKgnL?tLaF-1?1D?sfKnM0`;D1x zbsWXFKx#PLXw9vkH;Q??qmaz&p*)Ftz??j%@o`l6d!UN4#qqY-MC>ErU9_j zg!EAn21cePnDS@aBOZq{lJt0Q>DKg~;#jq!%V@=G^&D z%)5JOf1J6amB_R+}02c zBY5uSGdj$Np36Z^Nm!Ay!y(p9f5q)H+<)YDfBrUPQT0=ehve$_E zbR?(4w*a0H&!7P|VPL`TaKsIxyx&*-dy7xI{9f00rqW-b{Vgun=ia{hnmvW3&$(RB zK9gR??iLr)5v+MzAI~lGZyOq;+I$#0sZkq>)UKQVQI+hc*AK8P(GYuNu*s9elqp2pB4q8eYV)WA!zP` zIroGv8)XsEUd2{QG`3DP#I)4Titw^dRotH)81fh?z5KWi>z3GuJmp^)zTQ9It-E)k zhX{`1<@5~>d_kIXj~G`TVk4LBlLUCRAM?R94X9@Tc!c)+++}Kz?x^W|HY6%9V*=?)~t4eV5+>Zg4suWHy zsHTT^EH~a$-}S+I`pO^t;7atT{LO&tmrW zb@t#(iCbF5ULV=J4hldYkCtxQRIoA%*6sZWufJa-)prJMS+=x-Ha`TTz^i>W0F*)B zz>9Q4w3=ejet+_p#FO+s=Z)?ihiO5Pmf|mmS^Y?EbHsPn#&NlAp!Y*=cyQ<5y`!UO zJHbwl$3)qdaWKsSC7t>Jx6ZY(+i{LyJgc@*t+b)EX}FX9L{JAh@K*v4(bvL$<#*@ z{kT6Y0TQqLBjny(oD5wQdTcxgy**RSU7C}OxSoy2v*oLCrT>S@X>H+sD=baXLYkcX zhnF_bIj)A^vVCu7@vj!g<|Z%mzJAlb379(#u5a>Z;Kc)-2JkI}Z|%ma3OU?=I1oBj z*$C&~*UoIY_S!9*$H(8h304L>cFc?vCpKSu;#w*w?>MppuRm|@g6HhdKIGc5%tP4p zbJnDVnAmLdN!GD_hkA>6ebzZi<+NTqfaQI7jdeg*X^xRc68&@Vj(KJ7JNf)S=kuF$ zxotV>X>$z`&81=Hau}W=`_>>PXoduGdn(MfXHVrUHmtn+*4f>=XHT0u3r5izf@A_B z4Jgcj0owod(e=OW;GZ4;Xy>=<@o#-EKH^W#wi~cKSGm;%C0u~o7T}PmYIyiO!ga~VX-feJjZ6kn z21iQMj-?!J-LGJ}ZB2UiD!jOnmF)d=2GK2v$F8iQ<5~>+m+13thn#%D!~cVZhV6 zyG;t6-qx)_)-Vua%ecPn@SR+xe4|^KIJ|hf6pG!xxM{5A3ek+TV4n~C^%zE%OSOrd zh64>0TEsqEQEA5^_Aclmt!g5oXxtm$nJQ=jp*VwtsK#u8AqL)fYi3XIf@4Ky-?e>ma-fCG5R%^~23r%I z5=lAw@RH`K4BTSHA_8PVnEU>^>-WzpA8Ep#z^68}JkNUA8tA{)qHZ}iFu?q4@W5Jo zy0!C0CSO~OSWqqb$rDp8?Yf_S&J2F>%*S@^+OumH8(BK};B`y19x=m~FxQAu=GwJp ziHKm%rJ>itS&KSmz9X5}spaPM?%h+%n`4W-Tmf^FP?6eIL=~YYwxfOpbqS`Jrm{p%t|C?0*BN{0aJq;z!`UrjI)bfB=X=hn2`39+sNp zXbG$&xydF_4W>V64_Mie1F;7(Eufx$1CNXIpVAnO}OEyh5rcvx;_sCI-DyThrQ#Cn(u3u*+EyVUxt)cS-V0Rc2vT*Zi^ zK##(6!>=~m-D!BQXF*6@R#r?E zCB5q0T;%tGQ=t2B+rP3-hb@5*fP{^j#Ml4(*|Kdt^)+BAOtu;9wo81fx0|HELQ@H5 z0o>CbI!xBY9#{sjHwY46#U4-KJJ|asry`R^Dl*#%Rce(`XI(huLCK`He{OESHaQuY z@}$D+tc$aelz|dloSE7Gu#u@`aG1ZK6RvFBPzkNSAcrS1gBd)L&qq?8OeH&M-=Di+ zeWktZKoD+SD zr9lBz@U04cfkMnU76ggsFn8bsd}G4L#-xoD`TxzIJT^29qtsARPNn1|4)SB^vHaQs zX?n=0)lR`?S==a%F<;{QP)Cv>>nm^VKP$DjP)xIP<0X=83!|0so{y^7gUr&*zC`pqDYT-8O_JL6eCz`D?SG4;;x@&2x3{ z=k%5hbl?(Z3h~G2A>xjSO(B||j=P;@_~WIqLV8O_kHWA8%XkfLCRuxwJT6G4Zc*)= zSZId@M3f-gO%Yd~s4bN#&D`SpW-4bXYmn_O=4wr=-$|A4yieEpOYbI|lPrWn|qvLx*R*^7isI6E$5 z&5&QZOz;Bbgc^TUIhiabd;e8T7MBif-+pL2>ww z{ZI;)rQh&-6>R@;+t{|N9zKXI zZs%ibur#+@O2A$VQmQr~-f2pw!7;!nkC6;*6{y!-HcW+8t~I0qOfhcBRV6EvMty=J z0bLQwQKYb3=%|XsoZBU7yW`8hr~Idof<{1KMYbqT2NVTJ^!|zx^SeN6bpUI1nnQjL zi@4i7sn5Mcx}OujEN{3xI-p-LM)?BGLv~enW37~orRtlJY_<1M%DCFySTFDr>I1?t zY4lr{%eDa!*O+*6Ye|ACt?_IC8BvZqbeKdRMONG;MB!f?NwCelH3qvpM zDr6JWyB22>xwq_sOYF?f-O~wf4}$kBVePwM)e+!wDrS-P_bTDOd6NwyN%0jLPR%m$rBll6q^vG@MRBL4M8g40O~M8&bI~Z z%=Z>gSe$f3m;g`}GFA-dZ2`Me*)?DkHRbLw>|Rmj%j$*EFH{i#>6Ehyivpkp6k;xe zdLMpSwY{f0uU4s9rzOA0kPfOZjc6kQE(wxIZb1v~TpT*UL$%4S%Qu?k%YB*5Rr9sZ z%S8|;cf$V{;)UW+e&e<6;k6P51gc%?;EiUr<8DMz4)lJ*cN^%~%`PQAWAC9^_JPc;!;>U7U3aNAbeLC=;amE~ zb2uQ1RYBGPO@b0+>%ox#Y~3gZ86U=30hW_o=Z?s3n76R`&6!Ol%cD~h3ytA)W@u>l z&{!rtJkV-yOZWq^z>y>GJ#u7@AF|`la^ZApIO7}|a%P58rxSUf(t8r|!u)>Seb>Hy z`(Ct;&AAS^vTWus0+$Xhh?s@7Y6}W+VN!^=iaS6=sYG*yK~CjX*^16mZohN9G&fh7 zn=6ew{i%UeIkz-dNGCwv4d)YzwsY>7DNS2mTG$_n4zANiXw8gh>jt9{e*eN!u8aTtUVu)=b zjXL_C=!gcsu|r-01z322F2pCmbK$PW>n{0d`mRgvYcv{1=;$@~jlb-E^a$?fPq3-G z8uwjtSNfxuypDC~@EtfjvUdIs!bWf%DrgXFLl*)gQ4{NJMEApQvoRx+6euCf6n_id znhVLGRngmEgV_GfL2rd!YhQ?+wFMXSjfILgcmYG`A5YAKSoX+QKIRr->5UxVY~PML zEDbhzFy5X#Mp2=<74)7Y)ca~l}+g+)i#&=*;i z>u^9e6D!Ll#T5E^gyL%OD9ugdy>EyGaX;H4y} zYQ3=iE#YzRWs`Gb5cqYNYyX0$xqfiR%JvBpHk5EUY)a% zUt=5p1@M8zRr~n!Y~x9VzQ#V@Y@;dLA&qp~Tf(&Kn~rd;G=trn$I<(y!{c$V5r^kT z2YUZ`U@zgy|D;X-I}PBHqXYrG4OEibbN%&unC)n9`6zCX_)SZg+fGmpX`;vq07*@f z1VaK>0wYSWN^Q2?;-J7xd|sHA7?+glUU zhxLxwh<-Auq-j98%bw((1?50svRI!i?;I?@Ub6dL!<*S6cPltvoP~OO{==+eEFLW~ z-$L1f?<=5xiC;yx1mld%H3_zzIr9vBj___oSgO?)yIu4LwdXWwsZ;0^^t=tIEC;zH zLJWn?Fb2ge>#XxH``6LtpEe!bwCNyozqfYNO*PtVqw`I8j-5RVnyicOf+UxyKcYjZ z9yT;S-q^CWF+P4P8)&_+g`fAeZl`wQzGaMs3K|aZ*+d4#aYWX@SXdC5W-2EHIKPPt zv(}_TZUBDiX^QtA{a7v$7$iT!Kq9y0(3Wp~^4R2Pus96&&f#Kkbn>6LQ;#<@>CK00 z*&6=BdGBPVv1QBq-nwVv@xXZv&X1~dath}&+%%usa&FFhfeUACThZ%$zFQ(KARCZG06YYDtO)!V zIAm<05d^Idi4XoE>oR3PNFd%M!>wGFBJ{C!iIRb2rh;&ZAOxbluay!~3^93dhCCSt z+mv%SWdzO5*4|dj$#70~^<5yD**skq zDd)=NoQ$XP^$w{MI3?Tu*teWlp#|y907K* zuTlj3-ZivkxAoqygW}bPd(XSwtmtN`p#D?3f(`7xC)|P?e|$Vw;kb$sU8R^{%p3xR zjbBUG4LNR;;5V>O*7873h<@Z1gA6a?jcd+O1aY9liBL$aHy=D~(NueVh5;)8mlQ>= zU|(E-jjGJ5k%fBmFka5i{u(s)3Vf?*7WT7FgN_C5q)y$2X;5bVQY_RVQx zbS_C40#GpkLYUfcVEh(wIjgr&cre@m&6^ z1rzB^D~)CXY7vjP%(@sIGe*o-9&Z?WF z689z&n-Yl`1iEq?45p5VQFYcPu{_LL`3bX8MjO?+sNbRMcbwqc&**=l_x}X_!@B0wW zwPW7$9OfH9b|_42UB5+Z-uf!dIlrCl(=-};k4YZHh-ac`N78Qrku3xbiWAxQz%5W~g?&+!sO~Cs9K}CFCwr4W?eR8Htv>R3|`|=oUl|f1g_dtVCci zs)7mwNCHJwI0Z4`L`V^8J9{&t-+QEEdo_FvLxHH_5+y}K<{J$-0%>UBB7rYN#8KqF z6h*`uf!0i6s7TNpb|-oTIorkF-46BGUI{6t5aA3RhqSfG`h-fHxL2lN7%udfLs3=L zAxb_EUWSj6sqZzx2S0oyxxyC+A40coz6N=jJP4C2<15kQObP^WKU#qNn}QfYqHf?X zRD}L9ki(Xm$t$Oxrcp!VH(zTHXy5}RjDgG~XF|fu@j~=(0R8Nyh9EMVjs&|pZz0}C zNw2)rdeY2TJc1kcIZ0SSn$QHoxHc^mNN{L1s0u%$_>e#^R9K{Z<)9xh8&_{s!gK}2 z{0`dVYM2Bsdxw%RHe5KMZXb$;Q2N?r zqqvxifkPTs2O|9?kz-7DAE4XVW%NYC(BW3?a>Kdslek@QIc_GC@SCwt@x&*gQgXWl z+|tKMM5~5i#ZU6a0XF6hAci3T9@!uftZ!wwnt^~i8C9x51*KykUJq0!;XYJN)nO|r zX_HJIoYW+y4A+uFh?6o2o6eHa`w=WU2L-V#DlCh9f|1_$6`Tm=1k#MLgi(UZo#XSf zKR{m4WzsJbYB4Qt@ivf>K+%{lcs)13<(LOZhwuzIH7J)-jNKg0q{BB*#y5xJGMtij zLpYrdANE2F81W8vja#4oUPm}SFhnD71-$fYT7WXYo_o;CEl z9T7}HzjLV=2@7)2w{ZJo&LN^9h?s(Ipce5XUIJbhO&wrR>#=2@uKRjjA5u)GwS-T< zS@$JybVxg@`Sg_)+|lvr<+2VFa@@h)5$Py_KR!0r`tcBL#=q921bJ8Z`!D8vE6^+T zP%~ou(i;wYe`!Qs%eN6DAteG|lbF*gjv(bVnJeHn>1%-mh-e32r)BU}WWAk(OsT=O z#M^AUDTCR$(Xi~Fi8TgRCsEQ2;|h(sLSAcXpQoVpkm6%c zQW$eK_G1ZP#+i)=t;RpXPf-a?e~%2bykK#O2qKo3_UvYEA##egWzEo5@L$t6=)d>v&uQA{C=cs)ejefZ-EGKE3Oj$5$3KA{V@<|Pl4JCx z3na%t8!$IPNK&Ih4V667`6^aI6teoRY%QCuecA2xx_c`+5}w2U8Oa6ZqQ1vnl+|lt zHG`SOw{MEY9^wYxpY-adbbr8o%FXAkT&>E_2qT$7OTf0+JPygsS{~Q~dUv&jbpmW4 z@cr;)%JJlxXcy6x6ej@o$lx!=O*s(~iS2g>JbK_i1G*>Ro-pLz&m>6|m4DOqe?vYy zu?!-^kv0Z7R%Hv4Ibm=sq9~4vZu!iIUrffHA+51qR zp$W7z!7-NtHA*zkIT6=iYLsF+W-x~$&WZAE6gexY`_@rk{K6ezIDMZdtkr?Br$ihZ zV2bpEe)mV*fq;8G#iz0zv3-~Mpj)u{L3I)7kN1IU0|P>)p3e!woeXq~JRyocApW6a z*x1er(p|Dy#D@Qf5$i*iZPqtXoRSz;?GPZ9s)wk^&5V+B5;=yhBZ^WQ${@`_R@9U+ z^D#tuTYdggq!>irA|OB+yn(1~Kn{I&&7n9(BFodMD9O%+b&_;U(~ilGIb_THjrp*qvYo5d^uCVUG!c;(Mr28KqKfC~ zS*r61vldO=5az(1eZXvS?4;yIG@*N1W29`NddULuXnLz8YJT&Yb-NB7gR1m z@RlBgJ>qk)6=t7LS6hWgVviJB$n#Vga2mrGPVW6mtY-JwH(_jKX%miEOc~D>C+>5* z@0%#5#vREaW&MucmoC0|6c-l+L0Z7xY>O?8wsb-D!ODUm;1Vq@3X_bfg%chRBLvxn z86N}J@CU*NB3y30%E9ewi&=WEpsIGKL-8Rqs>AO=tc)1j8uR%*-T*SZGC7+Yo!qO? zC-lB>?hDv_lQ)Qq$P0GoNGhG!G0DGa^?T6#HGN6h<<9jb zra1o$1)l&ut*_5IuU`XMt1o%iNiya$bzSY{JsYz+^M2lUpwy}FM($J*M3T=iV!EY7df~;aWCre)I5JLPqH9VC5ax|9?w~CoDRXZgFG5uZHCL4(7ogjl{ zb#_=lDp7>BFh)k_1o_e7&QKv5$qV*kvz$VvFjkKW^mW0XY1?14pIJ)-q~DzIL%;BFg>(>e`h?O83)rPG%qAM z;n{zOJma|S*Wk!}EQ4Mou|tmLAW`DP0Ao~%wEewj;%DC8$CVrb{6K+Bqur~kD84^KLjAy!YTBw@`_y(Ms$9NwXE&RSS z2y0-2h1U^?#{d#|2Fjyp%tx~X7ger0(Lqj!8thS3jj3Qi!wNB%F&QbBkrCM|1LPv{ zF_Mo$Ip9E2Pet;Auvfq_sV+p}#2)+~&NT!K2XhM<0OD-oHsl)S4JK$81h+0YFKmSTsv=DY^523|142Un5DB6(r%Ine zTsfSsk-SfWOaL=jRHDFbq7tClE+{clpQ%yu;ECdsn2G}Q3m$=;E6VvJf?GlbN&uZn zY4l`)Dn}W@k3wodFO{)E@B+bU~Tzy0qFX;;*Y$N}Qkn z9eaY^0sKNd!Y12Aw%6DW*xrQogz2S#8OJ}zWn@)J1PzMS5Lg3DK0-XOv}um34Xh7x z&4XPy?jrcYu>oKT1kN1TfF=Rtf$0qt*JN7^-6pJYOlU-aiC2phjQ7W&e90B+jjhOG z#PWqhg*+?1b=Nd=QK^d^B1S{{7)UsS!GsWY2E1R(R>!yIa){`fO}i9#GhZm=n{LH@$5h2G=W?>W@^1KF;qP|4 zGh0+$_JDuD9*buyQ^$23dW-4};ke|G?TMR_2@;u}zCKmS#$)yYf57fii&>`~0ur*R z`W?Fi@Yo56oPd=oMRVSOSaVlWudYIou#X@GfhWO|q$-x=v_%v?2|z%}#2~7YQA-!p7u7~ZoP{_?t9xu6js-B!#vq-As2)hyk2zsZFTk@tvTB0} zMIV?>+aPCy=n48Iyv3u9?R+!j!`hp7-aT~q!NWu233{m=pMg&c_)ET$KY*_RQ7IwZ ztRgfx5qbSZYEr%E`reo8^IH!e-a220U<^!~GvEpuF2RwA#iF7B{dB^?;J6!bg%Ik| zfzZqN!G}N(NwK8erv1FBWhON!CUUMs@er_lFnpGLL$pdbrsHfsO9Kcv9XlM#J7Ru_ z6J8`{_x7iK`p?Z^oIX9kb~v@on%2?WpmJirY0|ef>1%>RxEZqMn~q`gB4p;rZo-D<7}5Wr{4uU1 zE8s|4H0!gP7Yh-FOzC;Fu*6Rhw(;&E9kijeOB?+esna_~WM5cLW!qEa~VDjOy`Qh)( z7XV@o%!(X}j+(Zw^&1wilf^;<65^poF<#6W8^oZ)Q5H0~_STMXt9Az5MtZhXm@bwk zdw*`X`-a@^(Lt9oV7=q*cn9|qIxjZ~I-kcy!MNfZbJ+obf}#MWtrK!6ATpG_nR1r& z&Qi{jH%czoJ6$g6gI~q`UMFpl)(P@z{*pfzE|grj0hSaoZ`|SBdhcL_9=PaQw)L4?tnc$HVCmGVS1G2yi9|qBuoj zjsP7u0U1Hk;E)dr&n!z~!L zPE*(t)qI@v8^v6fywIrv{D$gm=S3G4Yl6@SO!yHaelU;{G<_Vd1j*1~Sdsh_frcQ| ziWgm!9T$YLQ2!=TagXbokP4VLg#ft5Gdlbg1ku31`wbe>e_F@wglxb7OD#DNRSBLDEMGc3n8M;&28TEo-_v=m| zWDYa|dnrC+0V@x-A4Q;BRUz1mNlH8r&>n!WXEfwGZkPcfNZd`Zw{^r|;@on8l=0~tuIw!M>14ehCRX<4h*A&tfpmN4K zz-r)3T^&)wieejDbU-#ln-2#Xh#XND$6?}0;Z4e@YcpiJk*1L9;Zko{VEd7uz$=8NLc&I&D3u4iijIrIB>S)+LR&I| z>GU&5cLkOfg*;{tLU))E%?DF%hU5uzOsI)MTo{xby`NUaiXc?Pst6VElo-TC3mz$jHK?^2l1J zgmno%qQ4|*h4M8OW~X#rmBX>^ZHMk?Z;yp#l@}!PnQ+jKB-Zv|I8#LN-z8I#*hE=& zIOOs~ERv#Azc;F?QLi7T)P}P!0hiuQR@GisyjYw^W+?BGmo z{U}?P1zC=~n;S+JI{6*Jz~)_@g^>+x9FlK7*SfYPd{cEK>p)r`{Xb6EeveV)#4s#X)r@ml?vnlM;sdVy^xB?gejK@5muDmgNo zOr?^;Bj&Y0;QVXMk*dOAG5JT3_Dw+KmlQ?6C?=E1)ZP>?4NL{jmGUvV44DD*po?MU zXIT1L^7V32R!e88#5BX@GF--S`aY6z+CbAUaa-cP)@&VOPhCXwmak~cmaMh5A=ad! zh3dodK^*VL0q^g5IcL-QC8k{ z9B|`UKOoBoc;NxX$as{i+#2(_wMj{w)bxao1NA14=O$I6)AP%3G>jX0`5Ju}#f*P7 zts!Ou+JdE7BEJtTNupf^v=Foq&H~c{KBSJ^#o(ccHeIIe#aw0l{w3&(k!3W^fBA;= z#%FDu_QW<#2WfC-+PCSRb2lP3+W&!`NM;XVR#OJEBKdHJvn3IrC+r7lL6K%jdW~2- zO(I5$ZL$|ev+6-JayD{X5imhV!Z?b`(ag|)sPd0gms|bcs!M9hH!Im-thlsIQe(wG zi+G%gBM6GD8hKqmsO$N`cA{n=bE`{LUAw#)065T2=+jQPV0y8g!^ z80hgtVqBiB;B+Bd!?2q)rR|>q+nl7Uga0;~0R15v(V~_B558LaD7xO=+(*EdXb-Mw z$b1cnO_nLw)pG2xzEGK!&wFJpyMXCMFNVGE+bNb=0WgVZGU^%v|M=yn@cL-5^*#;q zK24k4f6?o=PU|pq5}bnX@Yc(rkbu#}{2LZKSNml;@yn&sb{IVpZh6u6bM}BO4Jy1v z-(li>PULY13H}b)R{$#h5GHP~RU!dob##Y1ZswE)#6LXF6mgqVLUxT8G6+~HMgk=_ z#ETA4zh@PJ<4}xw2k!v(VK5-{0{Wu*m7HRR^nXYyJ?d(0^95-MzI40q)>XxLQ4-1V7mOCx{HHRF3K&u8c zgYaJ*USQI*lHEPjl;r~Kn1YgWoeSm%vJe+lFA9*dGF29}G!EmU=yLdU$3^=k^|HjI zsQFZ>HlvB(wd;l>Qxe4(%)rvBv;&qL$V**;Obi7PS*&*yDS*R4WHK@w7ai2Z(SaLO zs2#P73KH2?0zq23Tgoj)8K>cp0Bep0@Wxthc$#?w^`@U&Bai1)Yu{&i+ZOA)-GKB3 z>)+k`AVC2mu|d}_=6?_BdTrI{5nTIG-4Fm+K8QH7I$5XmzK_CeBC(uE+`zYJ8^#B= zpP2nvZ=il4cZJjka0~5ftU2D?AxYB{e4Ex7*xTM|t-nVVHs$PpgYW+n?rUk_E2nIm zZE%nWH3cn86-o&3Lep%LQZJzZL;wZYYK+w>s}G?{3~Sb0a>O)IZa>&#LLLKKZqT}< zeZw7e4$6TFSil>Qq_|h|`mrlsEE0(Y9CoAV z%SR$3xoDy)@Xext8%I1t|99m#}2r|YZ z7aHITrxQG^mSPChNIg@+w}N6qKb5#(EJ#aPMN%M|=yNdjoTWLB5ke<$6H)l9^CEPn zRRkIu6>z;O>_72~N7?_^*p+}uQJn3quX=ip9cE|QoxNCK_5g&yGE>!aETHc0?5-e+ z28`iByXt+v`s%ByBd{vzRaeb!@Mm}kOhoSnSjx>wCOX!=tOtv!qYoV| znV5_6MD${V*ZDO>PQ_xXMR$6uv+-m$36njAKtGAiR}0YZ;l;hi_!F(sp#@V%&<7+s zIXw~2uJ$^0i%vJnIXazhp4o+7d~^- zuCS^7k~(-zO5)Yzd^{3#@4!6=8E}sbT|ULJqT9n1Z|Ds}kGO|9OkzzkKUqzsQu$`w zl`rk}_36~yjGseqTDGUFSnSH8<3^J4Tsp2gQ!NW)ILnLp61C=W*{4=zLZ^NipU^E37 z(Sa%mM`RdLj5Z~fymexWrX-%wyl1?%=k6OHJhM$=pYWe)E1rm+v(F-)6+yWddV1g3 z_&%jpEcK+I;)ULkBjzdZS8-)@W$AO0e(M#je$#_~Qhz`vu_Vpn@!sZTX-vjCJ$-m{&sbq~Z#v!E z+}ha*>cYdq?`&|{CTG#(0YL$r*v>5_;5)_tgjxsh(p%tDeGA;F%p2N$ZhSqIADk1Z zvun77eI~6aDRW)@Yf+b^8@=Ze?TK>}iRV237?>`t4epP+rZIhikFW4eJHFbb+Z(X> zApS)C0FU!I&j?q0nnE}P5ILe9LM0s1iR=O$y=H26eWUkeOKw*p@s#H;M^GnTN2@2z zlc|jN6lO|JqIXu^)>wa`?>*U+I|oOe_O?ql)sS=O&4;UO{a)XDIuV}eM|KE!=^8hO z0AdP26(C_33K9l=&eP!r%cLiJhaTEzf3` zmNZsr4i@P)J#%iX^Ip}_)I4i;{o=dQ(^PPOI{$2X+QBcpwZ8s@2ImZM?HFRh)b6$ zjwN|4zo?~YhIIFuVjeMJYGHN$oLMvdQ+=$y7>lhmpfc3T{Cf8}t`B{N3%{!!%Sp}d z>S*f@?fo^VmwjO`iW}wZ+Ci>fq9PWtA5Lmkwk-^Z%uh|4GwCL{KKL*9w{IZ7t!tof zRiE2E_>lYCr}_rg4}|~oU5ok#4ul886QXC9Ri9P6UFk&i2YWdud1%-;zg6fKLfPr* zU$V{fAM?D&e6LWf9F|3pRCdmmB};v8ZQMJcy#rq2cu#WeOWQL}pYSd)zU{T@cGn{V z8zdBDR~y6R4^Rmfld5wvU@%Y9>qc^nv)Y`y?nB1C- zAH8MQajSNU*OyAhYO(2F4gKoIlMO?)Q^t<~6NL4Fag1GPH=iCpL)5tNDFO^E@Y3i- zERz5i0*Wf;vNc#g9W^I(7r0nVP;=OYTt?3^sLP$`qS@TBu#`Xt(Q0m~sMG$xXvd1U z@a2YPtjrg~vIjAphln_9wiyF$yE~iJGS8P>EZ32r0neigib6=lbS%E*@-{ub8a!j1kB2{WYmh7mv3%uKv+MttUjAX8~~PY01bt8<50g4j9AbR z8XfM*VAh>5LNR!8r_eXOFTJ!+=zK}lA+4|-a80;IgM+}tKm=g?n-7ac~6I``331-h_4jX1b77gVqq<^Gep?hHq1 zc22AJVrO-qe9_4#A6cH?9uDPXn$Ab#;+g9p47ep%D%`f)-CbBnu!ZNn5|$IUHSQ^d z#Rl6c)Qv7eH{Fc+S=;mJ;dH(|)7H?O#<6_(MK1HAFETmz#pB_8Yfrdyy@s|~(V3Vo z-3t?#HN(qbW~1=(*=-pdyeOP~&D9HMgID2mS&p{BD4vBgh@B8P5jw=sj+(*O&Nc@# z!-rNjs0%19OVMqK4`78CU4^Hq#(RCg8-s7W?3f=bm16#6CUaJ)bXF!a>BlZynMKUW z1u3l$i}_=2-|P1M-thF5bG3I{ub)i$UG8``R;$H2hlV<1w`B2sF|9otb9=Y~=k$c< zEC#W-woYB>V~^%!>%%I_BZyFS9`7)3t{R86897IR%!MJR-ElT-!e}Vh%5%Y`E>ICR zFic)?-NKeOidlhCHYeO`koT(sn%1h_ky8f6->)sc8B;54VF2J=`rpFVEd^>pF} z!*;8>C!UJw^ZUG{6P~>gYwah!zJ2lR^^3d~Z_#GhzMGokGr{GnU^&l$cMLZf8- z^0e=HV`B(!OkaM2k9ey~>+3J=QGU}pr5__+VvbVCn9}R-0le9jm$yfd9 z=5<<21p(3FeYqkQ@?3OZ|Hac+|0%~Wn;GCmyt*In+qIGBhqGOWmNK3Q9@Cr`?Zb*A z-Iftv>Dtk*n=g#Wg&!OR-pv;5`)NPcjv-~SgZE&dS9=Vf5kmIKWrz2aO!Y!`wGk&wR*+&Bu3o+KCvJ%k;zP8)09Ebg^MwY`a@lQd*Hua zhOyG?>bBIK4UbxAgMwU8I#Dm3%7puPHF)1(5@Z?;i>Xf*>qfYn49N)LM5wo}EQE&j zJht3XC?WzvQrLIuJLS`UIGs#R{oj-H7yC)~M;#k&@!=mXqΞr(#{P@A|12cYl|U zrC^*Pa4Y?c`xDE%An4c);W7Y+|2v`ehju?R1p~aT7-k(^6}xvT8Kk_l3z19_#Iq3& z#$`VkPA$uKd>h_zDjc~6E7`3W5gHP?W(4TKs(@&+`v!99w>S!eA&pg>9$vE-lOY}x zlv?(UV}!)E6>8r&7KhlnT)pm08QZ6(C%>MRy=zraTA5IL(Og=7Mm*8rwp){lFPym& zgA*xPf zc{uynHT=S%&X^9vbyXqf&2vEUus*|~ATTjI?$~>HER*npi7O}84dkh zHMgt?I+fw>$j+-43mD=MS?$}F^kbEpY}=A{^lKjv7xMv6AMoO9J%8zv$UYcA+5@h|Vjvf1~>J#Sp!`N`buSvmJd%}qR%)D=%3qrHm! zdRFe{+^ku-n{tQ`!B3{{?x>Z9{XBfHU|Ia2V;%9H(Y~Ne9N@l2pdI5Z?vyqpH6UJfO`@5HGGCQa^FKbG499Uq0DpN$MLmwHAH#1 z5igT<+c5U!jJiF@@nJ}FKDGw_)gp9xA@&E+-@XZ~=k8|`dzlu6UhfU1Sn?kX=Fh96?)7kl<$xWNLZ^0QW0I>tfPlVguIIwfawuzlPu(t+jY{gUA zjua>Ham&_ow{ODEXn5+La65@JwuHIqLw=k;H2;z$qoYN5?HARR@jI3Cy3w6G_KfbF z+`1)i`U?3a`6+1Z7K26QMJ~TDo5OKnPuA^5_T5e7kpuTkTu$7-Jf>3EGP!%(&K>ze zq1cCcRB+^F?iY31{k-sLXQ{vRM?Q{Ystzk=y9jT16%nWn=U7suu#hDj2C(EBFiT7$ zBJrD0BXg=nwPLO8cGaO~s7_2|<>nK~t1i{8dQ`8P0~2GOI!wXI2*>e4wFu7R#j2o+ z7+Ytt@^(ofDoR!1OI`wx@-lQ$xrvDf)SwztH8re8)Tla2Emtel(P|}z2OO(bspBw% z!|`g3TC2v?32I!Oh#-iQ)XD0VYQ5T^PEn_-jcSuRO--oHYKuA@{f=j-ZR$*Q7FKvW zTkTLg)h>08npC^h9(AtTtIkvBt9|NK>H>A4dbPR;^W5)8d-`H^2_kzhRhOY%bA@`n zx>8-G-k`2l2hO<OS=mb-#K*J*YmaKBhjd9#Wq`^u(vY z4xfRi;B)HphdMsx7Bylch&dQ_tj(S2kM9F zN9xDwC+er_XYg$NTs@(Fp?;};rGBk`qn=d1RlieDsi)QN)gRO!)t}U#)nC+K)idf@ z^_+TM{Z0K{{X_jz{Y(9iI*26%-RpPGTEv;d3F-z0B;jYP#}YHsBqI%yl}4E^P0}nm zX^~cGlXmGqh)Ac*lvy%c^3o;U(t}u&IWkw~$zd{I7RW1Pp)5ia%3>)&@wC|GAc*Oa#?vlIZ z9=TUOC?Ap!%YE_@xnCZT2j!#kG5NSWB%hE^%BSSh@)`N8d`>REcW&g(ASt$TE@ zo}=gLc^EK0U%QB+g?f?h(~EUM7q!t=2fC!ox}vKH9$KQ8>Sg+HeFO$)4(LHWq-%Ou zkLXc-lwPh^=%e*YNZqk|l|D|d*2n8LdaWMQC+Kl~qF$#@(kJUz>h*eqK1H9ZH|kCL zG(Dj=>n-|py;Yx~x9KzWS$exZTkp_2^)7vmp47Yb9(}IftIyNt>wWrF`T~8Sezm?x zzeexZuhkdpOZ4mXrTQ{`xxPZbUSFxN(r?gL>jV0Y`WpQveXYJuU$1Y_H|jU*x9FSn z&H5JoR{b{pc73b9O}|6GQ{S%d(C^ak*6-2p)$h}H>i5I%eV4vl-=pu9+}5}q=5~bJ(P&#F zev$a-(hKudBz}?jMdBBUUnG8!_(kFuiC-jsk@!X87l~gaz9GILz9GILz9GILz9BxA zXA1Lah;N8*h;N8*h;N8*h;N8*iEoK-iEoK-iEoK-iEoK-iEoK-iEoK-iEoK-iEoJ? z5I-P(KzuAv7~Wq%{DAlY@dM%q#1Duc5I-P(K>UFC0r3Okmxx~?eu?;);xoj@_@8J? z{1Wj?#4i!QMEnx*OT;e`zeM~J@k_)n6TeLSGV#mAFB88^{4(*i)SO#CwO%fv4e zzfAlx@yo=o5Whlv45bY37j3d=OZ*D);ew5h6Td?I3h^t%uModN{0i|a#IF#)O8hGE ztHiGoze@Zn@vFqI62D6PD)FntuM)pX{3`LQ#IF*+pZNX6?Bo=C{V{YrMY3>ubDznCB1k{9)eLFz;uW z=MPVvPrPB`jqv&r=6i(cj4+)MrZd9pM|k}RuOH?0qr7gE*NrmYqr85U`55K%9A$c= ze4e9Bca+a{G)f;$o3MVELX!IL;Wz+4@3Ph)D1)3z{=Ip{ZTgzb;D3M40Xd$ zHw<;dP&W*9!%#O2b;D3M40Xd$Hw<;dP&W*9!%#O2b;D3M(8m_#kGf%~8-}`Js2hg5 zVW=C1x?!jrhPq*>8-}`Js27GhVWVT=S+|`InT`)D`QXdTU!PJOLoiH`x)_C7F;?{WI z!^EYYU}380{;4ZwnE2EeGt6>NoiW3aJ{jtb874k;#|#sHnE1oQrw*AB;!}?d^~g|< z%n0$ROJ;=l)F(4S{1NKF2=S>~W`y|EFEc`X>X;cNKK0Cu^8Tr7W|a8UH$#0h)Hg$2 zGt@OhT{F}*LtQh}HOqFIrM_9}o29-#=t3?Xzgg;{WqZt0A1(FKvOQ+0la}o&A6G0piK6MnaCHx$fYb>Z+x#TI#B$u3GAP<>ZzrkTI#8#o?7aurJh>qsimG;>ZzrkTI#8#o?7ZD=8TT;si&5DYN@A|dTObs zmU?QbrZoP=%2H1)_0&>NE%ns0ePyYumhCG`eYI>~S?a81 z`^r*pE%g@Dl|=Z|T?AS3Gv6om*Rp+Osl%4-D@#4LY+qUGvSs_qQlBx-ElQXAY^l$d z`fRDswnBXBv!y;;>a(RjTk5l=K3nRur9NBgv!y;;>a(RjTk5l=K3nRur9NBgv!y;; z>a(RjTk5l=K3nRur9NBgv!y;;>a(RjTk5l=K3nRur9NBgv!y;;>a(RjTk5l=K3nRu zr9NBgvZXFt>anFBTk5f;9$V_Mr5;=Av87&F>XfA(S?ZCc9$D&WHO& zSn7nO9$4ytCEr`}yd}R|^13CT+fkNJ^0_5n2jt~|JRFdR1M+Y{{td{#0eLqd-v;E_ zfc~$5JR6Wt1M+A<{tU>Q0eLZC`yybwA|U?-{_6LO@;%$WNHKKCCwZ zc_$#>1mu~3yb{np56CA0`5_=L1muN)d=SvS4p^T9*5`orIAHw^SZ@Q?$AI-PVEqeN z?*i7Zfb}Y1eF|8Q0@jm&^&?jqE2L`nF0@`^2?Yn^O`+#;_K>IDI4ZB{m7hZ5Z=2742w-+uzluljU N_m}q|`XJmc_+R198#n*} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.svg deleted file mode 100644 index ba35c41f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.svg +++ /dev/null @@ -1,2090 +0,0 @@ - - - - - -Created by FontForge 20160407 at Thu Jun 14 08:50:34 2018 - By Adam Bradley -Copyright (c) 2018, Adam Bradley - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.ttf b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.ttf deleted file mode 100644 index 67bd84202ad5b2e307d3b6fac1731c2a5d963e0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112472 zcmeFadz>6qoi|*k?pc%^Aqh!HLVyqk2pB@Z5CX<< z8v$d42mt}P83si}L_`RPpfcj>!?Nh2vdF57Sr#v=sAMuCB6i;I?^N~7B(VGJ`@a7@ zpC{9&&b6w}<#&GfQxTXT2tHv{kc5?s7q40Vv2Sj>M_^x{gVNMVC-?LZzcR8z5ZHR; zN6xwMtZjGf9h(#c^L{~4m!5Okjops5!BS-Kg_Vpt2`iHiD^t^Za zZhl)3;#&pwu{E2|J!_Ny^SfU{-7gTzn^7SBO5TO%hmmjIeBq9rxi1|Nk$*}MjNfhj z@HuDQw^(e(^YKn)=Y?nO+$LG~1{2ZoNQbL)hGNM*ErmIe!+scr^a~bV;_&joXj>>BzI9!oGvNE;!Zv9`>Ch&kEh5 zaO6*TvcjK4x48err>R7Ih7Ah=UPN~?-fCFr<|Q)Q&GrcjikGqTP;$H*|5-=~*Wq44 zk$5|Pv8R*5%JYufB#a&sCV#-jkBkf5=-Yf$<9$>A(#SpIzWE_kjky7B*akN}PVtey zvC$cMN*_G(C*GddBVW5;aNCW!@f&WOM#VUuR$Wx%_w^EES?8dda(Iao8{#|M(&^X2s zsIC@MdejY+<^k^*sikMsJ%smC{Wz_STRu9YzLutV7-0-y9N{4PM`e^Bb^5~dR7YjC za0k+x5k?S>t?NbEFrI^*F;zE=bnV_zq|;PK^El%j0>(1V%W2N4y!|rDyI~aZ%rJ&L z1u9!hX?IpWf_fy@>FgznaN@>8(LBvk_-Kp{2i!y4vpW3`X z2ydW_-{aO%I_;DRD-qMW6Rc1ebKA^}4^msq$+#d0luo<(F~H0yr4h#5FgznYJ|j*0 zX#`=^jni(L@}ut9$7^NC4wNT2cdkfuO+!HI>@ zqhnr9ZAK6X?rX7opYVH>5necmForPh!~*iQ!23+)6dEXY=Vr`l%hHHPsoc#!>ZW;_ zgBSUG$51|uK;^v7jj8-qgj(G=(o|N9DLv{2N`Fwk-7P~Om)L9Tp;H85yYcz7)M+SX}5lu>Ri}I`Y0G0ciWG-G3ux8 zAEo=;FphYvmd2Xwcj1TXsk{~hH$6Pnb_yp6y(k->uIKxs)^5bDqx_f~YGvb2UU(4k zs9Q()o7zzwl~H~eK|r_*p;k^Ym5m|{BWy(&al<&`F@#YBO4stW^f1)}CsY0)!l>IO zP33NSct*LK=HnWrdcuiryRjMVC_RoqagBCUx>kO_TR-BK4I`#7>gEYoj~^3ibz^S% zR37-4(jOG=K{>Ur)!mA8EsVJ36pynQD( zPr;)-qy31B&qoD3-^Bq3Q9s7>Z`1zZ_s!fVsH^pf$B(*sDkq+W;?e0c;inD^3(q?H ziPo(arp8S7%!E6-pTaN#(f@J8W0ZEw(uhAcqm1gl?c{|~xBMkR5Ww+H&HGs{46|s>!;p>w)~l+h--n$W(F!B za|4xAdLIHL0>Z_D^G`xVA;n)TD2tGzE~Ermp_yKcj3z8T^zfla4n210z@aA(edEwG zhrV^_*+bts^xZ?>KlG1>{^`(<4*lfNza0AMp?^K}^F#l3=$D875bokI;4jq}0CX@+n!ZTq`_$LArp^3;ud?GoKnrNKJPP9yPOstq#Ik9?T&BVHi z(y@b3=)@$g%RCk{^@e*5q{hu=MXWKx<`Cq0wqq%~UpuIk{`{ipi@cubI4Va`)t($xlt*H2LYt+a^CVdFSLkllM;EH~IO= zFHC-M@=KGCPd+jE^~q-@zcu;nmALaA-)KT;J{0GeAzaKM? ze?Iir3HH8ujPZGFm}tU0<|n$Q=5f6{kLO?>H@owA@x*fz?;h3nGNatshx0S^sSP(E5S(qV-SK3)Vkc&s+b?`o8r&>mRJ|TF+VEvBs@ut#4c3vc73O zV?Av>WqsXx!a86*YJJsu#QKW0&$`LlYwfl^Ze3?xYh7bqZCznqZtb)_VqIokYVEKt zv9?A7G`m7GC&1$vsR?cd&(pIC@VAWYkD`Ca0uobdw%Wqkh&+=Lx zOSd#jwG>PCRegW=z32O@?;YP?d~f>>`zCyUaQ3@{1pe>!|IZ9C6?oEp0IQLmnGdX0 z&Mf;sFU|E;LOcK4DBLJK%F=8JdriDud|p~9$K}i9s&bz4hMHCvsXNvE>dWfeTBmlI z_K^0X_Ld&j2lVUpNzVe$Ri4+4eq*a~z&PkldKY-VZ5GYz%!hrwzV()Y9k3F6?Jd9I zU+sV1zQ!I8*n!gm&jpjgv5*j28hRxh53dg&2v0`ZBez6_=%(n4v1n{%Y;Wx8cys)r z_-_*piHj0XCHE%3S@&e!JE@JS=jzq^-ulbx@2G#bA=j|JVMpUotO4K z)@xc1w6(XbY-cU8}oxbiLVK>>llYrN{0m_gvpI-fQ-* z>AkV{w|#H)_xIo4|7u}V;g-UI!n?)pl3v9}YGQUN$%}`6xZ}jfmaSa&{pIb; zH!L4tv1Y|pD;_>6deWkkcAoU`N_piwt5&bNe$@-B-dJs}-mv9? z+rRdKbsN@QbIShp1M91&UUlk$Q{OmEKW)KjkDQ)7eeVWq!-5SvHyk`;@fp{j@$g1_ zm>&hI~e&G~O_iEruNa^99lx4g3D-3!teY`Wma3!d6)Y%OlRX6s{H4_+9* z=+zI)A71?7m$${YE!cM5wx_neadGhC!Hdtn_{NJLy7-$HzrB6;_J_BBfBRdPBrn;1 z$tydA9fLbI?YM5o%a_WRc3!&v((RW8FB`mU(`Aoc_U1?Ik6iJQ2S4)O&h*YXJ9qE= z+|K7en*QizA07MX^B?{7E_GMKuG4m1v}(X1#zV)J8Z@l&4 zTc5l2t=sh5(zl&`+m72FyesQOLXYS4gcka0Jz@6{j6~61dyKcX0{I1{K-F)}5ySLxH|L*7Sk?(20=dydA z`)v5L#m_GL?558?{n_gN_yK$^6U@CgX2rbcaA>C`x$D*_G>R7bUKbP@4 zch%k`E80>;)@-(qm!HR9WNWgrR8wSosY9BF8DqmjTo5YG7_ymsj)svd)dq6Nw$Gxw zMpVNdNxzgHvGL#$L$yb2dxV6^BNJ=`yHO|zYiK4S;cQceZtky?hNNP*m@nlz7)lCF zs6$GNSW>t_j76e_yo%2Em-F4yTvi-nl`^$dV+~?G3tNn>u&nC1WvO1KG-d1RG8u(= zRm)<-mZg}}W#&7QtUj#DlF<+ggwh^KRz9vMk|!OiYqNZQzfWV`3lgz#EU}=QX@1`^ z1sTQbRqC33wo%c8NuR9ivM(9bE51PPsI}GvzYv>Vg-S6KiG}-1D%LoMwRYzI-!oDw zYJ0u5*PV4U7`(*qUu94kt*MNVX5)~5C0J$V3+D?$pefMQQq1S_xs0Z2DlKL#+FvPG z$~~+Q)>K*&`YRQwtWqxYM?&hOQ{8rW=;upU!k!MnqyvjK=Tg^_WSIQ}4yBrZZiZ5q0X>NOgQHm+q4# zN$yMMlATVfLy}qoAw~8Y!EmxJ7|{(y$z_?(P8xPRnPmTMEzQ-DzXATgfPJQ6p0*2@ zqbwTJx>>#wE9WtOKT_p;uTyIcfX1ep z)>7yzQ*jq>`&sqY<4-{M#+(>)3%mxTFbcg1L3$(7{ZZ^h6`K+`p;#^uJ|kGK#Vp-A zFwi23n%|!ct+CupT(5plVn`ENQus z5!{FRW0A1h!^#?f-p^d=IaZv<%D^3sjC$y2)JNP|YKca|8n9O-1VB-9C8bhE zgWL;`=ZB*e##W2$>Oj1w{nXxeiCq==!bQM-SIajnM|7aIll3$4c*gogv7fQyMPylv z9KH~hxmmI0Osqb?f{C-24+2V<)XeZKIn4H=0i{0TJo>ifOqzWIzqen6j))$G$DSC7 z^|XtON%{GB5F5sW*yGS5@%cCid@#o8QwCUck#M|lqOe2w6tHQj5NRqEVwDDg2i;K+n7z!9-XK8EMyF%Q5Rc|x)IT*W~sgyylcV(rG2Pc@ zOQ`UKJ@=&h+f3C-2g_aG%`C86ZCleDrMO2^6h%zdnWD$EgV+J0p~|+DE~7foAj={X zWhN$ailhb-mSr z&t!1l=~|32pCtRt02+DgqETD4%z!E>s%YtIOM_|YvZw{rfZgD?qyFhV@Cm^ZnuS@| z15pAm0xkl%m=pyL0dyW++HzDDwbYbd;`80=Yew+hUf(bmsZBuUQ)O9AW2LEFT2r?s zlUuRD%W6PfsNxq;7x{eEe^%8lNwTL4ZCPGFo$~{UdpyA5fF+qc3)ms(PKnnE39z?T zfGRbFN)(g@@Bs1=)rMF;N2qg%bu+}>%wj;1wb)`rQyfI;BydIB9)`V#6ma9u!o&RU zv6h8bTyaH?U%L!l(&CMgM#H0qj7CEWg*}pY*eeAoMyaF(RjD!D7}b=ZA~kxIps1o0 zO{gNO8MhBb_}?kDN8-W1kwONlhUjs+WTg4S(-AjDsS#k_A+Huk)D#e48v7eYYlRK0?PB(=c$wuy6`+17SKs zd$g13Pg99k0G6O!x5!zrSOXR_#(4>+QHk>pge+*c^NI@LQT{OEJlG8-RjE%!6pu$u z=pK+GRTlL`Xei#FmVzE*flpix} zZ|jR-%%Y?!b%vrES`Pa?T3246X7C2Dl<{|}k{W8QlNB%;3{TT!QSIyUNKEf+^x3NJ z??8Vf#idPSpiMsT+<8n!6WDE_!6r_lwEjo{7_td`YoJ(&fv2SPrPXEkR5!~(i;Y;p zxE>^iGN}Jf^)S)g#IJ0L9JYc%D=a7V>bsO;s(z!Pn)qS9iN8I_9s+*$2ocPBB$myT z@}*Egi)i3xE2Vs)Kf?Uyd`LX!p3Q$*#m-tadqmvFzRJELGW#hw#07(ejv3-}XU3)pg6KmHV|Jd3k*embva}YF`ASX-ca30IK0*T;q1#kT~9b<#58Jvn$)d}_eBNiB=`%N~0CJyiCeI9d=KRLz`^_A%z^g@3Ud>v9p1H}n$et|9k|LihFxUZmh3~<}39DP# zS)?4+x`O_4`ML5q8p{f3`NpBL{`w0AI`%gb=Mb z$#fh|W8F!3i*cSBXqw=F8i1QdlJjZ=E1U_Vl2`p6k3ZAy>r6K#Q<>&uvN@j2*#2NN z7_j59U?3h#`!b!Z(S9xhB$7@yb^WacVpY85_sQmL-EQ07Z3RQV-$w(s9f1%a1*-P$IHMjmP>u;Ae zT7gJDzhv8``LZg#IbT*l0X>6*o}fN|UN_I_t*v@cFEliOHb}Z2i|ID&mW^>k7UiP7 z(k@BcPM;6b>KQosUX-l`arzJ`E#4?$f$0qy%xq1w8b-mC( zwHGn(-3p+JBer(3G9zkq)yol2KvVz4Y02;Drsi}z`bB+P30KWt zKHvY#z~kg19KIPdOZ43lU0=S={9FRqS*{pN<|g7k*YMVBH}gwB!qs3gQBSf^>!wR6vy#62BlmU_v2A01`;c z*_z~s0jEE;+*sHh!KU z)|(2CQbSxG9i?`3xxA^l=@N6ZiQkU79oXi;yGQl!eU#vX`}V)-$$$NFypGeKqvzy* z_|};-^1tbUI~V_TN8DMU{?HrstzkCOmSCLA^v z+yaJ0TmvucAR^%sl?puq417I{VFN%5UFa|OCN;xrH-vp*)gQ49L$g!CMosoGI|?yH z|FvPUAXKYwg0099bf*e@NV*>M}z_s^a^g;!C zOAtL$R6yo*dB|p$H;F;L1i=J#Q&n6uoq^U*Kf)H;7!@|p>6(6hwjv%L-XQmYUY zl;KbccUP8u3pWQ-kGB@_*t%5CDZDamHW)?4Z>p!+_5vBy!>5{l%X6H^o7CJ!}un6w0WjYq`gM&32OJ7mSXR`Dxd-_{F# zQEMHhb%)nn?}btX(y6$BU*|FL62rGs_CBdv^Oca5%dOa`_aB%m7OU9&Oa)=AzO1?rr zYpsLEE!o^Se@=6v1+rBm==7FP8mwa0>w06auJ<<9rz*^NMv`X7&g#+QaZY28nb&Dt!8HpQ1FdY#nb#RYo0arA*y5!rATkLD(W(3b-PX5e6k7j}jpZtQ?p$unjKr+#k(XU}(W~ zX2GNtv_4FwqYH?}z`ubtMnR=K5A2>LY29*VNXkR}rzJxn)B{j9g1v)|s2oGnfA%wM z2j-W2R?Ep6;RBI%DVl1`VUj)1XR5Q9!bJ5CgR0k@gSrk4`n@iZ1v3Fj{7pgYilv|w z2>Cpc)Y{P?Cyo!#NrkK?(^PWc^q%*LEX`5@HJUx^L`m@l0zN$MBs0{gMs!UR#UWkO zwGO%94{C-Ol(95H=Fx(xqO0i4T$u$jL5UsiOUp?+6K1kM)D(*LWD0eqd*`GA0acX~ z5pUZvJ>qG#-n(B3$yg`yS$Qt^hz{c@QjQKvSd;s!#J=qg0T*l5z zSf^MB3WlhbhY}B(J18G=Q09?py9&jVq$zKZ!s(&XW*EHY724N{>TaZEX^5v46PhD- z9TZAtwR)-{|KpQOE|#P(Or`LCqT9W|(JR55wh6+Bz z`KNHYF%n;3%M2DH4Zw2Z?=pp`#&k(C8?Aax2O-kZ2Gc}CF)}MpnKiI}{`~a=vrd^E zRstT~7xo&K%+mAGckDmG1`KTjMgqw>itCu>G>&301o6lb;I4n-dkiP1Fc6Z_NJ&66 zsmx~p;t=M6@Ki333hazRA8CFI{g<^3daPxpaY9s-(%o!REO@i7b}5orXqGVKl4_Xx z7j&=nh1ng$KCwv_t)~3IFJsX!7zXpGMOhN1<{k+GQirPFOdtT-@%JO|u!U?7)?iRL z+3gYa2d^Vt9ie9Y!SW$u{f8uUlGADn>-MM7kEfqv}l0 z<#ACBk;$qTDsd)$T=SZH_nKZ!j2dQllV%x)r8f1LMzlp&{F)W<$4%4p#r+X@%PD%7 zp|-TBhM_7den!EFMh!6$=t&PR(jn9Xks6Z1^hLwzo?|>&TgayJ!!5_F&pD*`o&{jrrdD2V*z@dz-VD6#PBq^MW9DqbBbN>Kr zXc&zt&ibJ^lS5x>!UP1q@Vq@`4D33+<<{V=c~KhO#D zm}1z?wj`>N1Yi^TNG%u^nct91%gam?`wa>R+0c}bCj^Yf));;!h69>ppfykpY;F=B zV1OACrH)zo1p%ltJ)xN44I`mS(C2t9lg*DtT3SN!dF!&>;!mZbf(0>yX&|zQ-O&wW zT~HLmUcV}*n{-LVW?-@r@TiIx_QnhSUTmy@F0!5uJIo~9hMQq&DM&vRyECHb346WZ zXwgfE)lF#`OxR2s)e0?%%W^?WN=9tU;ZR@-;+zO=WT+v?%I6@vm-?5=VQHwn6RrZo zUAlaNjGtaQ@kEy|cx6$a*V8tOv3Z?c^V?-b>=8X;Nm7)S6Sth`zWa07YwcVvcNc+x zo9wqBWZbGvt5qRjM-j~G(BM`SEFXaa`=qA$M5(R;4iq2&$~VpCq;Fi;lz2}vBf_Yp zb^&qph^+c^Xod`3H`rW74f&hu8gx;4-j{4PpMXZa(pM*WVM}3RkEFA|L$ggvH0XV* zf)4z*6FdyO7a%i2+nH zf&7qnW7gWBL=_uGH$#@9A|_N$N^nAyl9H)P5lQygVnB%~4X0jq>I0V5Y*_=AwG5(y zlxtVRo>WTp$QwOsyJDyXRX*_sWwLLd@^2yc5Q>jj_mUMCSIB;|m z_!t2mG3X{%9{q+`GnGbXBVi~?OT`u%Qcbn*3=r3;!8++IyD#YT1$}aLOh$yC$To@9 zF(~<2E0p|E**@FG!07sx&vU@z^LbQRRw?Eg>=jMlNECS^Ts~~uCp%Z@O7M>j14ogq zp$poEg~D>-RN*XO<_2*PP8sL{Y}85_d=rwTL2-yl=>4=*TAnRRz|jC;sF^Bo&2cm* z0PN{fSDO;X^5n^-ClfA!BQv#_DpeHVlN{`zN<~s*DD%U5VZUX^gO>i*D?mv$umH19 zk>#^(dph4`pG_rxzyEiBe3$z@5VBb{?L6D~V3a1F_Lu&}XJ-Sg*nzfPA~N*18mEF%Ixs%*2pA>AAzwM)or z)3t1SbF6!4fZtXP4&$UsZKSXNt<(wo=D1$NG7b0LEA9v zQ#qeutDWRq#2UQ4_4!m?MTQ=MPbfH*vt^R-^`b57N z?dnvdfUd)YART!Zyx2JVB;Y+n8mAU84a5n;Eu|6aC8nV>@R1^Z5K|6bzmLF(?E!ZO zb+l65XM_#7*;otCozug%$5Yi`H+8VN8BBi9{0JI>4_4R~G};{SRsT|4vU=XUrWA`b z6pL&@_wlgX3qmVkW4-HJNS38RhcCy@($qA$=W$;->@Y2(Mw+m#YCdRDjzwleP!8qZQJdGI|rYN<(bf&Jjj(L@7UXHd)rc;eo0xY_P#ZutW(}= z>s+QWbXr>$%mn=#;8cxBBs+ePb`ktD@whi;}XbDsz8d#!XgIiMY6=ofde{AJd`kF@LG?B1JM9}x`|zn&6`f|NVVn~tU&c`I|Q#2 zBe1NQ?BsN*P!llzGUhFfbsNDxcfB$hY@QAkVWlP#RbZH_WC%04)6`$gl1Ciq#V8OW zEbBm!NZn{z_gm0dTPAk>aBnXtM0H|p4AD>u|LD|LO+V;|Rx-=AdUHvi4%v_F(Nm^q z;@Wc#3HX2%_u~Z8ueiv+7K0-@&5A^<>H}8fRKF-%#(#BTqJ@JtNB!7^wOb=rpXi6G zk1pqbKXQgxI=V;YXdNU?CMVLdV|rhMy<$3+qA zF}eqrS5v8bQmK7t-m_pfPp_wj@R)G$zq6k-=w3-;bRiBLrVA4^46shv;!1MwTPfn+ct{jilC5l|$a>j=OlY-j zk7-aVO!M$*@?&Ws?4L#7$O)9F01*qaQxd9&`pjZr?x`GFH9vfAK_y(;0mY9BQJ#Fp zNUUU6+f0{dfexsCZ+-CiO|m&MwB)=L1er@@kEr!7Nj1R(WB?rnKVeFVA{?f~O~+ed z>FPld9)=N7grKqMI5RqH+1bbSbU+ydVc#=giYy9GE_sfuwsg&h3yTMjGd;&`lA$hf z)2#y-Cv&8Yc*i1KcQ8U`8bx}2d`m}B%~6nvi_dbjuWNFi9j zY{E|$-Qm!2R3}VP3V_$z)rofoC22shl%rq08~#b6czG9dsug!0Twb7twLW01HJ{5V zU-H=>FiihUuX5qYF{3-@zws?kPRoQJFh)lTWP^}8j~$)kSe`m|SR~{Bi9Lw(>N#jH z7h)zkE$7lVHWQ?D@*ja_r35jba3q*w$nyQFi#xP(LJQk> zu~|N*$*Zt{bf>H%voc{wu|WTj@tI^Yn@ql<=(ZP9BwHBtiV)i^Ur2UsI3u8MUibxe z3+I8p6+ucIp`^qu{UEZyC9}!Q@9<;Tq}nv%p8{}Lt+31Z>7ca?yObOt>%^#S|J^1P zT!O(#4aF>NLw>N?JU>9t4tSu!4FsUe@%lxtX2Kgv^Y&qz?DK^N*m}ZgnuoP`M7#P^ z+|&lINiYyPG`&Z|ELnA$Ij;uy5>nYymuY_jh~IYrqHfBT-mOk03p1hi2G?fpE%i_f z$NGNYD9D}0gBp1#*K`>Qxoo?}eOQ;s;~SjtyxNHfW$I}qIQuKbq5`M?lB>YDZ>lpz zRGLbugp1c(bk}?oYfe0`a4+^6|RAoqkSWYfZaOyZEbuUU}vx(|EbY-oW z=yy2Y(yibeQk=a+7lciqi(_c_6mPdAk*!|AmT)}x6s{nK@Q*-CT)>yRdIFLoh;H{y z&qmp$aRpEV(y%}{pcx_5MY0&S896)>OZ}x40|P4tzL{uFB$|&8(N?v9hwpuIxtvN!@HfCt>WAw+)PCjIY>`|U z!G?hH(bfSL&eEd_aL%s~{mXSoss<0pGRX#7Oe4i@1$huiEJ^`|vl(g7Av2+7E@NL( z;+l2lyy9tfwlA*xeDJ0lo;4DOmfNbU-VgvC4yo$hrU$1^PUqLJFhwR79)2fKt&27` z8`OGKK%@}nKM^j^WDt?P5COyX6UK!?cYA~UP6v8^R5RpObJc%&nD4s^=4Dtqb5+8}t5zoaPwvmwGmX@f&&j)&4C zk-@nF_|d3gJub#0DqamI8?-_V^#R0g=02*Qh8%@JgS1EBD+pE`KEWjc*-$bPklIqM zQC;&#nvyj~*4yjCfuvNQ%g9l`(HyQL96`h_&H3?jgcQ0an4Aq1D_ zivbA5n>v_NmMbBfgK3K!A4t08=#=;!$B}g!x#CDq6iP#CKr7D0VeI=B@Nrx+gaVk< zV4Opudr2{lSK&bo;FPc_qA_xXrZUc?lS6E&=wwLgPAza{_e2eueAz{HSYf8+k;TQm zi$&Q3ov<<=OCT{-#zafdnqg%^8h9xvXB3}bYtHm^XIdrO7ZL#*kf$SXenT^<`W+Lt z$NZCdfQKpCX6qHLK3&(upd<#u$$BhURAHJV*1hVrG*4?oBH7UF16lIja;21Pi2C77 zEvj{*q%kG>mSv_gXE4Pk85S~VKthsr^$vM#KqMfRbbPe<20*0EfO?5UcW}F`R~026 zfC8?(XabN@igf@MD7IxKrNkL5a9;DHu#PfQ)g-^H=@L6Z3>qfneZ}ViuX;*Y(lv8Ub}0>taZn| zpW*nKTFm4I26Bx>qoGrszdU~|=i%^`%fZ7H;BnB#c@L-zz^)O;0ljISd-21ZHM5Xd zO6V1)i_p!Q7b23e0yDRZ;&yB-OB6>&Ad!jkK_^0Kt>Ri`NY&LLMaNmWd@2v+117ZZ zLfmzs2rYvwZrFf}PrSs5P&!p}mZ{8=7c3hb(>KD&bvUw_|d(p;swoL?{D*MFGquR9X);`a~bT&{`bH;_se zKZmcL9)|#{&HGnGMbS~^v?w1i?^o3pU~1++XpUiasr9io&6rR}uTJ!mbUQ#(Em=6X z!MzO*ZiO0;U2|$?v)8q+!!N(*?6dcr{T{akf0+u_-HiO%d-igq=st54&y0dcz*nglcTS9OnS zu*NP3nq3lG`Vcmm`C(1FN{{Pn`mENJ)!UcqQ*~>iuZ|peqGeKZay#@}fc<^sQ`?e{ z;N*{1s+1@YD8NOCjgIxMT-iG|7D|T3w)JjrY_#ph#_heWn=keSgT9M5yFNQ410|rX zZv$81KwSg)2cT>W##J?9PXYbLqRkG$h8u^Yb1J*>v3YiphZ%EDWv36#o44@v<^sUMy5-=f$AH)kmh$9emt<% zLlMM%e8@H&t3geS^Ppf)qLtr@;@QBheQ;vn!1LEtAQbm9x;`k1eZa@4eu_iU)nh1J zMHgB_mu_O?;ILx0lGn2NN&)c0Hm_g5VtwJx6;8xP#>U3Z_&dLlA3+sz3_vv@e#8uflD@^WaOebz zcrZ9oh$!)HSOuejl2NF><{?*ckB5z_rW#4s*>Rj#6|Ej0+_#!>?2ErY%h<3iWkekN z4J)2NQ`iH0l3W(W1#=6@L7PdTsAEZFFmk~O&cNHQCZpo~GP>Zwdu0~!cn5mxq(G_Q zdB@|$8@;4b<8U~P{WuK%9Daml;>2M$fxiJA#cPUW1LSRcHR-AvK3m_Gt$sh7z2T{b z_J)S`C9SEu3I!(IwbOZyt0T~at7q_P;Ge;)5mEt51AfV|8erYPWS4SeC?~NRdlXBC zqpX&gS7AZ~D;xy_MEp_(N}@717D7z~o(~H;B!Sn4brW|w8yyk^oi3zx$H8ou6Fd{& z(Am25_;M+sXJTM*;picfuf7iF2C(3fUK6tdJ2^@v5oUE$OKDwLf2K+SPYkD>h@XOB zE=!Q|>tQ006COM4g#!;*2{i$`sNr*^vl|tov31$zV(G-*P8o)F-H+E9a2D5n3=ToQ zXdo13V&0$7G@QoNRfR=8;KjX$fj3KbA9@Dfq%NQnqXY4nbIY<~sj&X7H*k0)ihl+*ORc@>~-D{f}to+0(Uo@bt+0&%hQA)MCCXe zjc@REH8d2vXGiMUwM(kHJ*%Z|Ef?J-(vM zZs9g*aM#WWREMiA$3iM;<1yW&e$ZODLK`V~0p?2VlZx`Vsy@!IL7cEVfKc7!#0O+H zBpTvIN!o~Ll_XWq#!h}lWoIDzh9ZtbbU1^l&mcNe1Xt?7)E$5U9Z(>&VCKL<4-Wq4&_=DraW_<6y@%0xZ?&*E7bqsR^TQcBrGw$u+9-~Wyjb!<(K-DKY zWQE9#!(b3L<2a}^PlAyTvYjPz*%V7xhR3J|>_$9PAqHxs6|*riNYm~74;p(yab++e zz>v7*x89H}TLIJWRnxJ$P%s#(gW(otPZffh-!B>4eOkz?&3!&>;bUP}q|?0%z21;w zo!V^M}>cLz_Sy=Yn zr3K=_RN%CSZ4)d;bVph~y)G4Ou;fq8$BWsV_Q7_)Kb(ncMic0v?329bI4udLVAFz6 zG3gvNaIAjttin9j6w$!6hHxxH1GLgH-Clg?c6hX-z5VWnu7=-sHFVv+YuE5)m$9Y8 zRzr6Ke)M&4JPR;04xAPMUq@#sgcdG?Lw5p&Od%G<8SvoID)=UmTyx2J0h)L~Q-KXD zPbzX0s*DZz2ticd4qa4r8)>B2zL#wKW!bFmG-VZDm!cBGnI3p9U4|BK@fNmWRbRE^ z@|eICUNH_}wo+D*SFL?C1;?;4yX`aVYz%n1^8pxGa5H|0sFv1qFG%SHJp%XijyiK`lF|=sdRlp(~qjS&5 z>8xXjd2L~G0g=|Q^u1*`l&WgOaC;(!ShFO3h7PHMy90%mSpW4fjQsJqItca=srw{L z)#gi5ge{h(dsKD4j3g`GRI|g_>?Ode20AlkvD2WQaft~H5|%iyJz72zV=HsTT&@_4 z6{Cq@_4Z&Q5o8I=f9|7?Lgq(B&g-|n!Ap%`BATp^EWES>p450c?XPj{FAILRouKqf zaAy8=Fw2*SaOIUQYj9vA0X6sn%-1mH3+yd+4HkoRI~Q%b=#*Pd zVPjuB?etBXPRB8TX*r4LEqQhvv$K_Bp`Oit<&~p={sMqJ^$)Vp7#jh`0)7ZNR+H(; z$H6tI_{mWRD+PmG2Lo2j6i2wH6u%tk!I4wIn|vJNo&zVJe6o)XkP8%Csp9qpy(onu z4?4NUNcARR2y^fx7@ld~4-&n@xDi7~HlJ{|Qe*GP@t$*h1(gE{KM70Ch%t;(E8-Pr zLkZxpkG;g3)p)0zI1dUv3`^w2JR=E!CT=rW}7%i=T^E^$MSwFE}iE6E?vRb z;GbEVJqkIVOYjvaKyhT9I0E9)_%&C`7ojVKP8J2&=Q*Ozkg5_?0blm`QBN`x;+27}2!(kpulP<4CZ zD=pzi39*2}kBQ1Qui6#Hp`$L4RbY1ec^{wnILZ}Zyzy{BNb2U}=J+>PV zS`WKh8Ru#j0TvjSNXRQERIbF(chdBNWrzU-MO#$xTjY9?armyN00u;w*@y;?=iwphU|{k_U<)(ZC-D=v8;)(c?)i$H4yA*YumQfQ~f!UPqJ|4 z^eQPRspfFV1KyKef&1b81A@NE2v-k^T4$)OyW8s>jFtVN)`8WtomljAhCXhn9{)-x z{WB@U6OucWkOaLce2yGiK_@+gD2FK*Vz^<0cp>PJNN9sA4gG=BfzFSEr4}MvKCKhn z>j;RtS|IzFa!Y@!&znf58kRKF6}>*6HaE_O=W?7=m-OCSv3_BqCV*tS5&f4}fG;m7=c>u|6j z#sS3>ccUZlk40NhLPG&gMc-YW0%TGyUS`QjfwOd|#W2ZOKxi0uaC-#z`2qlE^DqyP zYd0$BK@kYH8u?-J66b9s69b%U@5YBF+?YK($OUC%k;ZQJcvV8CS(ew zskO1aw=Riyp}S_LNsTpc8^YH%W^d_fLjRxhCH-F6%vw)c4b3ai6OVG-3a=GAdmWy? z>dag;JkU6Ma1aUxwQK%h!ly98*`Q0Kpi3m(<=t;F9Brp1%R0z13Slmsw%Z40q}f{H z5vs3nP9Z1D)z?TZ^)r!vU#1@$n_@4v1QXQ@WCnNJ>VEmKD82{|s7@52#RAS^@PGIv zR_;Ff_8_!9z_*-85EF&WJ2oe~EP`7In-eMVOfQABu;o@0VH*#Y_q z-Vr)Xhwg#*2as~cgS^_n%L%$lvjV=Rni^ z^yLx9FAj46<`LJZ(p2b27co1usS0ciPH9AMP!_LsbeR! zonZJ-?K`RA2Z_XZ2&a7o4LoET?-&8)p>v*7{$u6-a7H2j4{Y~tkmyV;>1vpOxv+~H zSnZ<}HLklBmygjWugT@uMjS|0wPahUX?A>eI@FQS)R1fk@@b&0!SW!mS2|yPG98Ph zV=r?5zyW^c?u4e3KAck*oa&K^agQfnlsu;{SiIOH`~9+K@!D7>7RyMy@c_Rrn~|oq zAwCHIvk2xBT0NUMQ3#)yL0TaYRxC~rGd=7wkE!0F__T^&xr3b<_Tf100may@8xl@2 zU0^5&=vfZzE(7e6Z}qVIjUsSX4xWeeuft>km61OPSL74o(juHFROo{nIadWAtbLr# zowENNY)i*+2)dZH8`}ok0yaK>6+j|r$Krim;UtTv?}zA=$js)~{gh0wk+%9oUTIE+ z3@s38sc&nmPlf}^!!o|%N10S8pnNHJ+aM&FL>@Ei6LRR5l z$HaIDy!a&u33S4tCl=joMS|Nn<(C(yq%!X6jWZiTogI)N(3i+5j(|p!;&elA-HVB5w z)7lkl-!pTjKhYYBwZggm0H4`kDr6jX7vU56P@Jmp(3!Wt?W}w3`!TCs%=j;Nbkqj*@EdsT`@a26Rx^C7S$U{{%gDk z83&qtJo+`7rQ^QjyiZ{Sb?<|zzQCe7Z#?}Y=awSB|0lyDsuDAG@u@{c7nTx?1Y&Rxtu^% z9#Fh??5K6DkGH557ra*hy#Mw6%emzP;cy`64JeaC0O=AIQ7O$ngJsY8@BE0!*Bp+Bf~{<60eSW zH7jkKY>#OZ&9cqv!|Wr1~7oV$gsWgdZBxsoqX39Ku~XxK<)-i}|&nyS$WMchZ{6cM3mB^oQK zJkKv`r3{}WE&39CsMfKyyLPR8LTO6Gb@9@Mm?jPliCU~7RgdJ{xk%Pu*x2Ov+UFa<6;H6OkIrBXQ@f3E?!IpV$rTlW7IYl@FsCre&6+6xx=St z+J{7?F_+3UD)gdSavCf%Cfk~n=<8WYkQ?Vqg*)9<~1_ym(`inq--q} zm-tHxLldu3pXn&KXK=;_>j$DZ#;yZ@0be4QSD8|RkarF~&XIvS9DX2d6ZeFBm9D=} zz!UD@{Ru^`_p@|1@gNoAa;6fr;$cHp{7L8%NS4J@v8K?1)&bY!3lfeX4uYG-IV_^T zQ`}w)_eV$l^m#Ei6`o@I+!SdxoiaC7#M+~*a3egNMR5X-#c&vQoQK&`9E1~7C{Kwv z5C=bFew|scmu}i5zFfN{XubSjww=0}hDPxJd$yL{2B`|#5)S_y>fLd5ut55s{t1s| z3DRZS?6&HqS* z41@s_?%sw^(T#|zh7={tSc5Me!l__{Xg4^@Y?cZ8}o7oDw$|5{&PAZceTfJ zA3PZKeY$=%#rJtU7h-D)3dgNupfTjBOa7Q(o}3+unWB!&CQgS|909x#ye8=zGDIvv z9pTKZVfuiO@oimK?+JUL6_oi`71xAYl1;YVl!PrIld;0#Z3tH8Yx+aCSV6WEM=@_< z1N3c0{*A?C0$=gYCX&Hr!`x{jH2i>GeK%?)6Xi6t3*EEQ34Cw&+ z9g-$u?lEN?pCr@Getz{YD0*O+e;7V(9v1~RptAP6yR{Kk3K_hqYwL9O4Qy(D))Xti z+k&fb^K{U@(8O-@iNPa6biI9LM)Xz>>AE-zUYs9iqoQ^3)gv#PP|}Wws^kCWoTCYl zb(CvJ@!@msfr#UGrK0Q#aqxhosRxHe7%W5M;36H65v>Suo2Z!0o?cc=h5`fda$sh6 zcUpyinFa3GLae4ypvx-;X65p5VqY|nwyZk((p#NnrI&T5&2+bJz1TT4)cK;N^Q@d3 zSkaoV6N-OXiN5sJ(iDMLLMcn%hvZICJZ_rG6(Vn>jsRU95w_oW z_L^K=lxh03^q#~+tP1R8BnWtJq<3rY|W>j@Diw0U-2U@?|Xr1bdsBP|2 zucP|5p`kWvQ+?3MorZR;1Lriht1&#~7+B*cLu*><+9?Z2?j&iEuLf|a<7tr{VmPvf zPkw?&W67Dm>px0mQ?aa+jN9J0*vzt`&l53&Y{v}mbt4t43s|1bb1elqF*f+XWI8tUeluCj#AaOEMEO419{IMeYllKxBLQ^~z88XF7j%L1(6) z4JLwr4#wlSBrGkNZ?LRXOH#8s(6;tl`sZIA7oYp*KhKRH_bakf9Qh+l!w&9&ms<{) ze;)iZP6zk4Q+NPWpa?QY`W75IB-%$B7wCXN%NoeYoGU@QT`0%sY!`2pcM|+#IplLp zrOs_J?o^C#5s^Ow49yxn%V~`r3-5W##{daXNy1vj#YmDlxt!~05^)z1QSx^M-2s+agS%L}*d|GN zQOrqFP88=rZRf)$bePs6O5x*Rf5S&3@CePXdL^+#QP2`ZQ)EjN#fsYr_#4Moz-8YT zx8wLU55DgOzZiVrV(ywDc-7Dm5l=gOqTtHIeZTD*?3biCRnfH(XTs!0&}=5haIgFgiNX5@KYTYsQO=jCjns+iXBEW^ z+V~I?3xj1a<8~OcLB~wsf$wiCms|aQs7;yd@JR1~$J_&*LJ?@2pWUW2LXPBGaS!9h zxVjnmlz1On4(9`EFcg9%XT3f1d+S!#B{$9Ko!{de%586tC$g}ehP=A%*S+Czgk}2M zd;TBJ-UC3c>%8yXbNjSAclzwKo!Qx)*}k)N7Jab*L68K&B?y9GUlvm=Do~>+sx3uY z=2L}bTT~>Gh9%jSNf%nSB}bBNxWr9yj2DxNTmv_SkxQs2+mRJznBRBq>=Ga;C3(Q? zomY#+Vn0i-~%puZO<&#{7QJ zNVgKtvw??-+Ap!Xm(?W**8Pm3{AdCW0RK`gZk~~)y4mY}j>+h9?@`=Z`6A}$7%eNrYhF5G55ck|ac-}vVtRQmeRvi<+`+rc!v}YzNn)LUsT2+Wx z$G>NVs^RfJz#4i9{vNTN{yMf(;aeWUcXe221`t$jTUa=Bg@zC#s#p(7uG0mcYWk`@ zDu7$pX|+w5&PSKQG}z)G98&GYrY-q8Mi-m2#&C{qy@ynD4&LI&@SpZgYk;Xf;!@44+$7I@bGYzgXl;L}4jSiaqf2=93&qFG0Nh zyUwGoZKRw}Ou=9;91L`UZ9G9Ay_^;yl6lC*>zVG$MO$;%7ZU+(G}da}eBm6WLJMec zT4gVomPD4msO;^zhcP|3H5rHV%wM-+Qt%cy?{lY5pV4J*>wuzvOw)E`?(~g507@j9 zW#PlnlW0E-N&4iF0b5^ZEw^iCF~mcyb$~(@Z>@}Vh9}F#VtI17Ggi5kcv!W$HdkFb zIMwN6qvqD8rh1=0NndSt>a|+E)0~(eK1uSHupM&;q8sFx+5R{8@(RB{de0EQKT!dx z^$I`woh^FosIXR@e! z(ZG+M^jPsuM*Se_9rX}pUg@*`ihJ4lT@R>JQCv-dP$vXN@0qCYjd^^)6-@yPj`qH# zf9CMZmcRV6J>fauZ9hI0+DF(nY(|&__MseOcF2i4hjv892lVeoYQd!KiyXZ5m$_hF z_Q^IKPyclhnhX3r`{mxovzvn8;orN$uZe#?Gs(ZV@uwzx&w`|UYGUHr$w@vZCMI4O zxM<_q$%)Cyi6`|wZgaa|;$cykPY|$@M%(SS_ZbLW8Xre9FTK?pS&Txeu~gda9P{oP zKl9-rS#s3r%nQjI_CF}1_pGott*m*-+HN9dH;H~zzI!zq>i>&%s_NA-H)GjXl&_65F zy9lEqoT~BpOAg(BC=vw*Ot@Wva3~^W9WMc!7xQSu7%~k%;ta-eiE@gmz%?sOyG}Z4rA+b>;46hcXgKO7KWcq0j5AyTfZ)7Z=$Ab2vq(EP z8O9^gyIpfV=|Oz%|2G!~*9c1IGX|gMJwv903v6Nu-GT>H;X*kg-LDI2scQ1tEw|>| zG#qM^RtWdM_H$0)$b3qpq<-$&YxR5h*B8E{eoVc4pd|V?FVDVD_=kG zqbIVK*#?f^eD#tAJH^OhklJ@>IjW!EB1V0RRc9Y}(B~tUCdlX&+D*V6AvsAKr6Ed# zwZ&%63Wsy<1uYqgYW1w=o%PaTFw!xxm7uWqemmSgMDvwhpOIm$?j3tZ*r8-^p%Zzg^ByXTJ*lDo-ceSTd8obEu zTW&>lDpM|Jde3Fb6|yuGWnSz(=S3^!%yp}O>HFvRYZ%CJ*FB~kDC!g^e@8CyeL0sv z1eU&^Dfd<@tAedK?gpG|#rpRsJXQK0m&L-sd();&UM$iS_oWS9+`G8#VSmL@i2yEI z4zOS%5*qq;zs=ozL4K13clibRNfuXZ-&JI__X2U|1NvrF2V(&1FpB~?}``CEz&-dSCa0!2iGpLK|TZztg+>F&DgFaL2q;89r!HOBo$;!4?glI1A_i z`>QGBmW$5xtV5<}U1Hs1?j=ZyKSi7i+n#x+XYJ+CUQ;~)E@;8DdcVc@Jdsg^RgVxv z-1{xd9F<_=`$=rs`%TlDmyO+)S>rsICH47yhnT#uf5eb;OIXJik!bgjTkm?2YW3^Z z^kIcIHhsNGY~k?I79a|upd~^_L}-zg(HLGTIDH+nOB12Ck;e)l+7Pq0qqWc0qVZ0{ zyt{C2(YV)8D`d}mH#-VJUbZZGPlPi zksZ?mZy$I+&x&d(VhfEIOABU8K@-xLLR1X{=8V}KhDI)*t608;JjuW*78z;$jQ-sn z_QDPYzZ?H|mBrH_7I_(6#F#JGLdwTSGBFISZy_3s+T#_&Fs6WN`?$ek>6D#}HnR1U z8xb2E@oHvb9-tucx6rj)Q?;T@rr+aVq<%v^mducEQx$zblEzq!)rL&2_V^HZvD9ob zVbsPfqg)@EnI3^pE*~SMTGE9RV`$8UnUkE90Pt1X@hZ_f;p=tH(sE@cR?c`ys0cna zG&KpDp?XubqGfN!b@Eqist!2tBy;sZIGfC8T|KM3_^n9OARc#I?-zfopkCk5pBKmJ zI^*>91Fyv@~xVH!iJq+}oDXKZX_JYg_di z+G~)u`#opNTJv;0pRea1(Mxr?{`wj_F8+ivf1NkAu~lAL`XoJc>wCGsy{XcFosAmQBCCj=B-M#xs)r~^IdzE}-v&-`38=TTr`q=M-neCq`)V(i1^`b%u`?_j*JLVnlc-435iOqP_(O1ji5CNZ}#VB z1~-1>uebTs8G0k9$F_*E6aN#M?AlL|Z_UppoyH9G*dEDC)SG&5-(pucdQbPMuxIPP z9|ci_0%^a55L@?)ZJuvi7%s#6?Y^AVTMxe%+}o>PO4Ob8-R&E>;+1%~N!b_jaQ9`l z(Ep|xjJEtrnpIo`Mj8DzYFfxPWpJAnNPLxHQ_x1Pv@fwThW5V)#%DX@^M=(htUH&I zIiUSPCWnJyA)Q*f(=r;Ckc{#+wde5JD&h3fBfgN#YXG!V>&O?#6LvE)5fjQ{t4TK0+9ttgAN|m0MnY zGn~NHn_qoP#rSpE|2pd})_6RfiH}+Dv97lGXx;Yf*Z_VI9b6<@*OUQ(ygP_I8cd=| zv9YG>q!S#17WIb#d>=EScer*7-%m_AzhHvuI7j%GNiq`mAo1WIGKgL}755I?E~FNg zc{J+%DG`ESjzn%G1BdwT#|D3&k>dW9}TlE=?Wq{vDZ2Xto%K zWNy}j(QpWEAvi!(fiN1UuN(Dgy+wRk?(TtBUeD<0(4@x@{H#pxLJ}n@S#poo>z4&W zi;>F3bSyIQoOb*Rkg6jps8}p#$A3ZS!GNZ?eC5>sR=3;wtJ+k%VlLUyTy|_PCK~na zQe(0H_E@<#RZ(tzkAp!=s>aZHz1~gztch<#FoPrp;Hi*xcr+aj)kadG0d*0ak!f1= zVN3v6YjT>34_+tDYODQX^AJ>1p~MkVwOZ{(=BK9B{uL51{PHhH4R<9nZe)Pu2zf8u zMkuoI;;FggbNHlaSJ>Hba}e~28_~`f<9lMUa+FWB9Eg%w2QgM+*~79ggU?`h683LD;Kw2Vh3o+wsVrqLeYv|$aCBLtutRq9jMboM2-c#WIvkHo) zOyWlq*=%CfvdBW5Oh>)c>(8FZW<%f0`2i&B{_heYnF(zOGP!85Q6c1&ZA!XW22r6_ zU_Xb^2o}!1QrWLFj4vS_p2=`Sa$D*h`nGy^>D!t!AX+kdpO@~?*W2pMb&}UnyfX;n zNfN*H} z5Ha-xELiFZNXqcX8G}3TyL(Tr_ie%yeVGysqd*gRa|!rT;Ac|_V-zHlQ!LY>EUZ6F zyXsgh88dr-Ot{M!u_}h|dhv2O`XIP|n?RK*;!tkw7-lTvC(_0*(14JA$rBC8OxM#3 z|APJSlWG-h5)7O$H-|1@Ex-c+(6&smS&A5`2LW;013}@xepZGKS%(TLyi_bv1kP#c zU;QY)@$|kQJi3b+Bvsf=$ZO0n>VxoDctcjoh*#^a#o^JxK{JP&U3tUw2g9C7M1RCG zhnfq`5gw3hIwK`wDa&!Q1&MMY)0D1mj0((h6wRG=u89$J%GCX zpp>vDs@(@)|HSJL^5R|F?cTI`Q`aSP^Zj0oe8RDqTHkTpx$pziJ5Ef*t;9_>9^}7M`T7j0@{b z|9sRyVD+8@xgdnjpm2itx8f{iLo;j!>U1DLwO}=!_&M?i+$$8*_X1)2xdaJmWv&k8 z6UoXnkFSq0Kx$QU3rgK?>CLjPd(Gm4sn3wRkh@0W8j)|A+vPz-5Phfb@Al*IO1q-U z<#r_=XH(dxcZVBljU&6lbJS)f?#DU2tI}?l`QFWDrT2--_QokWq)*ag25n=Nwow#x zB;yso9LB)Wb!BAgn_$1ofdvSm@PCZiwpBB{wy;cn<7Io)MmlkJdCZJh&2~g*Nqp&c zf9wk7PieC+@l#)np}GhywPkPIx)#0krB{!LV2XhHl2U?`CpS-?yr{4>*|W)HDY8YK zIb;LR-zZwcRb+K|BWy_nY2Hu2*E45|EiufnEh9)*r~}!n$@n>GxIHJP5Zx7|BZze* z95Cd}IW3gnA>jyRO5BT_Op$UH_bXGh6pEA*K0swznD`xQ?_LxleBGVBdl~7>NMt!Y z@B&eMQ6d7FL<#P0|Lg2DnP^xWZ4>HkJ7*%1LSDf9wIM71wpvw!LUMUAMIX~jq)L2j z7X@3^fzKYmZW+rSxc=k;o0VPR{_hA)zirR%Tbm{QoHx3%{FAf$S7-T!=;&)lqY-;D z7Ae$*@=|VXVv@uXwJCC>@`I#vlHX}-P4$BQ+P5R<$RA|smr=oz%H;L{gk6VBD^ zpS}>3zgBIbjAi;nt8=ChQsmdtlZWC8AFL)JE@2__rAZEBZr`az6uI#>C4R0S?NTD0V+7 zTB3~v2&0Dqi7?WQgQ=w7-NQHE6e(H<70CoHK}8GziX3GlQnA6uv$e`h{qewZ5wM&$ z_t(XPIeft>Kqb>$K>8bt43B~D2lW}!;vhL0&I8*Uh+)G{BP|QBmU0cRx zEITPFk0)Gi3i0fA#tESpakF@J778q}eOz!%1z3)%S9-;Iy&ebON)`>z2_A1%*;bpe z-pBDK7k2Eu{k~iy{+mJYoAE|uwOqN|^X`_vtLC=$GQ@EU{N2F&Y4LtwN)f#kJg**S z^#F`nzTe07i*R;Jy^kw9n@m#My>Fv2NiW>#e14ZS?y+Pd-|_uUeTFbAde2U3^n%~0 zi-fTqa7G(I`s|PNd2z*{Hy6}{P8cd?S!2C#*JmoVEH*qT{PRv!$9z%p*i2o1CW}Rn z`{5ZZFi_{!Ltvm}-kTOIF&J5~v`7TF(-vfZUK=c1E>9<%O5%2rX08Po!J3P$1A<&R zfPHsi`PY_?D0Q^EcqPkS70jx$jY^wbNR@O1VP$9%S*C57>(KlhF|4VdF)hCAb<=8d zV0hZ7eq0?{>>gF>%Ej)Lf1t)Hjah(*l}6{!4aAg7Zn3TX*t5UiCaH*NeLt(De7@Ye z&D3xUo~iG5a2a)ngd23*3V|MiXeqJ!qUcJbw*-jxcgb4V%ipt|^CsSIT?So#ytA{z zSoy^E{{8?^+sAUJiB*x@J`y)@5m!>-A|54EDw1vzqP3|_ zt?RCO)+0ROBi1kLrDuKG^PaJyG1J0<|BPjQmK<1DSmrH!9kI-75P5H5E&Nh*w*8Q0 zJr#}q8>;%%wtYWLLA-L^t_FDL58=)4>)i5Ad7miW;qR(9*`D!H-p777@>8_O-;6}> zz!UH;0F%8RwC%g2kzYeX{fuj`aE>nXg%<{fw0uZ^@3&QHqN3|E{b>6Ea=xU?{Sbby zcU?=ez_DLs&G-`&7tDK@b@topK7euOD%P5(%Vfd3Ttyejiwz6&EA=C7tuIc9#1D3SP~f{oeCofHCVZ=Mf*LNcVxT>Cofn-!=9%r;1QT2$682sorK^=zRwBpK|M6y)Y0wvZlA+Q%%4rKp=i0IPpWxIEm# zUPFNHvddL(jk~ZCSaqm(H66l6o$Ppa+=`QYDdHw+_QD5{Y-~7MYXoRqCw08-#v3I_ z{RAaV@}G?jFNaQPMNKQ=#~a&4qGkfZb~c86U1lPP#G?Q?`(@TQTqA+62I}AcZJBqu z3D3yXec;X`!O9)vk)^F+3AS3q3Og|bIYDHF zT=$NO`nD6#=+azfce1Zi-kpyBy~;}uOL;}_yOwuB+eDfgWxCR)3%q^OMAgU^3o1lq zbzwu@Vn*%jJ{x+j7o5}Vz`#PkEpIi3TPvz4*Yv8#3+b`sF5?2=uvVr_Kf*hs539K=o8 zOC#x*0}-l~iS8a8t{ka^rI^1K;h;GYCGAgocyzp8O7O3g&OwZ7yVhW~mP{_M-I1`a zF&Xx9MK+Vk+VI@S7&!_f(MeNo4;yUy`0hch2Xdu!7Lgr8-8QKai6GMgZIzJzt&O9p ze0F}(S{%-{8>xn{_6akeF!-f>^;jh;S`X6yiZ4VmuZZK)?lnHqeR0kh~N++4R;Tu1*mYw3t8=#X@r#gaqt`GQ@Y05dcN@ zLk|1Fhq>(P`B;T}blu1tfqT_hPY3Yz{z8BKmwee(=dH!GGBbmv!9l`DjJH9Z26OhS zga9q^i${*!;4dd- zIgCGN8Gj5IFBvzv=Qh};wrMZK6rqBj1Lk{v=ChxjQ7dDcn`7k%&t8B1`SsrO8yhNk zUKM-Ktw=xLmVaw6%D(oJD{$3358Q2PSgWWEZeOikZ8UCLTbpU^j8!9(B@hn>2dDco z?%~@TjkTNBrkjN-NQyz=_R?3r!~0p~{nTVE$;=l3xD;slycRLq%G<#mKy~Ziqg!ZZ zrGFf+)zX!rSYo8AV$D>#8B?|4dNfz-B&TE1si>7NG?ZN!1pS#>-5oDwSAt+^{?t$> z2yOs&UmfCkE_l9`f!EL`WT@)v#q>wCKXJr@S)-rPADfQui#qLM-wDAjF~BXPLv>2} zD|ZYmgH-Z!(rcIH!on`e2Siq25$N~p%Z&+m&5~?;Gv{)nP#2gV%o8M z#oLc&Di#P0fI!y4{8Y7;UvjQ!|`L5)7b#{M^c|hQl0R$ zeKy9peG-3a>-M!q`x5NAWRW|@Owb>-gy~aL)FV{wRm`kXbL83#V>1^-hSOClLtGy5 z74JNZl3k&O;nXk|ic4~gZfZV2cnYe;=2(6Fx=4vssF;$?WaYZ?`dBGj@UdmvCOIe~ z!4v4-^}~(}ZVI+_H^FFVCBD=eY^2G%tycNhG2*eG@u7Y)IWJcNGchXfUaYPEq#eLx=9;N(ni7dX2NU?Xb9Sp(ndS)5AoQ@v=*z! z<*nmd`?_F1MAGh0k<9F;!mr=siy#BG${=3e#(}qzj-$DKPMNInTYFUnO!qO9kNz^u zs42crzF@_&h^-^Tmht8n&+*BbvCA}fvNyDSZ26%w$U_6mI`*6fEAt{0gu-0fpFx-O zaK<~E9Iu=_IYW;=d9pHfHt4U7v-i(d#wY2{lQ&LHy+^*s*_N@qKkf(zrp}_ZHUEmW zQQo+S-*Y%*F(#7R20jXm0WJ+h#BRV2K!tU8FX)31SkR~3$J;CI_R7DSw;#zy-9*Z} zD^dRh4{Vx$>?e=zojH(>2Cpi;p|v>LTE4li5)v&CME{^Z=X_eOYu}U3UiDxK4}?-b zpDVUV_M44Fe#riT#LWI%J7f96XQ!T5KqU(@4dsb~WAAej8*y z1VXMRlVeBwHo8zAFsOTWFm){urve2cjb@f)>kI7yV+Qj#%@pU<>Rpe0>v#7xCz9sq zn6WzYJ7by5n3`R>>;B(=e0sE&GpqOAamO{r6lg+hru@@=IkffGG=J*qi?bUXjQIkI z5!%D@4JQhL%kz9;6Q^BvTWwHVE&PZySXMb%c8b7u>dYxV1P1SR+?8eX@l?K6Uml!( zXf-pqf2I21SnIgW;I;dxmHos}$;QYXx38#Ay?@Q!H5S8zxT&u%j+PTZ;+8h-+Kzl< zG~GCqTD;TSGks}O@(d6?`I+d%Xo^=bygFQ(yv(wO+$QxtFp%Jx-pJbs8JF=nWI*=k z`b^7R0RC>Fn}h4R@cOIXaP;UKu44K6*UR_%@EhJRtlqeG>ArXDJ+!uVXz%5}v+vTi zKVQoa9y~ah7u~CGHyP#K@=67FJ`b8wJKY)4g$x+Cd%?d0`# zNv6f%v=o-E!NUsg2qcEz zp8$`k-ku!n{eSkc*N`_Q;`F|17{{ZrxPk2k4K0z1hy4q0@tJ`~V51+)CY)ohF{5-w%{C%zULvx17SS=nAqaau zpbJy`iuNf=VjS`JY%d~jP5pym_Wkgf|-H+$vwMYbB z@ifs4(WqUpde0~Gh7cdQnZ!_vSd|%E?08c#4iu9?TU8Xgoy_RSFt%SoL?L?;IrLmx zJn@c^L@q8k#bgTiQh~50y!6KOoMFdYa#tnC(lcd0ovdJD8R`9%gDB95*)>9cmMucL z<4m(bvN9M%GPb(1vMU!S5u}}qW&K<Lb8Sl2$rE{&?&`MC%7O6@Dm4c$_Fz$3emV-7_Kf?hYNN*T3DHhnQ?#6 zPl&_{g)9LcUd%dptvd4qw_fo;A+9FVRo|K2JyNRHiyq#MYH4IQISsSUVBWwgZN<_? zJ63qhkz4zHma#!N^%)yRK_sfIcnamFv?D1T6he2RRu`7mvFAzv1@hbiIcnbEbXi{+e_Wik=ZeXOD(StRE+_32YwQi zhZp^v-{sdtrV&Y0%blbPn3z0pMQ3`Zb7*&`QyiWetW-;rwT^S+^OJa?mulo z4aUT%lJg&7UThyNR~}p79%QT!@8QLa#{(#>B2S>Ig!!r47hAU%Ky3EWkf?1EN!9n? zs^Cn$)2Zu)2zF;=@f%uCy-OQH?$)*rwb4I^6YKr6I2Fzum}zR-5OPSHK>BqQa>>Mz znXn||glKnVEZReKS2#;Bg@|WS8j2iY{E!B-{PbIgie9ofSnSP>Wa`brU}@yqgZsN9 z$=2lJVD08h)ZNcM?Co`Gt!KPoHI?y`8NYsLW_NC1u0;-(;e%74fkpn@uAdC?u{vHv z8wx{1f(-8HCd;9H9m~3=Iv*w(1X>6Js0NVTCP}4wXA@wrPIQA(ijNv-;son<4KG_! zo1{ShHNjk|{fSiX>{CzuyHq@pN+sf7xpTBtDL!=@oVBC3XuTnnV}##znEMLnwF~cr z*251oH_J>%YgL-xK+<`q{Xbiom{{TO{f8!2CcrHCFAT_T#qx!Lvj-2J-B@1U;GaCQ z=<3qWeu6peRf5s&`xMYYL`P-HVh0l(&4gXDO=A(uhNi`5lan~Wo}_}GKqGQ;H7s}X zb_CGL6t8V1G84-S43p&jUfNsoTv5W>XqSXS@cFoDjHR=7-YylA`SDchiSSdOZd*Cq zC{|`OBh8Wa@D(@>vbH@noryXadpL_+Azb-K;akD8 zzSa7+hAA4O3|o3rv=qd;{(pQ0ns!p8J>5#XVyiF_hB0_Wr*gOEYr*|CFoHeD@D>>Bk4+cj$zg0e*1G;8hNf6ML}DL}D8s0V3>BKgt1ne+v7 z(VCu%bWfFM)$%tFr~x8c9?~5b+l=nb;MEP9i$0F1KrIyd)6v5>57*LmkZdm>Sl@g3 zi5X-B#HQq)xvBZFp>*CNmoI>(LHr$q;52t5o-v0->cQU1i35vQUbl20V@1hc=s4-p z)V|r){3V0w=x{0GXB&f&v~As;E|$x$J&0zeb3)J=c;Axg=MH9x{@Y}*p_Max%21hV zrx=35|KMS@DU}J7XUsX+c|=L$HR~6gbHWmmO7v0<9^?tbEgFF?M4g7*+KET~d^X}> zELpG2?#soPdLzBxgJ2!aD-un*P{ddAlhawz$xSDk_R_E0t3F6(13&)MP2*9?cFK8) z)NRvwuP{Aqlc&@BXCh>xF=(PtW)0Ty7VhfQe7rYuo?V|K&cWtCArOa?HQ*LVVEax?9BZOkmp%*k#vQ7*_e9uhF??^yNRq}i?| zd^Oe$syULCl6NA#V`w;Hyfr0fY$V1COF^mO^RKbos3W17!-Fle`6Z1>#s0}ZxLG#Q z>N9Xf9RfXduV%X#AZ$!GUY>Y+jrZMe&rAq1G3ma((3MV)cR|Jpp~#diZ3ksSwM99U zhHq<8ni10w$SLD3V}YQlq;cu4fh$vVr*KN_DwB{MIOQG*ztmb;z3JFBZ&Kx2Hl6HV z?p9C4tC_*UOuBqY@$zmmldbL}Lv|jbP(N1kVzAF$Jr5gFj-2Ag@{uc-levgR{a<JRffLH^&QqP2pP`S|c$#EB245!BV_Xgoa_cOrAcqaTf?{IpYeZM;^C7vo}UH+5Z0 zo9bh!wu~Q3)N_-;Ve4CmTQu%@Y<*+>NB?sD>CIDm$Im}@&-%u>zx>h7rzyvN;hO_K zefiCBl6-RDrw2Ye@NY%Vq)w%K>M>Uv9N9t_7j=d;N$JNSA0z-~PDCB#WpOjfh=$Y=}_-O~teHO%GzqXeQzVKlU9vYv+P0 z;c(?xbqMH}zuR4`xvAat^;=q_j$KGyb_LL3D1h9k@8mJ=VuiT-xKZvn*ln#`0V;hX z0@Ix1!Soo7St-vlqKPVuR!Qz88tfiT_uize{3Idgu^@l9vW#5T1H*o`lT%ju%8bi( z_FFt(q9Ck9HUaoGA5Ym8@Zz%MLKPNgb!o4j}SprR!*Vl8+cMx9Dt z+2s8#4~}D`;&f}MoGZnr9p4>IGl<1g8{mJOm5gm=i$>0~(urs`NGh=-APeCa~2pspvo@X(7>`qrcomMGVSX%}=rg6`$&&9S{x zm3)vsa-WslJ2g~_=8oKVecboaJIh&I;;xm?6+Ab>FdYFlMvN31Y$IDp#AAd+m1-7P z<5E#%0sMIJXdEbcEK@?sC_R=hPVI@C_g)b%mP=E60^^=53j2a$rWBD8pUlYE9W3%L zQ%9~HMDYCLy|=N92id%j48kB`dJdxozI-o6CUAfsK{Dn?fe|7nAwQl+PkHUY{R8hF zcyE8^1cHJLBz=w=6wgLj7h%9P>-an5NUOcXVd{b^LC~i!XrV|?qyna)-Z&ECQyrJX z)IPmQ456W{G^9rQ5ZeOXNc^7koq5FckQ(K@6DyPK8KD6cK1HiEl^;pQV&>?T2 zW?LvJL&z`;@VYrubu{N$p;17$qc$_a=F^n&av^z0i&A5>-1Z(WNv6Emu8JQ*Hn{-vgJyvT<+Z^MEvBYj72QF z5X(gWl?n*rWEU;OiH$6Bbl?RkEY}#XRL48naxrz(9hw*_q_6VS-b%Wh$r8*_ih#N$ zuX`aDBaLPD6t^=`lQNpBMeZ77Fz$w7*G&)izb|9Yb~ z>=R_4EBZ;t>Ev?B7#XcMHY_t1U(D_&>$r=&?I)}6-|42}g<$g3>i4yPnIag3?S7SZ zzwLV-xL93mIPl=;jB+Ua3bv8$#BkeQW|X$=d~)KG?%h*~3J#Zt3GJF^m=DqZHF{7+ zB3eDsolHeoYs7DQBAU(*7D>dR%Feg#s{XSvUe;MYV; z(XPr1qC&wtXjK|9SCgyonseEYOrV)hxP;MM+99Y1egQj``%raWunqH7+xvk^WT%z|cnio2(g=a* zz3%_=!S^#AQo^*($`R z(P&ky4B*$RH8vxWYS1}+;Fcvs8aY@SP5A!J1hO<20ih85YMx3__lJEF?PuOw$!xA!BUf=C9{J#L+x`#;Kd{ipE$gGl%u-FaK95j0F2rCFu!-=y~m|EwMrzFtQ`9&{6S!?Iq5^Tef)#`{FdGz`ygedv7-~ z4uo$0da&;MYaX(5o7_&r`GUU&TJD7bujwJI=WI2SFj%*9>L$N?$g!CXiHf@#7K&uT zyBhO;DmP?1%~2+7gsazG;Y9|E2++0SV8puu;s*VWXs2grrGUBin}@ta?cU8js_XNaQ}e6cjguqEmdo2Y8W=*NJ+;j`Jl1l(sovAv** zqi4a^s4e@G07#LKSTfU%J7~0@r=E2&WAhF0V zZseL-Cl^vEt3$5+H*V4W8^{=X-&q*jz6o_|DKW7VbjRAhLed|Lq`lb#s$+POTHvZj z2!zvY49Xk7u#J~^qhqV@se=M&v1oY z)%#G&3hp+ITWseDl(Rb}fO3D%s~f=s2R-Ap4ySYN63=03{MV=H_mU}C{MNMc45Ych zeDRGGwo#nF6d8&9yq8Y(o=By=zZkJlvFHIYb&8qdSCX|_@>d>Q(`1|)drM=Hv1E=+ zDTl#ezIWht<bKMe z^7Duw!P9k3Yc8)_kI3RLDe#))b<&CS-gZ9RkYgKa;1l{*QODVH z?CL$dddHr+f68{QI#lGw9A^n>bK|7rR7iM`$>lP2y-ESyu3l@m#g^@ar;6Q7ap=9eYcg)3(JeQ>(-)=qb-}bNOBB=Z7j*TD6TG$>fKV z$sI=9#AaL>GNTVbhLD7jJLxL*e)WM9ZA(p8t)v>tywRvsj5lV649_*I)5>a}h`dgL zQB*TcF{Z%T@WMF+=chIPNw{A$R5t8HtagE=OJ@+e>MpE}_>g1=zRd#48FXk`bo|M* zk68jkwmUWD3_4^p=f|v4=Jrg48Bl}1V(KlZ=_5T813{DCKLNJk>c zyM36a1{3!rBVPK3Cm)EZ2gFXM!_-uSxuY2J@uY=pZM1gQd711mIB zMgeHemRA+so9PeTTm5w9_R1gJR=I8S+TiY+u;qHG)4@w?LdocaC_3&J=)o$0FjK15oSD@~Mfi&tQ zz^aTLjM2>8dfvbQr8k+L#SkKvDDAQWVW(l`RmCJOZwSTBZ6R+lQmY$1JCz`-gXH1f z6HBC%J5{w+jeVk3HOHv0d((sC3WX$cor!?8o3NT_`x&Y49Xp&v1BZn~nx_)CRx=T= zMdc5s*DF{z*crrsK*fd~8YiMuA5$o{amimY1ae|rk4Alu{6J{$%4YzY+fA94+ejQl z1T47B>A>I|S{waKWAq+Y9f6#kDz5xcS>^6J+*p}A8o0avn6%895uC#~0(EIB? zKJCPby-z$e(M`SYhIbm9vhtHB_FAm-J`uzFePIhnCj7u+;LQ4+fj&N3*p`X3oXg46%gy-~2nR2ud4HU`8e*9fm-*k0d?aBB4PTdsE z^!~F*#;TEtwiAioufA($=93c4ug8p>I-%~9H#(YY(D?z{sS~~LyruTkQ$r6tJMjSD zwFh2yZYITfoSQluo}ljQedmE8PJN4{inwSjBVWjNtZBCycEocVw0FJwk&UggHy3KT;;Jk{q%#BNI^0Nu5#_Fl#@xdH(7mwg4o&~AGjZ@ zKbXVgty=nWf&~IyV02^SrRAgwu9UO6`Cad)0Lf~2KV06wAxaGIXZyL9x`j>o*Drs& z-idpcT5ori71sJw+qEvwQ&Jo1E|DkuBubjlfO%XitOC~tx`99JE7wGD!@oDeXD}VP z<~+W*t0Ke}zb8`RFI|aT)&Jc<9U=al^13pk^)+j9rHgwDabXxn13CM`>p!K7{K`c? zqw9M6-nyuM+>lnD`w2doKeO&1yuy{umzA%}+P*J%@Wjre)k%@_b;-!m>cGn`{PR~R zp2yVXZP#zNnbOU=eYRh(c!t7?zM!84uyinqf*Hs3jJP6_fCz3|Q=z>q!>c&Ov_Y*M z%FlS;a0zH@nq08dZIYT$PUNthx!e`tNq6~A&~$AiOCM(mCUq}zwQhB4-CW(ZdvwGZ zZtMw?5Zrk|BsE)v&}MmhcE&U!(G)C_p5& zZN+^Xek16i3>9cMC{=DDBVZL&_3(UZORl0ET_R#ip=*O(h0sKw-NkppwFDaEz|B%F z{sxAoy-{c7{VPtiAjy49HRu*>RV*4-!5u^%hO;y%Bo$|_Mr1cD{(KaxHcQDN3)#D35m+T zZXb_T5-&R*2YoN^iPm=(eY!w99N|6Dd&xy3!WKg+QdMYtDYy%e>u!lw>hjx(F+2Wq^p%QwOURJWqKQ_ zJjJipkdvk)KROZz?;kmYmSW~;7|UcjWnJDLCWDTT_@(8oeQ^g z>|JxG=k_e@yk^dMtx3M^nE6^~uJqsJYksh#cP5`cYmKeG`s|6lW9k!UkFU1B$o9VR z<-;T8#;=rzFI_JGdU@p1Zuy0QA=#`^?)ub5VI>5qX93GO1?j z!qPIJ|6fwn<3v{cL4Ujo@9h;!y0Da&mJz;tjVnBZ95|{o6g4SX-Rm!9@g>oicEVY78*7mZ^u^g6^ zBu-YmUY#V)FUQGyZX60l+@dkr9WUf#F6gapoMfYT@gX{jnlbREN=OSK8{{0K1tNi6 zw0%HyiVW~-olG>6g=Vo`-8k6L75g(rHPe+}hO>|8{Z=U-IE!;hKQh>mG-~+PmRE5& zMu8J?8?pkVKO01e{*IUc<)avm%oy1z7Dl%>aNkBv7fr#hGRSP-mC8wwzm29?>NgnBTkE|S6Znc)% z$=YPQz9$no97&{N!@GL_>B!2;k?z`Zo1hJ~CnM+o2s^q*Ud74n!(h%5|zj$ zkzjXy^nycr4myvS^b9(EAQl8}$fd6`({veT3b}5MVE8ud2V}9raf|dE)rQ*$GiU1bg_xbLuzLNAb(Fh1pj#Ozaac3G_C0EOgY$> zXoS)bohDQpg(VaCzHITC1ir=OH4h0JsK{0+wTdTgHC1ZyZp;NW+iuUywpyLZ&CN+S zzay6$nIF4hYvKeVu8-wpewRApi?>Bh?~FFVm1yzP4O=0L4U z>%KXjX*zj=Io3STNwZcrq0+8v0I&6oWZH1uG_ zS#)x>YCchq{6lNGjDKi2g)FD%RN?V`gSG@P$}3G0EIGzRoE$QiB#2h>QU>|flTWtt z!IMuu)_P2xGK#@JRU`F!r20=m(Wrm>pX&d_N5*-|sMGJz)bxzecExD)t)O`NbTLqy z#h~|@)m3#eDE8-b-Y0E-Nal0iL^xwfI+1phx@P`zU!1@M9p8m+6stzAP-tlw$k%1- z>)(HBMQw&zdfX8;F&rV)bMGspcE)5fksdsI=1e_&);eSN2G82ivv}x$pjU(hO;i?DSQ2gAst;WCnR4_2X88v$NSxl0oDz;ao}JBml8&KK0? zywT|x^9M2qj`A07988tk!;8sQk_6o4l&W_Euh=PiL5BdI#`Z=n#Yq-a4ec~3)%j`o ze7?%N|8cSLj7rED-5pFOkR*}rC62&VUjVr_>-+z9Ae%d0Lgfw)=1QIIg>5t7?JNkZKS+!~I(rZaZ^N4>MGC7Xn~Dql{UA9e-dk78%=Oldg}Jb&~M8UJ0q51`IBFH zrF9iZyVi|+1=De-v-#rkoH|XzKdT%5Dh>a1r*l$&p59)0^ikF~I-!2Z9c=376)PmR zwkB+R$W|BH^+Exgs2+M*XJfUab1w;*4J(~9hkNIq-q<)-rx!o3`)v@w+1LBsXP%*G z{m!L)v>ZkpsYe-w`u!hN4*`xqMDV)nSkuRziASy=bkmB=c5a?^{q~#n_A`&kD;pn) zM`myC%tG-d#lEOBxxA?+y;(a#9KiE0xp@SGEzHf2jV_LkF8)Wk&)#WSo~&=yKM0-1 zO=};NBcuQQC6Dn{j;!4zzeoG+%jwq)+>bm%6yfN6%_Nznt?e>>VU@>g3;!~ZEV0vc zm&rFO<`|81!W5&y?loJ46s$4flGswK-3pVCOvseXup}fM^j!ngv`pRNNR^mr0Br<{ ziUZwsmOAA8T9%*VSK0tXnf~R-LVh6>s+~g172-VC0YJhTl!IO&M){B=5O^qv6cA)` zH{E4zFXBG*o$>nuVuVti(?#p&A?0P|b42de1iQUl0JqHzhy>rBad@&>Ow4rLw&Y&t z!y~JE6`)WPJVXS?y*(DBvIep1b|L8v`)&@?Qp5m|oystu8>SP$m1kFth%y?(YdALn za(XT}2RxkkS55V-O5<+>fj~-QAQ=j2S@^|Gd$4F{e5ddh#PzrdVOEUjPb1~IWuis^ zJpop9=>ND$Bjgr{`NWy>Yl%oKAW#^wFReq#8zEM>kp@U! zoA9X_`7I+i6Ls_SFgG4EAT}Y<9qjua#ywh-m85Ds5_DOnM{18R zDjA6qr13Md;9!baXd+HBJ(w=JX$_yrW&=Cv8BN^PjF~f1 zl{n9;h^G?YJ8~uj_*t)!YFXL1$;7tR|3nUsV6l+goCBE#fJAhOX3Ab7F(=*O6g}_x$SW`a}Gaa>Fs|tBg?-Y~bb95`k!_ z*u%oFJvhJUxm_UEv~r0{bKGV1)pYH#cdQ=_+yhHP^N~1F1dZu@ell_8gT~6SYONk^ z45?$4eEgoLri=+SS|tQ$sj1?XrNP3jj+-1`8L~6Yj2^~VFt)7nY?pw)A@nzlyp_Hw zLMjR{y|}#~QJsY)S*0@zwnG2sai#zAUo_};u4aat?IpQf_jcVy^+A1!+GP`s(JI>BnOlFh|IgW9>IYX#Aa8KlU#`gytx)GyHwfU5J& zg5&v#$PcFCwL(4-01a~5)2c|UgiAankM(O+L3qa(w+`#KZwjD&a9oH5T@k53ZLSuVP<3Fsv*1IJx z;Dlmo^w+dg{CctXjZy|r!vECEud9jr*VPsGpOIMxNI%On_vg-UNd|}r z*IygXH(}guIFE15+!slqnj`p!GUO8LeN2|>uHMJ=->Fi%_buT*QC_;#`}dDL@@G>d z3y}BzO=RQ`pdXH)*NH?b_U=VwtBhKt4F!S#a~ zwMf^zA~yJO!j%5;o7q8o=<*4*B+O~WL!2=qGte zJxl$XNGMtgkhp8SFkNgo%^bHey2MX6vG?LSq^ALQ?5&=u*H>F5LUq?mt<`#cy+XVT zg}g9OZ@sBiYOPnYoprw7gk|P*y-q(v_NITGp`RtS=TKr}dA21U3po&`cDcYN$D9~z)$_$mZoBQhw>`J|S@uUyh^sQFJM6jb z;&KIvae<#y?oYdP9{lmM)lYF}p||wk_3uc=(i!^dG3sjoJ~R}n2fqe?@`LqPe{HDu zKORKF)NTGe=bWJis#rW9PA*#^SS zw_Fh61p&^26VKt>b&yeIneXZ&h)8(n+XW5@zsLOIaKIn=P%b#vvR84vL~@EKupr?V)`xEO86N#auu|vW-QjLBD?)wkuXCd7 zRaCv+uk#1rpi4{oC+hV#a}{Nrk!v0A7Af1U+&}xa_wD#ka*^u=buR4va(IByPx)E* zSt&Q^Ut7PR9bIInvM+Feg>PN0TyaHp>(jrHAKTjI0CgyBU{Xz}YX$Ekwm#a7sJ>k_ z@s_vLwmz!6wZ^WCejnS-mS5hM(R>m=ALd_|Kk&Q#+nC8i&J>#)u1ve;U~9D0zm=b= zP1Ty6X1O&#s{2|U|Jw$+|LD8qE0&pEOa}P9LicFc-5zc)?;7uYXa3OM>CB~*%g27< z1GU#p)&2`8+3{V6=4TGtqf?jsHv6V)@@y~sv-%zNFzEjQ!C{5}nRWaBwFyBa>gT*kBrJJe=N5n z7*`rNz9?Kdy& zzVTWKN_qS;DVP2-eYS;ho71g4wspu@U%o5@{OPl*}Dl?~-xumEI-E z=@=%|OJC+^4&Hg^!PSdj=Bw_!^T@?z0(5(YGGQH;=BND=TkY>E`SjR-*rt=U8ZCKw5a&&)oeA&+$6_9Ma#m>gJW6;$=l$e1|gs zGl!gI{#1;|Q_`|CgzHLg5fMvz3sXtHAP52hO6A*v^6H9QNxyU*8`3c3;nt1DAJ->l z8|TJWriSfAeJ)yw=JCU?Odj})#5Ma#s~#UN6XG5C49{8!BGSM^{MHO! z?w2Q~Ya1K2>FL_$X6^Q`-F`dY>VGlzCUA09b-s9=yVrK>*1mS_TUYf`UDZ|9Te>Sr zcgPBzge(F=5dwsOF@g(bK-$M5vKbHU02o|6cBL?!D)pdzRn6q~A82LgCOnFFe2t3G-R?k#5zZ72AM; zq&}xD@hENJG!^^D)>QYGmdB(Kd6%TgV|21*S5CCwY98$9#mytr#B7z z_3glN7umY71b`i;LXg?opfM2kmmnhGn^j>YHMd2=zYq~V)~3&b(Ksf&hQH%Cyc0g%g%U-~{gF$i5bxb-_bA)s zjZUWb&8O24jiwJoy`$;L-2-gYz5M^Tu5(_)$@(jc;TRHZxN5Hp*z2zP4~(Ls6rZ;T zymiGNU)YL$WxIULfMG$ zt509~R5CfZ5otaC^AnX5Y%>n1_^B(O=EX|y(cQ1`%`fAU`rOjW1#g%eD!ToM+Nm!dJzD47(QdxIdCf6fI(XjDtly1rD;QN+J+AOR z-3W%N|96O&kevbWNuV8a=0mNjVzFYx)Y0`SDJk_en6yEb3 zGJ6C(8=t)GwkL06-aTL3^N%?71fIj`ZBO3&#XVoddV^g3XY5DpL0cO7aB$?rjFD5; zC_;dd-`g4ydq{T-SGXcNNjquF;e8 z(U{vfzqviNHP(!|r@kmjZAr?(DNVNrQ;2?l&hK%Rma8%c;idVYE z<8nu1TTrXF5?ZP(#0e`u5yj;u`wY z79w_A*1Q7AK0tDr#MZym3;FT=U1r$cd)_{r89*qT zxw*Y_JL_fpgZ96VWf8Sp^_@uj@o~+KzRXtvXIrV7Se#kMM%S}6s7iag+&hEc? zAQU=WcDurw5!n9ZbYcvpaM*`W3*kF!PWEkIpobviD}h8uWJ;0?k}+1ZvD9cRG27CP z9ZQWJjintgVBh;295a-2cx>@r=kQ1pXoj5EB2#^rUb?~Ru-{yI+oi;cSon4k_?B#a z%9PvFZ^|?J7}qpufuI;%2Jy$R_@HcoP?@!xRRsG5S~gElLEE5N88WcHad++{0staT zeyy7}HuHe_$CsWlphAMAo2B`|@a~tiG_z^F)7r!n=`QU}++t&Q!d6Y9xNEQoRdX=> zA{BDz7mL4GWXFJ+bWcOa@h@0~PV|OJmsx$F(M&2d(Q72-S2O5DkYmK!qX<#yYL7l@ zgkE5^t;H21v~_Fo9gjlc`e>%OxEM0NT-=I&Az8?2%%5dw_y*0mk)$tx5eWe=hzQyZ z(53`+t*kbnLJ;%00mNjg6|mmuHsX8PXJt+Q6hf)MKI+qg10r1EONy?1i4MNtP`tw~ zkgn3Fbd6+=5mo-8pk_7Vz9_>C z7(bZrR(sPJ#Tw|QNsJ_<0SH}V0$el@Z2?w9`}r}ITcFox?OWgvA+k_QCs=Uf`yD2XeZFSX=cA*-_;tl7+zw-W`$Q=8#K!jzvuy8Q!|z|cLu;-+7vs0~p69pU7kWDU zeuVKe=c?JaTyAQ~9pIgdK_bu6vs%=Lh>O0f^6|=DoSi=0dzdYQxqiVLBliJFGGY)w zoc{H%`?!(hE~XvIDjex!lfEp=TnisNzui8+y%!#phTB>apF=_W{23IujsAM-pgyt_ z>8}Z^ZQ({~1(TgCnC?7!lpS9(b;OHMz8~dnu?-70wi~m^P7({6ybTgRgz*PIzQMi$puHaOAj6~=^}}g|xQ(!aJ#o-&Xs~%O z4q%QFkIxD8VXZAhk|(fpI^Z2DRkj_AhicR6%x_}saBRjtQbj?uVc+1Ksf0sm$sWrI z6JjjKM%5wx!ug5vv^P+hZpV7>iA~#m7tYU??CT+Zns%mGE-GuIxu{66$@0Y^+-BlT z7*s&j*LwMEf9T<3@%S;?y!XPHnG0uj)bsgzp6%N`KffFQADh`VGqdYTu!Xt0IZh+^ z?p>IHfF}jjo5O5fdH#jxpI>=^WtQ6k@3(b_3 z6|*e8(AW$g_|1(4Bz}F7$Bbk~bEj6XAvk+o+u5AC@WKF(If<&N->rFUQe|*_Ev)hJ zX+Rf@KcJy7Y_t#$8vkL;Xn3Iki?jPZBz6mwJTX1yIgRaam%siW<=#`f<)Nt|`Ni5t zjcCmKVRAe|2+UggD5S(`+Qth7sMfKD@HHKb`PubDT5%gJMeuF(eUPl0ZZHiIC$Fjr zkAOc~CLU?I{0!~NFY+w~2(99W(e{k3THRZz?5S2y^bhcA8T8$0b_e=3U^`&D#rBZx zB1 zjD&{#0ThuM2Rc})9m$sI#JZ0A@!}ByIg(mDHWsRus*03YZk=NsOhP>`=6YX-=O(6mC zkGQ*TDdaUSn(Nfd-f$+6j;5gYfe13>fKw~9q4gv}_}{3=4To0FPAp{oLINoQqRo*= zO0^Fotjl|cQ@${SKW;(t>B%AJXFa+Pp|ynk&ioXVh{#6-Ys)zfC&)tPDnHs4{t zS9iKS13}fE9MweKff#UG=SK>&*{EC6W08?~ZgPDMA#=(x&qzdulF}pj^R9>@kk*#n zAlcnQTvw2+NtIZdV5l|kXf?Ik1Eg?AFVkSa*=n6=ju67054lyBmI$OK=3U-EA|S=u z+4`(M#9k+`z*i_Dphx)3iRQg%uMFe_ouB^2EZ)QgHq#MSLM zV1wcG@Yb{uc7#MtUl1}Qc8}~sPAP55`*=+A`NbcVMivSU)!|76bJ5CfDLY!$V@+1MMz1)C50HsrWgWB!|HCAa%$Kln=TlVLsK5_ zXC@=kP{~{KCu+5I_l*qrtLuUxw--*k%Ac_G$%X8a#}6CpVl40fmOpPEJgkWd(jeLS z`T5*}ws$Ar{fuw<9O>YjJD@Kh*8y$Px6tFdran>5Rt`EB_Rl-7ywW+pf5G|w4WpwQ zMoxDstyYC^jzWq%if`xrv4Z+mpjk-UCTtyG4#b84!$TG`XS)H0HVwi0da~N#)EeUc zK&p(m7BI5{Cg}IdaXj*K_{OSpQZp1>kI*|y~cZ}w>#; z-_yI3@0QF4OPuyOr@b`q)HMx-SNQ6z3%9M4ex$oTm(}01C763rE6i=TOD8?puHki? z`SuaMW!=30wVh_aoz2c`R}X77vsmXXw5Ay=o9zV+2Vedr`0~@dp#Gh=Af&lK;3xem zBQKb1=A6#&x46G&ys6;s`Aon(F=xVm^j8k(EBXlY@4S9%KaP2^zS~`gxnj)$cKn=` zLnF|88-J?*4TK+$Vs0Cp+8hh!OzSpGYfgo5Xb;&|t~t%vic@w~21go*s0nMJvC&G! zB|A^0nNbUk4VD@({+6UrqlBXx!JSpOShn4K79t`Q1o{Q!6u}H0d%-+|={dJl1E2({ z#1p$fF$IpG1yuy%0gQ^EgdtmMff9$wIvN&iHCmXjNUQ+jiGq;k$aD>)6tfhq&sR0pDdHv845HAZzy#yM2EtmRo+tai52Y-OdUTcTS zE+XUf-m|pb!GBh^)6WV&W=s8RY}^R-KC)xS8@F%2VaJZ2zTyCO%RO$lybS3Hs0gxK zE{Twwa<2sPdV?~O%ob@@fFy(AA{ij|Et&tpkMs&iN&%NV#C0n`wh6;R-C4}Hs!5*) z6FSSZnPEce4oS|l{(WAU{W^=jc-p5cd5?#;<22$X`Rc8ox()%&uA9MyJ-Feri$q@fjlK2kXFZi9GNXZ^N zf}te%(wE&5CZp&EtCYnmC))P}vi6850-rr|-ro%akGn4aeaz>J`98$A=Wm{Lf2S{z z`8^qc+;x#R;qCuDQp#j3`jXR+ChtoW7R4n1CL+IQg)4n~OSdksS zVb`Pa(#dM)HLvMZPnP13@*EQcUu@hC2o^96Bt=1=0uh=tBFw-~CC5jmgBxm-g~DWQ zLvVUzJYE}`Zw`!Y7#i9zHqe|OIyXn9*$-q>zS&UpTpHR;|FyboPlYt}FejCrsuz6&_6-e64y&qc#)=K`l%RFZ`>tF~tq&VI&>u~+4 zwLb^mImxzql>($yMrlXTcL>42DJEU8LV^6GQkfl_9~(s0%m8R))4b-}mC9VG9nX%9 zWxdg;R}bl_FsErisA6r4t&L+tDmmU&b zeuPg&=9Y=F&-z9aenI<&NPMfXDuZ<>s~Kp^&NYtu^;TBtZmkl1PR3F(@8`QqT{N5L zPCtVfLeP6k&9Z{~JxJXb)t z@ir7W*1BRJcer8jjKHK{z=7bgyMYp5kzB@s3^Lm7_$MrBt@nR4!SJy?4(8~6-yt}T zEfhz%+W{L#gx%in97rR>Tn@woa%#WO+$@59%VBpz{-lNM>@(4;z6N#B*KXaJjhjj} za|~=v|1=|H+EB0zb}El4CdjYgU%EG-o{lrI8y>%h!nvRF)(2a^K>$-#2+ zI?qTlIpXnVd?@>;LV=$$DLz=9Ak9u9zAK(c9P%V9Nso~>61U~^bbPM-_m9N3!G!LI z1bXV`n?F*ip!s}Ux7%uL9CH_PAd*FrWE3pN_IJMXN%BlEVa{oc*D_h}kaG?xN+Br6 zr$7?`X(k!ev_YsOmZVbKIar&C&8hqCM}|K30k1KDz!#DHr#?1x#J*phi_O#qorwK) zgWHAN9@hK!qyNgLG!FuJKGnI46hWgbn5q235t!l$etysPfv#oLf1+FdY z@B7-b{<%pkchgaLbA#xMMv3&JEi3cgNlps#yR2)M^@&3ed-VuejIhq2}fw$UI0_K@5#hm{GNL%uW{Aauzqj+Q4Jz8FkN`wR~I{I>O} z-b!lyHoiCyW81r(9e#?N@ufXpFT{z=LDvvwA;y|mLPqaNH(jRJVc@JjCTlM4FqCT& z_LvpsSW;r0ShX1J1dG)e%y7Jh8f;f`%a!Q?7aJR6u7T;w=)TEeheOh9?fq1r#49yn ziz$J$S$dIG7_-(Fhy42B8*+-a&n%zD5BK=v=M3Vk-l@KSja7Gqb=e_4zxnDwG!@v< zn*ZEije<6GdMgygn5A#z4mpsp^iErTIr!EU%zYJ@qjVN`$e5`>YJkhYUx4^n0a!PP zL1-~#PZNVW$~>8j+TB>$*j4)nzqx52&@wYP2kTmUh2QdTxVY~o8rL(w1Z;nR(-wHI zB~3AHtx1}~2_T5ftoIQwOBBGG_>+O@UDI#mlkF;~jgb%4fCiFpU{5zaSpEX%HXbX- z^7$Ch4#5J8rWrt%46YLtFebd@G6X4k^5ite!R2&P!%mw2GTfkMY zbF@~wHV$pbg)_s&YcIXiOt^Ktwsh&W#bIbeZoDvlZLN2lt4atY(0u&9?Fqj2ppEcZ zkQsLHMD;?vlLK4>e*i`vd+6qAXNnpRrh~zBFc3EkIS30#G)VCn@j!v?3DK40fd6{L z#c^EI`;pt_@O=2gy3+~m!8KHNy&uwOtDgxbaqmL}!LQMdyloz|*5}R;a zev?yu>(VvI9w9P1x>{Cmz=O`-Q<^Y1JcyVDPPTy#%YxWD(HrW~w*lr^YfXd=nU^pt zLU}g?A{K#fKqP?bqjWt`fd1%5t$+VyeRHF+`R!`He)mGJ7t$lzMTc1VQ19KF>$vh^ zHGk^R4Guk$c^q{Ud^U5{c`-wP?RF&w-w}EJJ+j?k??gu7OX6|QuIy`ZUnX*yU)r@x+do;~sAuHz zz`z}mBe-veCcQH{P%aM~A1NjhiLYn)8ad5*04K@ZK@rme;47pJO5kk!>aDL#4B{o@ zrNv3!f&-hE$^#EmWe*SJruJ!g-M*>%h7IQYISqbhnd<;)c>DjvYvPMJkBJyVU^~r! z%ZrrRCiqV}oZOoXryt=z>F@*LG+QiG@mmQcckD=pD*Pltmg6)gG+%$k-UHto7_#_z zS91Cf9oSZmA6+bGy+^m~J$BK8hi$yz4W5OIj_uuY)SI)$Wd-f*+q3~5mM|krP11SO zx3iU(j3@c#i~o@S?5E=o|I0sqLHz8a{W(tS+kg+u0pOc(04XB~ypsqPs}J(62EtKt zAFt*(S0e%6D_Ip%hIKGJBQtoCijiwjsa;3(FC_RC-Cp!5G~B6L3s zxD0zNf~X?V`{CjET6pf&kZPPAL3D-5DvCoTH}m=gSd!~*?`!}LiBiHh497$SD~T89 zP#~coE4wCNo6FX7ctZR11I!1HJ$PUWTmC0I1EtuWrs6I@1Me_u7X%nv|Ax$f-y3H> zmnRkpN77SYW(a{Qsv6t+hX09p4uaj-?Dmg9z(%qv8V{4^AqhQX=`enxkWySwZgQho z?<@6 zT)iJJUp*%6bC;zDr!aL5=QphVufKtn`&Y?QVWJ=%`>eTtyxFwo7utbUZJ$yvx(+VAf#<5zM>}bbt)JnuY@k$md2tBwi=e1aSrMDF;g}9P!naWM9ih zc724ET#=E=y)FI7VBL^ zb9f;&0)+8HfHfe%%3+QY$OEl_$ru1j3}eM0e>uGtw)tq%r;*IluDz()hoHozmksuo z2d9TOgEwHCWpy%tz1yL|arFB9q$+Rb?;E|o5)4+ZAKl{gxO?v-u?4g%kp4E{g(%uCIetbW|VvlW`3G|J};^i`;j<_tle5-lVZRuK*K9gVpfVzuM5 zN%o%ZomEW%hi8K{=>fN?YDC(2r>R*a0qY82!QM z2EO^Ht2B2&xDo<-m-ax4=H`Ii`QbH%)UW1TUFLHY@Tpk<*Z-Ft_Ptwm{!XJTbACCcTL87XAOo|y>n{-j+Ar=nF$OTRig=--o7Yc*zrejz@k&X#Y51etMJ807K zTgm(ZH-U#k3_YHKi@nd`_7&|aGFWLTINce&zi}WtrB;L^gyumG?bKvAC(0p@Plflk z?00+RtM*5b&B^W!OJT3wANNK6((i(=d@`i?JRw=khFL6>EQ)G5><^1dCR|oU7>OE+ zh>(f7XbM}Fi4~APcld^NIm3-)=Zf3Nty>mcfkG?;tD8_dnghx;*k;bQz3;}` zdP}f{#NP^M*bX(TwOaLdD(Ij(tXb5#WYtM@sma+;n^EJ>&Q`Maaq~H|4@ghemow8M z<$^3Z)6B4yh`09ug->Khypi5f^f>!I;Ucn_i zJv=D=uv0((*xoBvaJu&xOF#WUz4Jq9aPEq|$4uCHn)3%b`MH>usz`%`xF~%s70lrm z%VjR5yR(+b)G}=OlJ(;cjE<<$&GUOR>)*<=Rhnapb-IK;;g-F~@6CgZ6ibD6262?C z2-o!-;&icuy?5Hqj`waif(ZM$dpAu5X%#opcNMuuf)XTb4%!F#bCG(4^va`*BEl7l zDjaag9n!;!VJHFM&4i^+dW_Iz_2C_2c*Nx@vdQ7PujFu68sd)LzYL}(?wc5>y5p)A zdwbO{Z1~0o<{t`-dyL6vwrpCr^{S0b%evi}ja%1k+7cUaIO;yOaf{zxDrr6i;+fFb z#wX;hTjf?OI_h*5sLgzFaJmr`BCEI6AjCjTBuaqlA%xH!?j^^NgZ{f+2fIo7?g>dc z0pp(KWqd521ud|IaRg`2C=wM+Hdj{>2@GL_+(vAS+7{3L{fqne>sxC_;pxMcPt{W1 zTDM#CrfR3Y|9xr)UrSuZ8|VJ|;Epi^&?lJC)PtBHJbq(6BqLn)e~V%@wd2_xsj4Vd zQd=&!+b`des`kEh|NX4mI^4>RO44Yy)y!??NB{4ED{S&=TOGiZG2oa?ZW> zJg^}MW-=>))d6XyL2{Cn0>Y?KIxrl-0+d0?h?_`uSjrX2Q=9~v=5Hf}ds>G=srtn1 zf=keVQW+HcjhStA9L2XlYB=0z&8?p|ig~-Ekj(3$Jc)Y1c-iA)J6ki&6xURfcC zxU|G!N#8aeG_@ZzEe9T)h~{?NAnL|TKOK2&3*@3(GBcOmaoG$z{?nh&n@$BAbJXGnlLDM9$?WHqH5)Wew+Y;7Z=ai z5HsV&mD5lSq>Hh;_w2blRz#fmCDuhifBew;Hrq~E8ZtZHa9RVD52siXY1f3GOg-$U zMS*CaEp|@`n!8}mJ)z4+Swyr~v6T{yty2v#Ew!^EysT3d_h$!&JVr_{Kd!^NCH6s2 z`Im;T_s@6g?w#l%f}?mjeS-sEkmlSY#+8TI$YuK^0bcFLd@xM|>KOnYB6LwutL0)F z=Ur?(nya}tF4l6<`FU6G+4+spe2vY|&!gBZtM$IRabqkuHkOZW+z6XmfERvAjd#~~eW0Gc{D(ihoc^hqcm{n$IF#s$Rjqp;jI6bTu+;0O z)dM|i&W--Fn7w_SJ@``MmR7OXhxe|70?@~!rJFVttc-$ndq2$U@7GB6okm-hEv=x< z55Xw#YM%`NWzaY9BHa+JrWmx}pZFE=B)!jhqkG3;T2Q2=_^V-7Ka$%V@tv`8Ty7ia z{fHYL+`f13=qTDw@YI|e{V_TZnB0_!W2At@xG)2UYeI&uDTNa45Bq#y8%B;|m$LiS zcF}xe5)RjMFL$`E#XJZl<)DmSt4Gn*qqAktkz4lk!sxkf*)$fmF8dHmbE-6lGa3V; zr--J5x`aY9^^rtB?hi|V#4G<8xi=RlLl=Y|8_z*+&s1}l<|HGoXXEi~`AS^r|DkeP zTX^3JOH;IvCMW;lrOk7WtKqk7-`iRI>&3CT$xFPi-?VQ6=1zm_oBSDg@j#~md<)@Q zyRoW54)-4pgicmA!uj{LGh42{ddueV@%L)5_ay+yn}>ztr+TCW|z@;8x!_a#<6Nr%BU8I}a$7L9Jj>GwlA+-h1|B?z=Cu2j&A4$MynStmI4qOnGB)~j+CYyNqZ%pt=F@e*f8s!8;bD66`2fz5f0}g1NHfOjQgPxd|cx{ zL_B!g`~36IyPh9;06)Ed#&ygEizYPrto+$|)rW~N@vW2dHIzRgSpBFaiUV@@;cYM% zx{NE7ed(mbfTwkLn-n^=ty_bvVIahoaedq2+qp{ldbcofc=1*#6uWhC(^$(Dq8Vwy zJ|Fn&F^n#kY7;pP2O21}h<&!A(vCyyUC>2Z)kH+mxHrB#RnP)LaRv!djoAW247~By z%%0$R)y^g3a~FZ|ifE#!h>=z$-Emhv|FR9{kjzxzF6G5v((HJ5Bi6?abFy?t_W zpoPp3lHVr=TN9lUNjduPlIE!l++xKd0%Sp$`~JG?_s=RHX~Lesr#7@a&wAJz=)cyY zZaFtF!2E0Qz*>8{wevvJ6-BZ)Mv+8?yO-=2ZeAki85wDWn z{pJfVoNkuoNh;)3^35{p1@;(g4zs3Aj(=?Vp=$M^6}0ute*>rd8TyFgN8r7tk2?u~ z0Ej_{mB<|)mYU;e39KZ!$tF+@rax#8SlN*Su?I3Opq_pMkBll(Rnl5frzY6<*g^UR zTbfjr)nQ~rJNJ_62{tvEUwWFnLaHaSigunR2E9^S)7pwBDA~`m%UKa&lf*xCN%Blp zW?@y=|K2qEu?x6HItHj-T5W{TU%ud)^57SrdH4SD$-j@07zlIs7r5_18&*r+#Qk7- zR=XS#E`Ud=oTSYl!@|gQk%zg1@Q6PeLp-9W|4#+N&ip`l^bjuPV~Vz)Tphgo95T%2 z`GLc+zuzvKMd#W;kHT}quQuD{X2;-w?mlC4?^x0b#R6#BF5;{r3UQZ&uJkO{nKd^= zP-g_K0ksg7ti+I>k7J?IW7(Us&)+uI`*xNM4{jT~ZEPEpP-K;SnwPAZV*>fGvGm_M%*u58>;39UabhbJ=0ptqOgCLd-Z81c~P`ci;njeZt4aq>U8$|IME`HZ%>R)KF4R zrQ{?I@?+_-{MrI(ddR5NPQqqc+$fDPU*ZQ)N0K4yD{t*TE48;!OtZ7&C6a6lqm}WV zi>n%J57s<_iJM`@Aw#0`J*#K9VveUZ&$wLT9BhXgNI7AuEY3B^wBG+9U<{9-f|)=j zd^EPtv0UtH#I%7G2?x;7j%4rGUD>j=ZR#Xmoc;5HiRWXlZiC> zhS|{jk7TUoxw`jpddmhna0xSo_+#`CamU1_5KT|V-Oe)n@zPi!y``f^Vc3FYyaqRu ztUXE|7bH`+sCG^)w8H`-N|5cQh$~Ojmdcc7ZgG7xmAR2J9qt#F?!EQacQ)5UjI(^S zoXqsTOQlGGc$H~K3CNDQ+XW0a-$42Bh_WPWmK;~TadkwW4<9T(HuC7k;+!T&fClmv}YxT%-3bE;o5ww|l&QKwWsQe#(hCX!;sc3~WwW zlJu!7Jpld>5?<|{t+sVmqD zw*REAA4a@Gp)e*k)ex zB5j#=27r%DW;skX+id!#*j`3KH^_DrX*#m3{EFwi zl>jAkq^>|xs}P0EwTMiJPDqE<4u#obXZ_T9nnbWovj3s$CoaNx5`otGtzM5Va z?-~O)I~Fg;=h6M%miw*~CX_ZClBoODE(08kY&Rt)DY0lQP#HDDAq<<2ndUQy-C>V?rSR1pB_ zl(Pzp0-yyHVlIPvAAVW2y{9^_R;gL1CBMj!4yrGWXd?kG36e-|K@09|96G>5waKo@ zH=5;3eVNP^^R>>)MGz-;!v7cIh2l_tO%%+m% z(aDL0#&9|_G_-qYER!A{XtlQ`{DD~D$dUIPIWor&*>PvNa4I#NaSjbRGsCGe!uR%W8c1gFIvauTnAiPHggz(O9vN3%)(l=1%!wy+Hhr%6ZI3SyemF1FR3jI7naW(iAk}%Vv$4CS471`m0J>ZO&1>GNsXR6>l z0`8a^u*V~=(ADS5hF9J`IUR648;hmilGpv&I23`AH|vPQ9g`N{sCqow)Vf80L9>rn zWqrVwVW@BLQW8|PUfBMY@VNJq$+QwdPi(TKbch0G@#sNPjb(Kav(5StWTDA4whdp+5N8J&1{jo6&x?l zLcKlzA=WV#j~1D4p=`nT70|!LucBLmaYp8v1lvxZeg-~AcsC*})oP2~F8YJoa|*Q7 zN%RSN-Ud{bgIp3JhQekTgJPC-*7=wH>uB>&n+|T;bdb5MB5PnQ zEQm}ql@kJ--^7JkYtkV%0KfD!#e0u_G?xerk{@9pk=t@;%eOyqY;rVM9EN-6a4|SK z`A^)b$D5h-=EJpY4S(UhcQVu1vgN&R-7|4%A|Kp7Jb(G+^TXRh`NX9Ykcjl*pgC8- z-?YhOjKDM?jM!*rPMly%C$2qXyLQ`3wfFNAAFozFervhR#0q~FzP{hL{RR4hXE^ke zZ4A$3Pd;}%k3Bc6#|+0pqKx-CgAUk2i%Bu$tr;Ptv3D9`4Dp-{kHau3!)jbKoZ@Yv zWGIwmRcDB?pzDy+EjhX$yTxg@J8vr zN(m{3m^?T`o(zL+$~l}eg63vxZ>!~GI43)D6(|87Pt5E3E|AP@Fpd-{!XlF;=2?gj zf|Ersx<%CWi#(o`bLDbQ##8xvhtvt3**EI?Rjc&$zq8ZqU7T*r;j8*os0p1Kg-muF zfFn@Kkf|At0K3>%DFS})D%!GJdhgRg@#@39=iP2rbhA`Y{~2Au26o>QZo!Q|KAx*^ zT*Zj4QcN&r4uQhPuchmT9JfjE8`vjnc_1f5Kk|w}h8OY1HD@S-IMCrlC?wXK4<5E? zs=YqLfE9pCiXvCAFD}4FRc6)5LcMtyFK1_d0~&h;zEv~}`&p+!$AWfJr*1)VIQ4$R zdt43Z>dGy&I+r@h;yv>+CJR2h(#}qG_@9nqpg>$|D&ziJ0t-Eo; z?qm@J`*4_jbD9{POA>|vR1AO+rZyZHzeQZm>Max=3^xEdv8A!W;D9I@gN5PY{GcwC zqQU6ih57xjf!0KIy3)yuUw7TU-G_e_4Tj?Jq37Bg0^WRUs4|{T{EygZX?Dj&n>O#2 znO$><>Y@F64_|uTL^{(-qnUtO#3L@VE=I?U5wn%Y8-`wt))9~-w4GQX<}q|74Q>ue z$g@f1xQb)=-4|O8iRLC|sYEjs$3^SBzYkgGTV+}DOn7}QP4kpt?s&xOomBYYpo%n_ zn%4VCBEiau#3hNuJ&DAoL}CVkuG|KLsUu=kov}$Q53^Q&!fce$Ms+Ugx9R$A5Af}0 z^uN^me}euYUH{NpdTYDwQHFKqS11Y_XL~R(SrUR%1Xu+$7a4`nY0f&Q6U;XABEQn4 z6HcD-$5iM*I4uO*t2#|C9$oiSe^9>+76ehN=-=Z~deU;{%+s^hW8jZcjBoAW5Gf}i7>9>H$ z7J>#v4P|Ij;L0W;)uW)PDnnvP+@j+K4ZcVSAp$o9L2}_475DEwCc3B=34!w^SwQ40 z!H!xq89AQp4DrZB0g@6$MLc=~Nu1mo!g451%FKkA9mqRmM>Q__lT30L_NzCe7#S*2 zi6|fymFQOSMu&vV&q#GdwKx!NBLagNsvR%)g^Kv5M=K}}8VG=VU#O$!AQ99j*k!p|r^B+v^L7Aapj z=m*Tk)f<&CT|qIwgZ8)@CV|k2%usbq9q4XHE&|1ULDH{_^UY}DyjUz7T*uPCl-l*- zN~(HezFr$`?XYk1DTZfii#naVCF_~W4vs17k$_8-cF&IAmkS2PvBAoA^t$5iCaamW zP@X~*asSxpy4~V}R1QyUkwo1;R48PF)9NJ~!)b3|NZa1tp(KnA=MSjchhpJWWjexX z&mVvYAX>N$ylM#q`XWV2$AI7?;MYJl6#*>~3Rh=7?a%x=r(oDu+%5sP^l=i=sv%hMle}?&jd=rzVF-XnHb?~PTN$oqAfQf0m1lj*a}M8B$EdxHHj(1wd4@uq)fu5vt;ys42#Y|K`e_3%Oam(r1t{_Cqg-a zG-E7bl%R6w`25Tdkr#BC^vi@=Op9B*4WuMcH0BFl&kb-n<^j?nJOfS*%B2)zH-5&^3oIRG*>D=>yMGOG zY04W}@+gXD4gGFM1XIxOTq;Jwf*kZM-2Rwzh-e5Rrl1?BMf`}DfY(J+2N=|PY}u#l zzFyad6w_%f;nQ!_eF+>L(vE6AePsoAbbNZbtiyyHcW`$^I!fS=kBzl{JVcxEuQe$_ z-WC4-i#gv4^h!O{j2OT2hQr=p8IjlWZNx}OiNMz+=Cq03b;-BS|9-;+QHXp z8GIF4Z|5LWYH%&_HrsB>V0LyiEc<6-je*rklr+P*LZhxw8I`ELhjGur$!=4AhGL;v89lw^&Q2L9M_pWa)h3RoB2&E?aJv>G1f)jhzsm#*2qvgD9q z)C{A~Q_y-y@v$c>&V%*KOO;~(LtsD!4!M+RD6u((775z9+^b|beCIZ4~H zW@sz;uW7xLnoDC7nydF>8U?3mbFP_4MAIVl-}}zzH0^VghjlwYkMR8NHsmLToxjTC zpFoeXCSxYaG5XR4l4GC^n42IZsZpVZN*?Ka6)PbMS$#*gmd)0_?Dl%yy%ik^&tdeaBC!OY^@H^pKPaRcv9c=eOIKj1#;=JQsrR^?}ekxZc_U|Vb+hh%0g z59|TGyV}A!0X7i$et0tFc=AlNi)c!U699W;@E7BzoCt};_PYZfJ@B6a-4k$67;^9D zlB9~tzv=qFA)lRC29e=N8-pCHvIWVUFt`;_6i3B3%A=8>ECLjUzGG(yY?`nuZYd2| zLvjIAwi~tVeW=gS1lpP4m`i~gC7S1)i0dykN--TXm_rfgMEMqqoR!pl>!>e&=?*ZQ zzSk4h>cH4jB909(MfyR%`@`-)z`dU0Q`wH#zQ=sfE!g~^x`_10`#`mU0U=Y*=LF$) z2D(L_5Jevl|IjgPY-a@N4%sYX!+*kv^&!hP>l-LeNeruY2#{*tw!^j$YxZi}QQKQ> zx8goaBCUdx12|U|#9SKz^$EWaq*3ize<~y_@4VWNdkg6}e^@ye^sBsK9JI5g@i?U;}O&7v4NC zA!X+Lf)hf5`FV&4oD1_Xosw4OB^@X8IH4(mOCZ^-a~)uu&+F3yBu|K>09@YJyI3*} zl5vnVmKmT6DwiO5OAo>x@j2KEv(Klit->R*M+zdXZ;rAd`MvQHZ`TQPl z02yAHoXw3+?p5d$dS5vE1#G@a9EzkHh7(gn@%uy3U?32TMtmUT1-o-3l}_xKeP3m z_pP>LNAEp1+yE&JEqJpp;eqqY>{emOWkTi~*M2$%@A-4TYlk&1Huk@O-vX4kyKSnt zxd4LHlBg-%2-n+nTIDK*Hp7tMw+e7UR@ZzfH3VH=zw!n}6&KiJ&RQGu=5Y)Xf8Y z15V9jypM|({?HkOHL$_L>j=bS00}$;<aW-)qat-r` z5ZDq`$UcBuL_CpV6c1BIgl_?_!ylN<2<3EEtv8B3yit)uKpg!ys-hPHB1jtgZvfX<{eda^*3qYU9kAvK_v%2*+Ifo8oF1#&=^?Fu5RQxajzJ;81Rejy%VlkEcAYitK>Z^C-Q^isf#o)zD^Ynr*J)Wr^x^aOu{0cTi91cOc_LY^KBXW%sk0#x>G z1(WPzGXeONRegx`GdLX#B%HxuLI^tp-mhh=<6Cn%M0CxjU5dMzFBI}kx8lBSs$!RO zIoV!$7yPgAcdOl*Evhbiz&~J*#j};EczG5df& zV0Wp-tkVtw3E5Qrp4|p`>;yzkz)F>(Id4F$xyz|nSD{GQN05TRlVC|w6-#p3A_^Y_ zbdiW?9K-b9RIza_M;K#(O8BqF8*dFt5+ z{aoZqyIko%<6Cb~1F?gUwAew`pop3llw=TXLGdQwH|)$Zv7(?R3zLUcTMJYcB*LsX~2ru?rz$5LL;jr3>ndYNH~~LY$@5J+=52WkI zoG_;s;8`D8wLyfU4@{?Rkh4Mb1pN};;?c%-z8Ugi?ae#y96J2q;i2&az0{7+z^4WL zC11%Oz}JANln`!K5gMF`y!HY$sa|kx@5}Z1t%nb9ov%YM2Bys!a0LyQ;7G(`QBi(f5{7iKU{pB`X4oZ4nh>u7FJIk8`HZg>&g@EdhspwAlj z`CHOKs9YvD4B3=5k^BLR6C>uQ9+Wv(Hr~jSf{ElYBnir8I?x~KkLdbGTtz?Y_z(nB zk^<%0AQT5Ax{mYH^);IJYtJP}YcSBLS^0!ufc3exbm-{kcJJQpwuxtc2Y&glz%P42 zeUH*CB5!^%mnB4vX%t?=6SsN%AQC#!MYKpcee^oJJ(izdpB=eyY|!bPy>eZ)4(w6R zjbWRQ`xVzu zzL^7kvz}~~%&c_idWZz6D_}o84x;=kl5|Saz9VUx^c_w5n&1#_gsl07W7xb1nfb9B zu%S6d^gk$nj4R2CxYX)patj!TS#k;ta~M<36bV3w$aRUTwO=c*V3#0lqhaiGN~(Xe zUzMEujC$|)7)nXkt^K*76Hne|7`GV!pw5Gd1ZE1CEm<+TNVZf0)|j)M$K^`b+TOy) zf32?#d?-mIgeigMp%?zI$Kg8N6QFPVzuvpHKA0V10ri$>I{|sjtN#7W1llU)b%wA-8*U(4`Dm?|3`j!M%je$xVXJ=W$UmuK31Wc0iz@C_riJ zgd7Tp3}tVooF%<8l(XcGlFRi@mrMGzO9AqchN1s7z;1z{}Ize!ZwzgHRHS5bVVyB_0T94?x&7ui#uKTLEX&yAUjn z?(90$FbHhH;qG-{c4QDVar@bp3UB~Ohpi4buDg4G^Bu$Zj_xD#BiJmRmD$AsqdU;5 zA0+&13h4?^Ib$7QHE^b`j;LWpu?;OcARD61hXV~nj;M>{F!3aEh6=a_w+YIIc(^c7 zCU``cIH@>m6ERKlI}b$cYTxPff>cptz(BxAQ%Lo2u{SKR{m4(?6+%-XVWUu#$^%|S z$3Mk{ElE?^RCXq$ObkJ$v2;CUE31ADa2tfs3|~s zNR}x}7`OFMp_C7i^aXTBc6}n3KoFr=#BfH0Jj)4gd(h=$=|nj0)eUHdu+r@AXf*jb zpA(!!AGVWxBgUznKXy2*N%5?*%5@%&vsPp7?G!=#bt$ho>tWWf`B$$8kS9 z#mXdQA~F}Fh{;H3jZ2Tv7|e1sgg_hFY4H_@ISYYPU$Da26!z&F^I9Nq?ltB}RbjB0{1Zs~CLr=lilSc>lgVUiZ;F=&rUGY6 z`50Y-%z$~&#jx@-EPXBcdbud8rL$CGn&EO8F5@_TAIUgvpy`*mEpcCKwhpnUE}(hK zS2Siz)>_*TYtqm{^I3*hz${xC-?<yzo8ZldJ>}vEk^s#*6n9~PyYIU+>HsKVr#@ylttN@eXpt;X3)ATE3 z`3hb0YVIo(PsUIVxN)o>kmUos@PJ}uJjxYrjrrW#q$EyidP2v6dV|MvgDTPKx#iaz z#`U~>jlPRw#=n}@5VHYo!O|>|-v^c?(XIko2wDhdfoTCBQb+D$@K8jXF4Oixt}=e# z67aaU#)!< zUGGlrBj8K42iG)YzJ|mm%arSCId)iIsLaaeyt0;E!1SUQ!`}Dp6w9mtm_#%gbq#@k z{PI(HeKgp5p9XoKrcLg@;PqRlbr?DcPQiD0>!nag!02NB4U3&C{W6{S=sMQSN;MKe#y>Dea$Ti6#VXG1LTOBa-RK811LmH%h(_U1B z0Mwo)A40f_!`VLV6K<;wGoH(-?&&3qw0Q1x*Sh~!_HJ;F8!#FilWL- zofiI@LykY7RRfwq_%9AGFzH#z?jCB&ashTsK}osB1@i-0h>NNh1xQ($DvMeghjCGK zIefa~g8hC99@9uqopn#Fspz9a%zXx@_wrcbUuKlQP2mmY}Kpa_}tW$bFKw&nK zSWYCa<6E>1;{)4I%zmslP(P5nLh1v!g?2U89B=NBr0EI1O=}G7ZSR!U-=hkfa^}Cm z_x~C9wKVXRQ?|`EILL#Vf|jKUB?Ne(X*NlzmrwvAfC6ka#_E*ShfpPkHES+8Vwxzo zAM7z9kAW>WXkF62;SM?nZ1 z%jbLiaZ%ae3dcrbS9#+YBRs=*`!o@m2OYo&=AIoDs)=Y0n^^WW>PRdY6V#DtZOKLV6BdQP!@xUG=#2i8HlU<;L4uB7Z{!Tz{Qm)u+ zw_te=EigU=8Do(P4e*822_9BUF$8L)o+;s5K{279N?b4&q@}DPDG*KcIhcCR(wxT# zp%b`?DE!rV5jxW<0u7A{xLy_ZpZLY2Y!+Eb@4h?bQQ{H|6QSJzl%kkqf+%Naa!95Q z9XdD}nXEivz37n=&%$y_mRU$lNQ;JQH|!wU9WeA0fmf-ukMi=h(^YY<6ZZHeoiqNeCvJnW~;+lK{IryGueKK(bi^CXlcRArO+V zIUo`-f*hhm}_6(M@){r>DE#>h7xd z{pzc)s&sOCBAz|T>(Z?{-7M$pbRjpR8@>4G9O{b4yAbl=HOA35F$072+o!=!L(n`r z)%}>t$20BddseZ9=#4<0z_3kCnLK>8h%!{kWLIZq-n>jZLNVd!Pc(M5yN{h+NzZG- zspyT*XPU6*dYQubiw1QGYzWw-voUmc79Iq&4-YaxKrOoETq$%i?Mjwu#f)&_n`p&a zRz0rB;TgKZruIwf;58|U*OK$_NYK3l_Z(!vJu-Cpl*USK4^zCMHw-=E9_BEKwaC0= zEtN_Ya=0sBIvN|(sW}-xkKVLwPj{)*okhouB;)yXTy>>d=f`lC7x5)(&Ev?kn`d{* zU+NsgP6rP~sJKu#*Ivb_u1`4@IC!u7+w}t1uPV}O4A(IN(cm{$FdX1FjyU6SJfXQyd#iTu9UnZWU1A^ipKdRmf}XR_Af6RL zx%)i5cWivGQp*;5QdIF`@5s?}mG`T-GCDI4ec2)ZH#`CU4_BMPq|^{nfWg9W#UHI9 z*KrgUXV=U{VeWaNH`_S<^68D)-WI>@$~M2{K|iVAuaj7kX5n~mZb=%Gu})7PmFpQR zp46L8_vYHVxRQP(u5FY@sfzUjbM zJ9I}A79Yf)s2|{QKIg;2)t;sh4go}tXopY@hjb#lKu52c+S%CbJ<*!qkw`r0`AZSh ziPzEQNp3Qg@t(v?$w~Cis@s|y_xauvE&20t0IC29yHJoY=yR?PH(-88ux%}9B4W%I41?=hIxvDT*PXVQ%*W`onkII( zp0+fbU0l{!r8!uj+x3h&v95bnXG?D8;f)LLN>5Y4{prFp>1hW)|CYwa)lJSB;@(Z< zuO7rssOll7yEZmPG*7v_4(Wi`1asw(utt_l{pX2(_XSndY zJFuM8;oY6>vqF1+CF*5g*o)#uIlFd{tCy&VCG3ZjnpJEo10oAkljcmi39b+R%l+*e zC~WB-=v&d}b`L(}{`RT9fwcqS|3deIzJUYb!SICWnPt^y)J|7AQT@SQ&Pg5`HqLJq zx`j}7diob_@%+a;?=jyima0c&5hRtJy=l>6-&+;;4ruRympIvze8=LBjMFE)3yg1j zwYuH)$iM~(1=-ccF!@8(#v!qppq5A3LM}rB%`oK8GZnT@v3ZEfrT=*0L z1{Qd6^dgo?fC~Xd6?54dte=jW6S@mrEGDQq>_V=f=NQ!GPIS?1?pRn#po3^Nw^r4e z|6jCYRb2RTQw}Th#jxx_Ocx*`&YI0(pzW-#oLb`fl8@y(3x~n;=z^jU5-}Z%Z+UqH z$#-Lk@q3szcD)v7sQ-f3^4&S^Q{@REanw*ZA}R4hn6*Fvxo!0@(rM&ux=dc z7lIKB8bYJPJsHfp6GkWoFYFZhhWEu6_X%AnsRpDKwgavS*QjvoJvSiS%dxHFT9h9A zi(@HsRG`q-Kp=i=n;&A+lZadL71MD2yoek;==$xC|1nM06i}0euXi?`rnyNti8qTaIhm&O(YSc#1_%Rg$(0JXo#pN>EF{>%^Ii?h ziQ5|Y6vASI?G);I7onTZVSd(*LV7q|=*YA;<Vw!eSa1P-+0+EKUOZs{K-t_+;aKcOlH!L z?OUEj%*jP5t&fQLV{YG@<@>$i>C5M6@3vk)new~c@ocPKk97?Vb;WMU;`>rsdp73w za0Slk3C~#wVsUMqhS0|z&B@k>Rg^~%q3S%|VcuLd4r?=VjslqvLr!PK*{}(tpYe0>??)e~Or(XOuj@H=EOYf`DsR1Uv) z`iXdKc_S7qX>0WKDbc}HYDIXK+JEV~u>qKHwHkU^2gcT|#-+WPN4mPUB*W`FQXL6j z>xJ=lgkd6@a9c;1Xfkz1H2+Cx)8Ia@K@=`pa!>-?olK1~jo9iKycKYo(^G?aESygt zH|=^laf4yIRoxR$#q@=JUeXEA9*DK}lV0E6c=q}QUaPlYBW&Ldx%dol`3hLhGvm#w zA&Jl^8NVX!d*0X>!W+|9to9Laby;KMWj)GoS){Z zFW83_N4l*bywbI!T{mACkqbXK3cQ;w*!R@6;Jn7va?5zT?~Qj#J^tHCV}R#fZ?5$mbBC1FHg}$?hA-rQhl(42CpTae8>= z9!!RKd{A!PJB|?&Tb8N4<5(PG^HTMib7X9Dlo_liO}i zCO&`8a*W5jU`!ry^y#?ek0H18vc(WKma3JPfl2U!;0{>qmXZRvD`CiAYn!fGwB6MB z{G*Qw#wxMIl2-A@y*3@MXD;Y5^9#$%b})JKjD;f@MrmsE`vz9WkMq49G3#PxV_tbA zIP&0U&)ue-Z5VNzdk$_znnQh+Z7&!oANlQm(zP;!m1F3-JNsIUymf=w-SvNiqwq>R z#rdc@k>%m+W7qHthdN_A4A)hKoabhP;$eM;LqT9-cHXh)s8}Z91rt|ItQja|SME9Z z!~{BX6PU+cAL}Rl#GaMoi@Zc8W{w@1m>3yc?;n%Ro|N5l$GykKJ5nK8Pb7S2Q^oMx zfKl?Uzh)Y2j6CWA=Csvpc~-IFavP?Rz=YITlp)_85_Kr8P0zJAr>{;o&zT;de!}$8 z`1JVT%!5zO>_xQd00LGq>F$rQ)KRKPiH=*UEJlA_RfZu3e!9Jbfz5w@P?rZoAZ{)s*bYk3(!9!W#zK`Rp z8tRDha3fwO8@6EV%h?UPkmDne<~(c-{HrDC@_g(MqQ89uSkK+hB=$BoYy}JMZD^=( z-?4Xc%jUCp6^@vgS1`p=ZGK^J+WkELDQBs__(wj5W2ylwX1fS)coh+-4d+-=rLd4C90suD znlMXDGa~U@P$ToIRkdNQ><-nb4pUv2$jZ$pQc&G$mg-TxYBo%ax#|c7CnFrk^VI@4 zj~A+n5Q>)duIt4)xr>fJ`%hg)7PMxmKQ0vtOb*7q78`UOt7Wy5}R$J6L z>RhbwcAna%wyPcLd^M?ds$FWg+M_N|7plGL73w0jPrXuIjCt<&qdk3zx)hPUm#NFq zuDMdZR$ZlDr(UnFRtMA@z=&^D*Q)CDVRgTHKs~5FqCToVrXErs zNA$!e!498>r{J^dbBKHVg8HKRlKQfGSbar(Reeo8qP~uv`ERO6)wk5Q)pyi))%Vn6 z>ig;k>WAt_>c{FQ>ZkB*{7n5^{X+dx{Yw2>{YE{Zeye_`o>Wh%->W~UKdL{eKdZl} zzpAIzGwNCOocf#kyZVRvr}~%rA9WB*2)ftroVAEEhZEEd3`oMy)`%r$rb$McBrDA_ zU0Nh3d1;k4X_pS^M2JY2%#fLKxD=#YW=RiXO=im+nJY)gJULQcCi7(hqEHq}QA%P2 z>zztjDpEy2OFx2E79&#OD8Vw)G9ZI8gn*V|8Ie&rR+h>#IZl?#@p6K!kQ3!3IayZ9 zDjAd2GA^gc8aWj+ySy9$5bNZ0IYZXV202qEWTR}7vt+ZJEnDOqITz6p=gBtNE<5CW znUtNfOLog1xd2g_d*u~!k?fOK%Ej_3*)Ok_OXN~{ja(*|%N25^yjHG~*CBS|YB?Zp zkZa_Pa;;n^*UJrZqr3?o$eZM5xdovYZDXvzeNDhlk$}OUj86|lt0OzJYZ~I65R-mnDAkm&gdqc)y*0~Vu<9(qf?*_PQwn}sSnd#dWN2<57!0V zt!L>T-K%HoIeIPzjL*|9qG-Nep!@VfUDPFQwAFzw>x!=G8iI!w>BV}9K1v^r!I=Yk zP!H+49@ZmzR3EFC>Sg*ky&O_^f?lCd)FK4->9$E*Xir^4f;m? zCjDl8lfGHsqTiz5s^6w>)wk)l>v!ne^&R@1`d#|n`aSx+`cC~m_`UDack6rfz4`X@Q)hnbyuQxs>%6|s>xX&%FwY<6 zeGT(|hI#(*)cM34Cf*3IA7Q>nn9c~(8DTmjynck&kMR0YUO&p~MtR*R^F7MzN12aN zKF?96H_GQZ%5+EhTt}ny(X!IL;Wz+4@2EB)D5g$9o-*w!%#O2 zb;D3M40Xd$Hw<;dP&W*9!%#O2b;D3M40Xd$Hw<;dP&W*9!%#O2bpw5DQU0hKhPq*> z8-}`Js2hg5VW=C1x?!jrhPq*>8-{ves1t_zV5kd*dSIvrhI(MA2ZlOe$p41CZ^-xP zzlriso;T!oLw+~pbwfTku2L%ugdxuXu4I?G+1xYPwxCoc8DP#;X4xYP+#CvKhh zT_IoL6iteAfVup!NeKEr<_tY6P9O;vx-k4$HQ+LcT@rQ{&OnmB)86iIP z$WV_A^~j76pSom5h);boBg7w}4vY|=x@AU)PyI3@#HWs#QQ}k2%qZ`lx@Ja+Pkl4g zH$#0h)HOq0Gt@OhT{F}*LtV3Mr&;QorM_9}n=M9omO5vP(f!(Dbf1=bXN%E&+G3=q zmilLl(Q~%N=sqp=(6W7Isf#Y;((#+6E?Tz7EcMY+A1&KsmO5$K9<$U-%l4S1Zd&T5 zWqZt0KP~msQa=&I5#duu5nIB~QMtxK8~hx-S4%y$)Kkm$n5C{->Z+x#TI#B$u3G9U zCTfq;rLJ1)simG;>ZzrkTI#8#o?7aurJh>qsimG;>ZzrkTI#8#o?_1E2%matsi&5D zYN@A|dTObsmU?Qbr(x;AEwy!Mp)KX6^_0&>NE!$U?x@y_JveZ}0 z_LZg1TDGq&_102vFa(RjTk5l=K3nRur9NBgv!y;;>a(RjTk5l=K3nRu zr9NBgv!y;;>a(RjTk5l=K3nRur9NBgv!y;;>a(RjTk5l=K3nRur9NBgv!y;;>a(Rj zTk5l=K3nRur7m0QvZWqd>anFBTk5f;9$V_Mr5;=Am8DKu>XD@$S?ZCc9$D&(rLI`& ziKUKM>W8IHSn7eL4p{QNCC^*(yCtt%^0^&l`6QoP@^wI74#>j+c{m^s2jt&?{2P#W z1M+P^o(<^#3dpko`7|Jp2IS9xycv)e1GX;$wkrbiUqIdq$aevGE+D@JY%c`lwSfGD ziR;696OeZT@=ZXV3CJq}?el7*uD>F#|5_oqlWn Tk%-c1X!zdJ9z-96+av!M=V=Jy diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.woff b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/ionicons.woff deleted file mode 100644 index ec1c1f879567793545e1a00ae1dabde12a7fd96f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65912 zcmZsBV{j(T_jYXCwr$(CoosB|$;P&A+qSW>Hpv~^+2o(+SMSHSr>>dms}H(sy86s? z9}h(d2_Rq~ARu61PaydJp6yyc_y2E^kWiEVk<*AdqADZHk5a`?UFHWy zLTg5@rgp}TKtNzCKtLe#KtK>O88HQqrtYppKtPZsKQdtd12V9frLl|Sk3F@YI@Evo z{sscIwDqz80)i(30s<%k0SBqQGABM;nH!t^_+a{xVg3OJVsZF_)erf@{qR7=!T;0Ydkqi_AwV7eeu0CN ztAP_jHXCSx1qwg{|8Efgy#tVLU?Cvn|0+Nr|6_hQAR!=z|A_x=7~7iW3=B*S3;>2R z#s&uV5lZ`6q*z**n3$LwSXc*wfPyEH5>B#)7H$&{rnSdFzY&=L%mikRU@)vC)XGLi zU_eSJa0ma{iq+_~M`K3HJAxJ}lF)^y;tM7u8f7n$G3J5UB|d?tqEdiLqNgHB2_}H1 za7aLafx%1^0*L~FrcT#OYvh0S<88;}`t^6`&fCB5&BFIF=vw)`mo)2%hBXn?@1zAm zvl-~-j2oeU?StfrFDRD`v&+3{&_q)6ouW&WYj}8;j-s1JxOAQUt?+=QzaPktU(qD{ zH(?|D%yz?+O)Tlgo-!}O;hcN8U{k-`JT~Om_Mqm#_DCD&2R7tgwdD;`4(yo10#{W& z)m^KD3?040hzs$(+KA%i6-BnmDc*BVRO3D=S1@9d9@m8?c6rI3Dz2>w!r1On%;<4A z;|P$O1AF+Qhf=w}>~>U0BR`|A|M>e=B6qzACMvUsd8yZP?~I<44kztKxe>`1)mk$& z=|RlsaI6dAQ}VjQzs&&T+1vyE4X@&7y*2&gRorWdQQ*$~@CyvtKpd7H(r?#Ux5J@& z_}%-FESu^aep+v@Z+(l9%>s6cP=DUoM0kaJdUk~qo_d#qgRD7LO^2-OmHpX;J@x*2 zkmjf%&)IjsQ71$Ven~;szELMTRKlv52LFNwh|a}KfB$&Tw9Y>#QP~3mXZ;ynUp5jO zFOmaiI5uoU?UBb~DIGqjM|gP~D;@VWYvZ^+>O3RDoi}h1e~k9+qnc+`Dkl@~DKi8p zL-=RNHg}Rl19wH|-kf}0LB23f2=oCPW)G=n%)tVFW$wMRllu!MiJ3Ew=_GZwo`0>s z+qTn-xmicshiA3(EqQSXcqjgO!j^l7NOu});=U-Pu7~e23injX&TeJ$fFCcf^gN^H zoO5=ry?SCk8h9mNUBE@UK}_W`ue&@zBS2)ptGAmzC*{tE4L??{z?q}nOpbgbl)v;} z<%TZ0gp5kEQks7)i8efmeTz;6FuvX@hx|&p2GP>^bL0upP6#7GJitG zpMQ^hl-@*rf!O*1-~Bhgua@AjHIao>FePsr_JD?=5qQ7o{*h|S@lr_60& z48qfGo0^swR8)*8{wZULi6KSmN0!*8oS4sY*Q+k;P@L#D->^bvBluarkfBC~u0 z?hRe{efL36>oIevqMM3kbysG;G@N+m_uo?6+(_t_tuQ^RFs$TQGR-ECx5}jyLj-ybSjB`Oen8JZ{c< zdl!E9#P9w6*SkV^>r8lsZg6(w8?5<8mVdtN+qM3B^c7lv*Oq|W6{b5}p@fVP{xWp9 zfYugzax3}=^*IdmKGjG)UPj7FvLy{cb^ zO{x^9CYxPM)Ggb7-7!`vQ{r4;r`}oJs;7!gdevKw^|8dlx-D-VueYKztNhJdz1}8h zcSYA*_XeO(ze3VmkNA`*u!gBqc3h>}i?dPzzgc2esfMPV;$Ab$RreZVy3CG;Xn5?o zw#k1-Ic|VGZgP|EPIot`i8pTGo|EKW(|7rrQvVc}KJXI|jBDPrf+gmSMrou#^)|ge^)`S#SYo2FqX#xjFOP=3Qd7MV0 zA;+AqG;LmMsJv$o#K2Ubo+&;(b6R%h0NmmMZ~h)mk@a`xOhNdW+5^?HXK1CIF^jsK z8ORa#G!~6l1`L4-8=}e_m4q`RX-9T9)?DuPppv~YR4JSZ5jk7|q2HM(GpEV~{9_s9 z&Y28KJeH5+8_E5h6TnJrUhmn76(=YwhxXCE)=c?o(WzH z0S18uK?xxN;T91FQ3Y`VDHv%083|bjc?bmur2rKORR(np4GT>Rtp)87od!J#0|>(m zV+IogQwcK$vkQw1s|pK%O@M8W-GLK>(}UZF`-*3PH-ry?&xG%epMn2QKtZ5I;7TY! zXhMWTvrnr)yF>>>*F<+nuR`xif62hc5Xi8`h{VXj z7|l4q1jnSt6!#MY|FW>Kq_O;AHDgU;ZDD<9V_=73H(-xpU*TZju;s|$SmUJQG~n#x z0^w5QD&sogX5tR#p5r0lap$?`P2%n16X3Jpi{rcGm*5ZNUlD*4P!Pxx*c7xDJP{%h zG7*XtdKR`9&Jo@fArtWx84%eOg%WKO-4%TogA=0=3m2;qdlsh>*AX9*fRa#?@Rz8N zIF#g))RFX+3YRL9+Lu<4j*;G#ahEBPC6X19b(L+BQ<58#r;*o_A5c(J@K>lTDd z^i-@-0#kZbR#A>to>Km+0;i&6q!I8HyQ?nS$AjIfyxvxwD0Y zg}=p`#g`?SrI=-;m7Z0L)#fjjUuwT@t+A{btSzh?tkY+-EKY=do^ zZ1?T3?Eg4`IY>CHIAS@9IEFfQIR14)apG|@af)-Qa_VtSj@c8s3^5pXj_bl?9@FMbZ_bTw3 z@H+8^@Fwuq@wWFa@E-HQ@DcG*^9lAD@CEYy^rP~#@N@Ue@%!tK;7{l8>!0TT96%7@ z9k3Kg6BrZN5#$^+5DXTq6Py;@6TBP36k-$-8IlvS6!IEs5Lyu07rGGo6-E)37xpI{ zD4Zc&Av`*KBmyKtAR;ZIBVsoaE>b4aJF+5jBJwkeBT6YMFKQwhC>k%CCwe0K@;BIT zrr#pJJ%4xoK8%5h;fgVf>54^)rHhS;y^aHl3ym9yJCBEmr;3+}509^lUx~j@kV~*m zNJtn+#7c}zOiQduTuS^*VoTCVN=sTwx=e;iW=Xb6UPysTAxV)*F-fsciA$+T8A`cL zg-Rt#HA!_%ZAb%3<4e;>3rgjlA8CMU z#A#G(JZYk8QfdlpnrbF#=4q~LzHbp}iEFuTrE1k^jci?Oy>8QLD{Gr-SLi_Nu4omVlXPR;ZFPOxUEWz<=4bV=xTgC--;DQ7s;gV8R$8le8ojnbgE=Xl zc3Tt^2iBHRzYrcO98`0-x&STAMO1PMzCIYdzfj2Y-I?4)6m&ez zCG2>Zq>6>S5tww?_MlXZn3wXr#TTcMPQvV$wr?rh$35orr9X}sq!<~tFoi`?+}-#_ zNloQvQO9%DDcK|HJD^hAEuL7}AeDydYm7$HNnJ`>i9J`MUbpGNX?5=>*>lUecvT(G zxW=Ou(B>O6^p&%mV;<+Gn0nm6b&fm!!1+@dKL>0h*17-t7uR9tvP;F3?$ca~aL8&t1P!Kh;0%rIHG^6t#xS--;^=?{Ik z>+;oZ{o)8#E8VG5C-RB*@cq!7jmQJk7I7kZ)xDOFa%UnnDZNRV2PK49tvOXI3@xZ@ zTSQlFMTs@?*<4TuBOxp~Aiornw*vZ%?><=D2*h3%8+TDHtw+ISp!BKMnwFJqqZ6vK zQz{F6{M|=nE4%2{X(pVTx{~KC78!e{x6UsW3$FG^H@_s#G|m{LU`5O^R=bVM5uRj( zYE&Ikx7f*}=L`L9>08Gn5{C+^RfO9c(Zl+Q5Uv=CfP1Lu*1LlaHLsU-;xpVM?XPEx{(O@kpCQ!k1C9%E^;p^nk_RL;iG?o5diTlFjwl^u6Ag5 zN090cpY^HY*%qsleMW0p+elHNmTstkhBx}wnqCBF! z@Xv!^dm#Fa`g8Gf2*lz*8Ad9B9zlp;nskV%pYMTi+Q=UGhx+961m2eYn-(IEj3M^K zd|Cue2pTuQ>V1FuK;C$Sxw8c=){pFmG3Z{0Kc!$6Dd~eZ2-P?c2Z$ay`S5{%?#Co3 zn(r6!mco|yF4-;724%NpSE_VlyTcA-j=r9V_OQUlU`uc^MKKY@+T&|U5P60Z?IXZ> z4a#`}nF`9Sih3&IZvuA+=QjWGuEk}JR$x_cJJ=}}`U^}5v`}J9KBab1XXGiIy>~z; z+MT=08gX)C>)?0ROhYcFv?N?B{CR#o;}H#uiVy@lyS}SqE0;kR?US1+$mrlPhA*is zDXpVwraiWSjA~PMGzc}oQ;b0EzTc)>fJQ2ZJhx&tv>j8Mn->wVH^2Au=bDZK#cYRk z(cANyn|b{?C=`Z3f@a9ItldF2+R#Du<=zQ5uU{Gpr5&nM2Adg^NaWaH*A+7Xw?$Kp zA*Wla<&=4WhN6(5g$vqGzOj_i0(KXej7iC$;7kl1C=BFQr&wFp9oo%@%)i%UU>Q4@ z{}k?P3_B7BnoLlljt1TesVN?|lQX*uXWBZf*A_B((3G3D`oTM90p+xYf-e(ar%xUj zWrK6;ILP>YahYFuQxp&Tv$#eWivd@w?bqW14F@tnHX>2c4xn)->j^hQ%{5O*43KGdv)sKK6R_^J^h@MZV z>YmVIPGQTDVW7w}fRjN`SsImEL-346B(-_TdPL~X87Z7EqG{D#a8tFSy^c()q}H== zbZw1d+YD?wU+^v_tMel}`;L&rm#e7FNU8E5jW(-Rb>katL6g^{Q+3;7h2}N%uFuWT zDo|Sn^$>%oG^Uxv!ud2FEGaDAM<5Y`*_5d>qK-b}Dl5_oqZJ0*iby!8sD9H1r(Lrm ztmg;zymH=$&sk<>&M5wdIl=koSzh3XgPCD#G$y;7 zm0dHh9&!!U8%hc1G8^AVGO+4b4tgR=@N8*g_ZcNPn`9xU;SmDz zKUN$wu``1o6Fc)U%m>;w0lBOb8_>XJs-dvR{3_AgPaq$twXenoDT^sETM%=&$}Px? zjoUELdEzQ~TybEAH-6}VTC_jk%Cr1ntA6&MF^#OOU&@4*j2X-qK?Dt0D?w}Vrm0EU zdU9{7EI|`$-f{2UkSZK$4uBW@sHOaxCkJ%Na^Me_FA^5*jZeHmbs_%4;0angkkW-I z2_~x@(7JFJvGOb!;vUh#7tT_lGmQURBg@ceJ66|NYZDLaEqpn0hU&mik5^xC;%If&+GeY z%(ZaVjX>B3`z7G}dK(r`u-p6LYyK<*;WAa}sL+nSdN@cnTCsm-sKnIbYaiw<7)R5h zynYw%ijQ!HL=r-Re&M`9t9`E;$(?K zp6RCh(3$QD2Ts&o8x(!MDAtTtDg1?Nzq!t2@enMCp;=~V6nA9zsP0PZYonG0a=j!e zn*#-IP7>EEYp(1~w5))iLS2V9I7@N3sewHg|FKcC*Buf8nC;r^7F~5i->E-0U%u>} zWK*7P>xbc)uhssBMIZKa*BiBOe3(*jHdV4ROpvPBI<`lSHQ4HEQlqqLj-Q%9WI#BcC9UQ1PnLz zHDWuS5XYPmt39>QZ_qn>QJ0C8rON;=6-&I%k^w}H7L}-OD)8@Ju*c}umM@|SnNvj5 zjH_(=VdaFu>B=#PgQacaJ^uRI`}_uK+7J#$_zWp`?}T{|STgp$tu2LoN~nc%w1@n( zN`uOe(#qiK>+f!__IlIww}%y3%3gB<hP~wB9c1n^s$l)*LNUKE^sdoBYQY|x^`wU3z7@1Gb`9=14eb|0&S4e(}McjUDUP@ z+xntDySPX7xmw}t`|q1Xz6aOsT0 zgFnaIa{;*kFiWyjm057#vFtCa{3JE-+6$0ELo%gqXmeojLLG;)E=T*Je7HN7_**dl z=IPaXmg@XOFFK zVGl8nSs`!VR%kHD! z15v}ye8x$&rNl}mGF$$`%`rBy=U;=ocu0@bF`0Qz#SF*oHgjv)5>~kM8%??`M(WA= zZ_fa@dWYn1MEd*c)=@?~@L#!CLJ%^tpx0LJJKm+|tfl%wPaubh=wMZ62if*KG0|_X zJbMQGzMgLO%VpeTx#zjuty%e;0#*z?yiN}edpQ}6h&zrG*GIuV!e!<~Y4YR=@Ho0= zsXz^y)$M_T>1Gu^Q7&2)INr>_Ttd`U7Wp%4ElT*aMBOjws9{=X|JvgeOtIvmN4@js z)@-!*JD4i)C>>JA8OXHsA6X#CV-07Ztr5ge5K zMuK~^m4g^I($-SZrPTpYm7$TT4c`^*SRxaUAzMnZK)?*t7>G`wwbKfc3wwTXgH+-T z6aq*tj);e1p<44|<~&W;0h%u?neo)3+vucMG0bWLYG788zkYk7zkWE?r1Q&mz7KR0G(*jNm(_|z^XetUv z2S-`0vgziEI;df$@@?&*TFeDxJtjfg3rd^Zk{inQD_y8`QHnkum-$I)#6c% z3|Zj4__pmz8iW#SVDX3;tP_<77>Kz5;q(FLI`Qp#AFt2yGLGpuxUwe z+zPj1_)Bj13wU6*&Qg&p`MUJ*K>f-&9z0X&_IX`FEtIzo6*t~4vpLM&meWmG%_0rt z?K=8CGFr71?F;RK)zH9tY>e+L1P&p#C>JkBm)(O_8BEtI)x=pc~YccJv4%9&Lkp>uq7&lRZAj|LuX9Jo4R&ihB%u;*nHJaHxW9CKaBiK zh{MdcpST&UG-}@;ET7|wabDGmuVughLRzFb}U9lVExBQG)!zStdq zDfY4k-RU!`W}MTTTIEkH2RNE9v) zSGaczNn#mBk24kA9s<2BkO=HEZGQmL-WD9n1l2svT~i8wC1BS)Vd4sSpw4E&#SK6Z z_D>&V&`}85WMfqpeGZW+D-pfSL1JXXI@1<<5~}%I&mz1N`&ynli)7yDZ>oN9|Du}3 z5Z7E(5q1@TrF-U)6)Ntl`Me34TK&#N{PpXduoMr)sE z)V6W^^y4jTo>5}?8*`Z6tc2>yp~l&b{G5L*D{sUAFU*!TzI???82oO9g8U&fe6U~@ z>(%Oy_0yKgVTPc_zU~$^BFC3W)8B6D%8>Ieftzen{nJ;v?p&gD~Eil~fk>9$^aK z=XX2vq<{HCwCLJTgCq&TY_P(@`!XTyiCZkeK)fB(fu*W9)un~~3D zXfUg|!UJg%9-(Z?vrlZZ*SCXRIE{^~5oq6eAW6 zNuWQ9%unnxWW4_F&)6-XJBWS_bow|y8<3Q3tL&tr`U7Q5oYSaOB?%ura(Kw0zWxP) zsS;+Zr_X`{Go9k`5wr2E=#{NJU~=P;EW;#d2YYI84?&P}qJu&9b7^S0>vkGhtWO11 zQ_!Od^4Fn;G1-*)Bke~3Oh4S;pE=zAmYhjg4>K%!8UeY#>8m6HwcIuH#-23iicE3y-=(vdG~C#ak`3?QS&<{5d6 z9+*&>TcH!FifD8o!=g`98!}=ds_Mo`hR;vbMS*~$(;T(3pSnX18s9e#mrDL5&7(K1 zc?$=Q#E^lucB_=y@b>2vAo~y|w@OuY4^`rsg-U243BheY6`#4D93wbSPMthc57n?# z^F|I6wY%BDJqn(`(PL_fA`fj-n77R?VaXfDu}9UeyXNoY{Ceg+*h&^*jOPt{;mYqv ze^t;bC;mHvAYHlO5FT5%eZXM^4#MjWPkC{kP4rlT4LT^U2IRXN zlqp8-n4T4UpN@RtNn@pIWqR?i3E5;Z_P9kmu$1`7KMTwqWjsPg@2y)mHAJ_~0mh;d z3R;F?0b&7*IucFjUR2JJtBc#Va-jl~#{!cc98{L+KMG?E2^(-s@tU|(Ar%heco7_1 zWLF8#BGo}P;RY(9OQ1&tFsQ8rG5@H*r!*`U&8R%u_ThwPZrDMFVvPy}SB_Y57$<@* zjdIUYz_4&qETH98lgKGZsYTc!yPahi^zMRbcWt&z+j_0GK7`bXTBT2HI`NhP>^Rve zZfj=ettkf8B4X*3Z{j9o^>4OKZN6uvy@3h0OUQv4FVF1^4t};Jv>{cF*(y2Ej&Dd}`{T1_U z6PpC}k);!`skn0e0m>Urs!p8gB2@}lgJ|`g-f+xHn86=LePVscoX)^><>d6@-SY|j z0r{TJ^g9?5k&~C!r8x?@z#5yJHDMJ5m>sxv6;qpN#2uAW27dE?=*Ss05s5CA+hiOF z*FAE&(3a4v(%kag7RzeI00ONf)7yP#nR<_$)(h-Y@4O@_vc6QQm|zgRzm2cyi2Hu? zz<@hK1)eLSy=U)y5R4-t0zEmxf;qdnAmO3bcJ7473IJc-Fn(}fHn^_}WJy1jT`~ho zTX;p?g1oWrE2(%{VTA~_K_xxVRv3lm0S|sVx8{^TB~Q7p6XYBqX~S;IqJJoayc48^ zTjBuBQ%&F)OL|rB03xE~;I`oii=D08dG`FAot6=XD0^a(uz*ByD-bR{>$4MqjBFKZ zk89vVK{`tfl&trpa79ed`aXyN+lsVuNWO(!;J7z9l*rtwI~VW|4$z-MNc*=;yGxIa z^TMSvCz+(|nq+=)*0;{$3?ciZPrSlt=JcX7u`(rJI^80j;aN_flW?rncBy%VU&U-b z`ppTa!iG|5t^UsIBnUs1_x3ivJ*?MrVgP2n)=F!=GcD)*)G!i$+J7QBLiH^HX5=!j z!E(46FmgzeN*xp0$&Ce{!bXd3R2{mc7gzPJs$3<9iAfy0h*6>fA_wApX6?hLIhVQ! zdiDFcDQ|94;T!@`#_Ii5g!J6q`(yyOW;-y^|@yCGntAO?KB;SeLe+L_c1?ffU&eZDgT6C-FNSM!h+y`2b%_4>!=Z+n7|4{7P z-B#UUwivA0%f?W2SnM`Q^QuU4k-aQr~&#SfDzIbr6*j6TD`x^TR#@oYD@8C z&~@lr{GLUkK!=~w5xmd?X3Q`kVJSY+-$4?06X6%*| zQMEM9)A~eJFUzL&zG52_42~9&l5{V5Y0pV=FhtEKPZf;bI?GNr z)8yR;l0e+WY=@jhEK@x=j=|}V!~1bM9w^CUJu!Ly9^G<2Y7M@6_6Lw9BP{Lsnfm7C zK;yqU{zZ+yysYlzbROriyhc7ZX1uWk)po!LKj4yw6&#BStMQjE*>cOSq- zUdr&MHu>DNs%nxkwLRry64`FW*9tDs|C3aG22lVcKnCN^qkdHDU59dYAga*iqZ`Yg zxOdgHpqo974z;WQAvk{Gmx8CZlE-bi-o3FL6$?_-Mnx?S1w z&;aCh%wxwup_w|>5^Rci&$&KXciOK$f%ljzehZz`1#q0QaJ4WF9Q^}sUPQ1l_7Yb0 zWxzIDzZ=r2W5E;JFd5kG7)4y1Ienx}1nxLyg@U4e58zJU;+^;J$bT}IkOd}oJ`hYi zIdVr{iSlWABNzEL4HO8Rb6BHUV-9|A$CplZ2K+<^YDvc|SXcqYN$p-kU;^lUfh<#y z94(Dd`>p61djU}OypI^CR+OD1qEv<;JR@k*8-355tZ@zZy#!G4lQ*^Dsn2V@DCHg~ zaBx23Bsp1dbiiv^o8qwOSV<0lpLay2Le_<@9J)O z;1OfhZ>&8^S~&x<5%39CKT0sbu5h0^*6B^SE#F7Kv3LFqt2fl_c9>GA>W4W^zAnkZ zZz4XK>BP~NMSV>uR8-7{wcO=f`S=9!jkNWEcL6z}=58AZ@pkhw-@d;9KDS!CNAf+_ zJZp;Z-l@`NTp`u-i=V5ouG7e8SEvH_rEJ~cA|8}|M?U+bc9VGu zE&12V(CE9Epu|ccqn7RTfmqlxrSna~E!=Xg^;mNG^NqrfjczHta_z;UuG9K$N0WYGZ`((> z3Abxs(NJEuZEeOA&ei18;frx+FNMO!I*!XJTXs-z#q4Yj1{5vQgX`QfMwU zW+CH`LKnN4m1-=#mY$Jgg@yUZa>A{>v)hi(WQhAWToc2r2{)u9d)IQM9-N!>S~HSF zV8#`KgDxUK9lpbxp<%6SfDx8DY5z7qOD&axeQx8B!k8I&qb4ap-Ixmw3Tn=UehSe^IpU+VV4 zkXKS2M+JMy%h7&UYip^baj6>g(=B!S`aEe00~v&8y+h#KIcAsiWfn{yG{|29Nz@Uy zVyklCW5{qEGgylIMM%t8R$zC~$ku@{1Nh0wJP?gS^jToSBZK`A9_U3w4I?;1+pBM) zv}O;)G8ko0b@U3xE#M4k7!s6K=u7hH)n_YeR~ucGJTW+YVyFe4P65)WrUHNDueqTu zu~A15XJW6hM%c?{G?%$@O>Tcth$0iKrvQiU+;UAJ*3+Y0A2kN~=O_|I#Y$01P1tq*T z*G`ZMj9wkjhG$rv)-60?iAAY%ZtD==Ln~S0nVZVMer7EOuOkxoJ=31O_WvxX(-neMkL(v@(4u%lN3^J$ExX% zk%V729E@;|5?Pe_hCT}%4HkXOA+Y<#lQ0oVz%r!nA=GV^XKVtjj5O2?Bt2P+OoSnV zl@ir9a&Bz$~oiBl+puJcf zmYms`Y~a^~t{OLD%)6sgmFgA0!Bq_Ug4wR41p*y@=f2*+o%kBfItHdqF?}!7Y}-|R zK5PY7-8Ld$H+0i45u_-d?;1@D zJdNMgT!(Bp4QT3_QfnuwM2@}d<|5(XyBuM+d%#U$6*LXugTnF&b8i=NFXX(UmdH2M zq>s%=oSH5>tX0t{R{xRs_Cb9g z=49=k=IW-NLdjmDm1xY{7BvBNVxCr*+&uH5v0y?@kySMCSioI*<)xbQ1_6M>MKF&Pp9No0VjVL{ND z5Sw2k(9%$OSK!`ZcMAILU433d8WBN6dsX99F{&qecNm|JU3I?shE(D#F9P7KqFKSN zys#iL-!7u>QP^t@+Kl2)FWgJ1) zc6=W~x54$Hno?0RXiRN0fP%UU^SFsEzXo>p?6kzar0JsNA{EvvCT` zM?^*&|D<=-zj$!eAYT|3pIS@p`GR*@n_sNqYhF2M(0~sw*#2Zghhj^kmz9f>^vG3A zOq2NQO<&a7zg+#!wv=Eb#9v(IG1}9N)OEl_?8B)_n(>#c_!}RU@(0ru{S|4Qety(e zG~9#DqN8rnCph5Vk z7n8{VdE}v3R!FG_^zPOVi;>9bgETn$nj17K{Z{CeRnmF+kW{?V^+Kj}*AC=g0jgv? z0oUedF6bgOKCjEkOtU`)$hG7`NRuD9)AuF9ZEtr;`q0Bu0SYyt@n4#v71EeFXl53# zk!TClQ1e1L7S~;$V>;8sUh*t(9f1P9h6gF4Grk)<>79m;mIP% ze-mda+IHb++``IpX12Q18>3$^fCQojMknRXraA4mJz3lsvRyya{sI_SG^x3dNJA2h zTyg(qF^@R}e4vMFP*a<#m-f|kk{e#+7Pf@kJ=4!#HibyBL|ULAA1!y)AsBW?DAL$p z2qCk*GKf>pYUL0T+jm#;7h~Uwi(bt8)DCIs#D2>0FjHQ0jHvXeR2@1yZ25H5R^7IJ zij}^kr%urdsASNgQFz3k?rz(XoXvXJF09^QuXznA1bEdGM)#qrVzlxEUb@$A<&$8t z)&(7IbZa&%6BkL&kUAoSRRz(O35(eboq1I8c#R~;g zf`mZe8#)RvZp{zrln}yJku{HnAYFt;FtMgMhO?a2%A>VQg3g?}L~>XfwIp9mv3OsA z5g$vcS|%)wx^vn-3W#*Nke$s9g}|8YcECnM(;%l2a1zUlmZIc97D1qiQB^#)%Pv+* z+D|W4+x{u@dhqH2-t9i@x?e2+{h^lnN}6a8ocq_ibs%@-bB7Pp=`jDV7^*lW#*<~L zGtRz-z3X7wjmCaEc_W$fWrTj`gLr*p53RN`(hR7_7`T&fv%7u%I}hnXHd>FS;Ez2H zwm{daCo?JrUMX@Jlx3`_#+rNrZZqG(^!b8aj5+oPTbVYxsGZA?uP7;pm?&K>myX>9dLrwwMUAYla@oxH}4f8*ruL;#N7L!{fQT9XI zh2&1}CgHW|q5diczUl-)vfD)y|C`;fAbTv7Pek|~z}9jf;+`kbyGRpkPa5rZGZ}T);1!o$S8NENV2J=4=(O$E6+qRqZN`^pp1DQ%i5h`5Y|l%>3Prxp}mg`s4tR%wFhC6>yq_ss-o3 zf^&VVA$L__2N}TzpQjVH`{f%SlT|rE$M>jWPV-%!@4h?MMLiZiACSCU6oTUJQk&Nq zOUx1IxDgq1Af`~dL%xdMR44|pCP_dUh)T)$%$S{bUGt&iWt?IeSTJi_0J z4mi>>cI$FjHCScDE+i+P!wq;Lt9EXM7OL+`u?R%yg|14S(p=`qlD}x^`vcp&R-EvhaE9HiDYy{ZECm_Pk_#A5?i?@y~K@$lhdTT+YYY z5npvR3+v^F`rV#hmoXLPB#y4J+2XGw?&dW)#-_(dyxV1VFtZ10xbq7r)kT>f{la|% zIJ{<>^G`TN(u=AJuQgU{v*i?9_HKBwa@-5GTJ?kD{)2*;{JU$==kBqne>v*`+W^L5K``r)%aJs7ZnM+L+! z7~3+NViV9d#V2*KwD}3&4X56{cf2g&-L{=4{4t@F518UQmJ709hg(-9TpRT-gH8Q$>*LN!!&s?cw zlH91&(gbwSR7RhPdGBl&(in4S1e3DZlibMDLddD{8%gFxQ+-TgMTy8Xkx z{l*c{!FtHV@7SG}L^>7jSRW^ww zC~5O9lOsr0texCC<`7NpyR97YK^Ip<4W`$)%|pRgDt7xP=j4}=!y^dSJiq%{X}XRT zb6>iHZEqG9jlZWB-}`(&Gbo5i%em8i2fT z6b7+p=gLbhP81Bq>A2de?+_-;DRp-|xCo+00E!2!=Rr%ephkZZRF29GD&!C1ijUQt zv6-P_`uFP3@H>K_O&Ru9;Q?8m;)yd(N@vQQ!<4td+APkBl}RwXTr?O0!Jxd}g#`Z2aePSV}bfs*R} zO}tg1X&JuovbiX>+jmw($vm+AwMUnGNIys~1h?SC6*!U|cgMR5p=1PO(MkVw*RZ$! z{Od^C(%RSgxhV{K7!czwnLbevO1ewLC$Ruww`#YMpA zTN;5jQoRa3>I%8VEuPK&nh48EgilT(OFjvaOd&v7lt}{+ps3{-qbE(CMR&)P&3N$SxRgR*Ok5fVNz^*EV1{x{O zd&lx>%{XGex2=a_45?xB8N=$0YF0LL0lA66)}~<}#%mBT)8Z_e<;kiy@UgaA z{?a~hVgEA{gZl@aJ(mGeplmzJP#V)BdUPC*!eA&PO-;0lsi=1(SeRm%sTo9a)i`5H zZq$D+jNlRej(*HQ_&Nrg zK7}f|a~I$I%cIcy_DYa^%7wvfY2$HjdiEclrpi{|3RV`54WKvCn6s$&iMY2hLb=r0 zmh^oZg4E-sSHRy-DU3ewQTAzajJRAKX1BJpzk1M9-_W$#OcmOVgzd1VkOgE}zJtKS z2=#&>H~oJ%b@mzK>~#z{%%?2c=q>56YqQIbeL~pgO&^X}FB%1q4?zt~I1IWDnZV@qmr$ky_%nIkq zjs1=~vX*iR9#EsA(O)8Md zW-nz&PgceZC9ODJh#Ton=bG;ujC$YPnP6cI&qI9=h$Cl--rcPJd8TDslCjb05^tex zyV)#V6brWQMu<3OqC-veQV#tHKlJ1EQM?ofwa!9)`+Q5}6u_(*!rxn2fMrYWm2OM1 z7x72!T5G4v=cl-MspPpcf1%L#x0N5?f^3=gtJXZ?j|S3yO0R;mfbF`{xm;q@cq%EX zRO&mBptr}X-&1l@{r7P%#vEI8X%mka5>crSHpGp^$k`f!vo1 ziS24jl3zJ(+F4T9QEBaOLX!Wa{|379(ELe~?s~jOTNQm2;Y^?G5EbEFk6eE9`vq!K zA7XO{{Y=xuLyn?AMgPxOC=;v*h6mjX)HY-Ms(oGTOTd_zrj1|OOlpHh)y%>b6I3;$#z426bAxVpvM4g%u}RTX zWf=gKHa-(h-ap*Zzcro=$Em44CR+B(vO9FEo=o#wbp7K$jQU`WCr(Q(X*0)6)yPC5 z*0a@9>nlFgPJF%D3Su!W;keTM;fa>{_cJxwEAE^L9dDSfW~O%Lb-DgQQG#;R2$nc~ zeS(vsmEHPEsKLlNG_~OF95K?xzmFbiiRb@eV?7qcYMA{%ThaL7eLYkQVYMFaaL5tH z6=U4jQ2?a=5J^UtoceOhlf^W>Jxq9$Ja#)3v5C?2$&+Ei{ao7Rs)GBWOfi!w-pJW3 zT%$9Se2^^3c=NREr84%<8)(&9W+x1G{H=`y}A zK=tR-Bj*O^?KSSl&|OEU8~RS__uWOq6uDnem?R6X^jU(*J#Kcb+^i z9WHu?E5CENgWnx>a6ahvsq>$s*G!9d_C7Y?7jZiz`K(&9=?b(5Y}M}za8z-dLZs)u z`lO;GY@=1j>3zTiUHI5)i#v(;?lly<=$Pn!)8R79F?%22%W;S1d_5@*@^4I<1YX+~ zUiBAB2cX@rkgk!AOE+ z{_L7d@MnK+-a$ft?%><#FnYaMyAaX8p!!mOO_^K#>%Zm>fEjMfbkOU2N0JsgX(cmm z?_oEC9_ASDM`wS8-U)4#0-EM4$i<35CTv(@=?tK~?$C^Hz13I0qCBzMR4EVnR|U}? zfsOEMOhZ|7ajR+8P3zifUAGwW@W&`!#1xl788A)I2P|3DQ;a2L*+-~g6_b?c211GP zOt4V$7~#`y5a7SE4U{n#_gU~Z^AdO)Bk;BipYjzi({1j}hT&Dd3?;~?b?)Sr(EO68 z(Ezj+jED9E%tY4gZfpZxGY^Vs)-p?lLl|Fx&YEbO;4NwIlWDK_884glP|MAH(o0V| zA9LW?&$kOr*&@8j%cQ(a+C$S`Is>fTOE}I0j#ERfX{V3~r5N)+jaGrrED8zLw^Gfa zXs?oJUo+u_A*k(qF;w=YoT(*7x6#Uuc52_D82t(!$)w3T& zi+pcIvBzRIQyCelWU}7ARpGReTz#+F`>|(#UHuox&CapSSJrHjbc1FP@R{p)i^q5- zvn=Lg-Y&w#_LhcZ`T;5d2tyVz3-|jUeaXro9JF_KkuGnpEXq#9m7l=TIcF=i<`jlWiG?T3_ZkX zpDe`2FuXFn8_Ko5EmBorP+im2Q32t8QJ&Km5EUB)xwrm(M-Av~=tH z^ZDGZw;nli>#OtpbmWLMnDdMJ)P^>WsBqA)RgjUO!+=uAC9BJYW&!o}7oNm##2pMn z*1W=Ad1A%B!VFk+v2$^Jd~y8GN9`-D6q|^<`Ut;2v9dD3^Yq>qU0pfOvp#!tl7;Z# z23iv)l9g;JzBduq4>y3JQ1!aS(>G!@lc(pR44;3dyD&BaO#U1zTDQM(k}v z-s^fU9C2+&RdbG=(5y_R@R(=#nkjAAXWrq~?x9(!Xa#Lt1dcGGfyzSYl2+6>f9{zn z&02vnrme<))b8cChD&7hM_6@ zh&zl%$~t^@qmr&bDfkw{?FyfaL3g^`i1LV=&bYI*nk^@F-K%7)bip%$g*_m`7r(Yq zp8ncR)8z(Q&UioY(rE}Xwvw$EY&%!YD)y8qGKyo*559Imddm-fuqA!L*Z4fe+3%nt zdJtr#5B;_vZI$*)R{?svLwYYzaVzpj;EN7fBm75>CYluF_*ZC#}SLY4&%j?21f435w6^k$c&6LUg`FM4O~oAvE$+=bkv+`uJ{m2SqXpd9sJp%Sla^Z=^gAnTFecCd;Phq#>sdkikqlKC}j3W`dcW znCNuI6A8xsclz_6XVCp17g|82V(m8fLyL5vZoC*b?8IA~_np?F4b;SMDs<5N+_w3V zgCp7Fo9DO9MT>GLC)1eyB)P! zUt3-tOJ@wjwJgUp8kObctruN1yq?<-yi}|+?3UvNTmh?e2T^W8?y|_cibJ&SxxR^m z`ND04;%gDZ$1o+(`dNssK(tMeW+ySSb<2nFLOWiD2x#?LYVUCnMtjuzW%6c>-%R9X zLW&q4B{F^$_AS2hlZP)HJaNqSdf)s{RsBy@THnS~zfv1VMlT@gU);1P)aYfuut8CI z;%{V1E|8e8oqilWB=%b#m6oL4;+FxqS8cr<4MA3kT#UM9VTKPB)-AwDvQfRt9d7wL z6H@DRs~y0+GM^wEMfFxi=D*ibZNanU6b$R895&it--QTyNR_XqH_t-T&JdvJ47H5} z3@IKg83|~2*XVuT08HvYIY&^!KobyQy?@9i;MS*QrT0zdp<7w2@Ry2B7@|q#NB3jd zR_>y^4saj01xz!v;u=Xfu0@{F`$GI$z?XLPHvZZjA0!XM4X@2I>ZjQKii}_eav!zMvYqSS;I04MHW!!H1dZRRgn$vUYiL9$=_M``zHTZ zGx&@9&UufYK7A%Ki{b$uPf0V8{oS{5>;NUuCF#TxEMA7h$K)vPqS^WFsZF!3$RBF^ z{8F`=zBV^LU!EFCr$?sB^W(W|Dfi*rzL0P4oSu(;qZYPLPxt=lD2&z0e6dg{&Q~TI z<)c)M>3C3<;x8-9dA?u0aTLBknMMx&PDI?*rz49kkk%*d^p*kVL;G zJzu&0QzvN*@!x8qv%(jPp>4P`AI4%V6~%jD8_!lS97AgZsZA9{&HFzri=j z`6nI}Ro$`mqbfwyqq^H!s?%=wOk|IatjDc#ZG@O9O}z0c~lIu4G~s@{7> zup|bV)J?v>^kBu>h&3fM@4ppQtwf#Rt&8OKy_@?RSU%lIOXGfhYdD0GdPi z``lmmj(zUl$>`rb@%aa5rr_UQ@Q0>)pF{Wd-ak2ccxnocBa@S7rF9pdo0^=OntWKK z_5JyyeL^Gz%oYGv0@sypeJkcafy1Q;+|Is89c$^dG~do{W{1=pCeA$QB(e;hPL|(! zX5t3*5Zjz>&zGp)8dGmEO>4vYYg3w(I`LlBu_Dq82N*D3t2&?zPD5mfh@MnclW6Lr zcHibvbeww~C+FLny)zyh=w5ZVDwEyncH94HebW z9>`G*j}mNatZZtkVtv@Gh{Xh7zwm~OE^3aXT#_a#K?ZUZk^`~JJe|5kBZx9U^sKBa zi8s;5qjd&U?49=%Iw6Avh;s;Ii$h;q9 zd+!?wlJmNPu2J+qQPoEQ?OcuV%k&cpIhas2UA6y9(RD=wrSr2Gj;B@3*7u(!C|E+_ zFpluzwh%l0PaW=0Yu+W?q3#7LJbYFX6Pc48I!+^czxE{IXer zZ-Q6nzM0XUYn`xw0ZS`^!X3wJ+{OP5D$x{wG7-9+D=HUdZ5@-b8=jq?nlb6Pe)AC` zlj|-(KFB&NG*mSx?s&%$pOX5Bldjy{rU~61+l^)N>}b7H^!pYDv}aXdd#PGkGxmjj z3kr}%cVJ`T1S=2iA*BpaG9aqeCsg$b)r%G*9pbhUP}qBa8C~xJ^5seI<7};{9{Mcb z7>WlUGS#DS>y-L%KSi5_E0Mak)`rt7Uq=-3)uxdXv2Y|7uEbrw=qE(KQJ5(d@-u~e zVb7y`3WdUSK40ixy^N>lry*6`TXz-dgx^K)K(7W)C3an^w(9Lp+b{dvd%;Euue#WA zNem9Ye4GzVzTsWpsM#!_Q2gkcucU%h(Cp7)p{qE?U!}@Tdu1y@_uiz?hHW?aHO@?Q7bH*XPx!r7j7%lRiX`L8ll3_+YtVhc9Xd-bofRx$8`N|2{Z%4?MuIOADNnS zMp4eJ+e3z1d!%UognKbY)8k@_o(t5$?+5Zx&~7#RlcwlF+qSMczgO9ndu`k0{$#hI z)Ar4_z4yxVyOLdH*}cEJE%G7b<#|&2DtZL?J;z-O(E=%67z~u3tn@cH6Th4xwlI!= zIYInJrOSDK9RwV^6{xqCwan?jK{``ZO<{H-eP=phE8;?Pp&Lwu4nwYN(l_niU5<@{ z8%?Gt%)B$@dY+rQlV8c!jlFN#j$^;_m646G2Qv0I;x!jtvBML0xpt$K6-lw;0BAF%h#L4eAR#c%n*x4B0!4pboCw>9WE9uSn?Qg~SZtU3bFy5S2 z3i!jEuxl9qZIttswYm1*z3us$otY~)8s)i+Bi^~rcIruYOAkO@LA4b7!S**r;@*UO zW2Cb zZQGic0QjNXii6~dQOuA#m#}bQoZ^w<*zC+0mQi4MGD#?kUmhJ-WSyy$68N&m)SP}? zW=tX3PHxs1Nva7eiQhFkJypzP@>l0`P9IAi1UjGZ|Hf$~O&Y$k;fzl8&hQy`$Jua3 zPO*4Q9BX{K2y}Rb^jvNU^P>fD;+z@)n6h`+c~p`bk+% z`l`sPR+emPjG5+yX)cKaB4Y-%7snvOTND|WnL5F#c0wIs^fv=S|9Zb&`|I)he(-&3 z%_GGiCx((x$=_czA2ex?{^;k}l{Y(K$D zv!))X`E(lH*1NmEyE^VY5^se)SNyadpd2WW@`equBOSND&$rBXxQxnso?X2+mhI+^ z8+H4(GAPL2^XwIsXh`9+@qdc%p?ro&>caMnd ze|JpG%}+EiEn#}Rok%q?agwP7MNQ9bAE$h`b60TX*gp8ZFg!wVP$zg#J7HZ8#Zoaj zYPjt^nA8JI<^^k)HrVWH{1?HtqV--R93}~H#Q{sL9^v!%d)j?8?VOdwwziU?-1k*A zyUfg`9hP<7+u){RJjHK8K=1pa%C5Jp9ZM!#&JOJh8}02RaW@CCdILZZU(fN&u79F; z^u3O=7f#R#P(jJ67j&8-dYi@p49^?G8ZoVdm zKhD#CoxYGxm|oHxr}xoIC>%n!{T6x%^tP%%vr@MM`Pxo~9>`vU-(P|~_u11@*%A-Xn5>|j<5ou%z&=qNk z0)yl=#s(y?1=xsW7>8@)hk4#>gD&83*Y*R;nCmMp7z@npz5jozx~FF)c=x@T>I$b$ zovJ!@!XLk%yoZ;_VMcj@$k!Mi_(0(^tiY0Uq6F(UBd+lrc?To#y;GXBpBE=t!m)=G z>92W)d`*_G<5|MKm}k?B%7lJdaNqOP|H}kkV>H%@9gf|CZ8!Y>LgZD`4TV2+Fe-<} zEkT9qT0(D}h&QVC&APCMEi(P!*nYFq68o`qE7ZIWD1rxz#mg*&#jstK`XVO~6zmJC zngCLPsH)3rpFw!A1TToNamk)qw_E#%{6vst+q~i?>Pr&L(LYO<#`9H|Fj|)-WYfx9 zR{nIc*up|NSn)G(EwEQm-Y2mbo>#R*eD1)msX}fNhzMaR&vH_$MpAq|lb^^EvA8G@ ziG_OxrzhegyFdu|A;>k3qPL-k@9 z${~vVJ_uls#3I=$-fcKrC zmV(1*-z`7Flf`hc6k@6yLHVJ>!PfJY{ZfYc5>SU{)TJ>?@z7I_0F z3HGB5OnHx50zvSq)b6`(Uvzsv%56LqEJHhkfO$~-sbEpFDhAsv)pa+#%Qs?l#`;bUY-RQeU7}MeaL%R!fL$gb%fAVWA$2rUI zJTwn8i0v;h1V$^Sm||H*DsVQV<%+f0ay6A=T_4CusSN#r;m364y&PMpv??QrAV!$R zNP0sN<*UYL8gV5_c%mSVBUFx>2+P1%w*Bv>9iB}uO$&*CmZ-khV*sl9W! zK8qG)XQUx4)FQ@6A=_rhQKb#oz);*HmiuwcuqTp*wYwj^dksFk$cx?UH?QxCiY&ZR zQdLP*RkFV8#FeK`U3p>`5B#^pPhGll-E}Mbrg=#)KB|hpEvkz2+mf;augM2aHa6_J zLx$XL`C(Zw6_O20fY)LAhlRu}uJ<%&5d?HLEXmTI)nJVW6k*dMXDl>SvsN7acMM0m z6CtMWlpN!Cbf@nZiu4IaWoja_Se)`S6kBjOUO|}#^P~_VY_tCqRC?{TM*6P9_##N` zz1}bu3{A@hS(3>FSxtjOM4w&=56CKi^E{VlqySN-e)yaevf=1kojNOXl|ZKP z0WUt@;bUw**T!n64b={7sf+!H{pVgi62Y5YREl-t#O8?;I|^IHl+6<%Z4u%t*+AXQ z$F7Xs9D8}}HONa1kn?A$e~MTg0PIufz&;p1jkYy2=nB{ox;t{tL>_}-K<$JOxiv=J zhN335X?)LSUxJeDAm+ZnEiC~0f? z63(GSEQ}rqU!e6v%ldmkvCb70fnvhMVB{p&%FyZ|wn$2DwH^M*M(=F++qA4Xy7YOJ zE{utn!w9g}M_?&aKcPx_FbvF-$c+`IlBl~!*px!wsi;XEm0AdbPi#RL!HTs$n8;_R zijP>F2n3dJPqdF3%<@nc7~32;l7M`&@(If@tm2f#@jy8-!s)>QkYQy(R)oqRW2CbJ zo@WDio>V0Lg$Lf@vQ9nO$zdbg`@sRjc!`lE2@L&m3U-YHy&q)hmO!_T^p8bqlON#N zOmMmhLriokt>K6h2rnWgn(c1OhjnddGz!Zq7IO!sWU*M(1VK_PK@zM-YB@M2n`-Za zmbK~cS~_``Thji>vi?Xb$t#)c?UHmm{;r(qr_S`>?^^giHTXU;TFp?)B|6U10T>9x zsE^YRAuM2}juJj$no!%lpVh-&xLbH~9vgSv)V+pbG>TJo+Ix0GjSk(Th!n=a;cOOF zF#VCb;*8r?UA3;i=!vlY&B>wxHztR1t5J$Wt#GN~2x4aGu;p zW5S_#HCmIQXtF~+z=eQXuSb^bO~hJesM-aaIVE7aoygQI)W@{D&;!5HK0wH!?(9KW z&u424GhNCCgqhAdG7u|;aiC=aj$P+D<^aP@e3Ip0!>_Yk04K_mOzwl^z-;#rAqQu> z2ft40+0rz_)Uu_<-!ed^Tyi7N?cpTujXXC!&2n#q-8~$CId?OwU5tfd1E)JWB!$=x ziGYkQdU}_4Mo9>J`I`nYZnU6wnJjZ!V|N3_%0~z3eKYSt6q^rloFS!4rL<(+K1ht( z?G|}}%Jk81Uy^t|%XXs(umAzmidy*uW0`K5`$mL#I4<teD9q+f4d@o1t`>yiTqs1Mx#$ctU&3*)S#_W8EF^- zlFAQY3d3-@@8A^f4aXRf)PEQDnD4Nnz`O}&ojp9ci{aRFS#DJt;zd>{-evuHG`h%f zEi!H;loN)L)1k=@X>#u}wDeBk4Pqs&b9f3?@7DEqA3b_>7`FrC^}(GUg|TK5qpG8U zAAS#@ycjxkF?2utf)Q`uj70Xe5CFuVK$@>G3_HmQgb^2iPm+Fbk?vxot`(MDGjo!ZGuOCk+?FMl#o*g^ zgx`pCmy1z;yPZe{>mPb6G>zV0LTh>JL%>VVaTk?=mmnoi z!dS9xs)G7qcy(A3xt`;CU*$Mj60n6(62`NK@AO9aPJhtngr?DIqdX&)gV}E6{~0>v zx}ofxqB`~gm)l|(6BIpz#7K@3F;Yz!g}Q;kRHE|(Da;ZH+BF1#Oo)EFHlTX?RvQ=$ zwoe6#ZnxIP9^dlB#K3zoLWQ8Qe*Gn;6%kk>d9^0;62}#3%oB|fHj1Xe@fxRDiYALD zG<(DYFiRT((nw9=qRxPZkn%LXk|w`5Hb zjeeQM4Uy3aA&80l|5oO$qAoG&*! z9rBaHCQ3%OF;DGcw52$x5%04>=X$hrnvTUbeyB6oYa3L#2gCIx)9yr;B&^Ef&7KJ2rXbZ$XbM#Qi(u&sFI^a zO`1py0p7N7RhJ}qpbsT27?ZZ>dM#uh6;*|~+Bj!W#Ga-mDT?qOK~W@)oUNsw#%o~( zSM*>Mv--<})WGd&S%t~SfEFb+6h)JO(9sly(vuaKi*5+<&qn&#ku-(^ivLZ*g*0O) z(!Nj_N%9g$p8k7X|NFrp+57LX0~8=dIihDiiEu_kqwIaKhX9>S2z1og;g=Ie9--QS zK1OtR$P>12Gt@sP4%xHzDf#3!Enl`Y7E`%FIRs|ZxU!HcXAfk+RufVhcbe2!8Oc0qk6r65*>br@R^J*3z zLKNj0BVpv!9`)Yq{Tla~?6d2ZGrY&?}tr4ocNuhAu5kmTDC08Rhh0|%}(W?|qH zwb@yGn_1(thO&Ws!>bo6L0Vh!Js9DAV514MUx&*vil}V#F~dWg2_`1txCzf3_^cSP zd`l&*ZtJsSV`Jy1KK%C_-Hi-2MN%o$e+rh`?hxpib=t~7J z+^tZvRtgjzv9&9u()FvWQ?=b{P99H}o6WVifX|-^CDSwG( zi5kP0M1*NkC?_3(GYEWrC7$I}g%?GMTk|Gzd2dBzUlV1QRgAwOGS!SD@HWhmQD#Qd zAn$H(g_ocutQ77d329GZX?!xj1{@lTIL1lGw^&xUl{ka=#{v|d&rQG;q&mpQ62fMj zgvGJCN%Ij=4zn%uz+EgC2L8FL(7w?29HYn`hMAxrs2H6wsY7O~xkRX35haW5zBi^9 zdTB>7jRSPVYe8m&hJmbp9}e2ZIA2W*h$kzTtkjF6SIcQxK*(m+%w9cOtfv#cp<)~_ zU6N$$QQ*Cc`_VK?P6Csv!zjk-U#g`_PC`}43j8$~P5q<+FUU0TkVvv)<}FQAC6|qubx?xy_McpTCbRhf|Sau#h z*FD>L43_2QS#~#r08i|Y9x9Gj(jDr1UJ2(#*dlUiG=sM3a0c7)(d>y6Q_!PNoXAdW zS<&7or2fs^=s0xe@#`ig-h|sxI3B{c5vc@z@6g=bhX;bGY^F_xi7iB$@Wf`f4~yIN zy`UYbIqAuY=cDiFBf(q{%>9%-c_5*Px-H$R7eB-z==Qe_^U%`NUPrNROTVl(Tdj3& zC=wmL1uW(3#TnrvcwKOZleqF;n|cU-%1zdCav~wi@8;jEPwly>QTO~$Pdr0L9lbGz zKJ}hAT8M1Y@I4gj&oxdl{MKXF#%@5Af*cGiXj4uC92L6M->eIBgfF6PKcbIf0D2U4 zz{20MSP51zAl$%;#Wm)JI>ShXL_J{H zz?Pt8voFu*y)WE<{}=8jcZrE3t}MA%B_t_v7498QNLO-f?FLrLFXr=SSkfMK(}eIY zv;)ptY611_W*E|0PDAJMtPGq>tB5GfLdE>s{aEaqu97%?P8S5dWAO62#2Xz04(4>e z$g=6M2$D!d^9*93;F#b+-LNH?WvbnZ-xA?xk{KXf3uJ4HY*rq5gv7iba-ZW~&7I;q zZLT4nd@*VDUOYLu_VbxmbHz04hq8VB5Yht-^}LS3)YbCcO3(@eK>2Pf@L|kI&}K>) zvU2Og&wh2eGG?;XIlxu#IhI6OmS2qMs@lKsR1q<1oS`fs!4*Q7h z<%^xvZR7!QeNaQfN~S`wTDj{#$WU)5h%~bDy@`qn63yLiCzQr&{ z6;)# zAO=3lBxtAvlLSD*dgzfwLsMaB1RR1oh(CpRAG1jIKuItT85~?iHO|!KaGH2L`lV7& zCb8pV7&Ischp)&7g8aLod0JkUSypz8I8hYd=X%eW9)rL~Vq7oSMM;_x2vJqZ;`pR# z1td#=x1&KA1cf)UK%y{=EvTNzqb6QpOrVQ>A!*ti5V(_3k={QDKnj#pKA$H-hbu6Q2Ggu%W>c0N=gGnBysOzT+_`GPa22O+Sz=r;97eEs zpt9n694egW1%YKfuBw<0;S5Vh3Tc9oiwW6AO%}sxvLa(J27%*sOVU_X(geM%q~$S2 zaMj$N1S5HI57{BYrVNpjQc_x$#0MAw=3$<7CV^%ZMcc}XXn<17<|{0dHwGBRINvM} zko3@q9cM`z(z_F2Xfs%V0HwCfexG|pTZTN-LXhckf_6bLfFIw>X~de^E z2_fY%hLq-1hY3{wRR?a`_9c3MI5t$>M4lwvp-|w_pb)APDYMXSk@peOnLBpV;;#AS zs}C;hE=}wz1!(BACcWYh&%=Bt>B7~!=2vzfKQX`9-kq-m?QV5sx_-E?$I3A=@`6|i zeRa3>oWJ01NYe}gC6Og&Y<%w(jmfFTzJ*33S)NE`bLsJXL%8mdKiW0AYuD(vRcGJ$ zRC9XulBvdM!%bz!#xv<+aRtxq+7%m)v&y1BrVYI4GO36`1tuhnH1X8RWUW5ETF3p5 zpFVo@^#0foMi__DjclA8NtaHHbY6r4f^cTExgY8u71|xPA-v$E@dQWC;>1YI=KEk? z3=UbUmsw>_)Q$Hr@z!0?%OJ zK9m(b@#;cSGLxxfZ)PN3toW()$g#CO-4U}kKAXzla0$8noA*mgLcaD5$y%}Fh8Z`C z`=%D$Ww&M})biTI?$|I6HqyAc&|hRHRzW=U4iC}!6MP7eLa}0KGs+QiGX|CFZRv@) zalC7#ZCFUGlFcW&T}Db|$)>IMzJhj9WRGt5wjO`{Kiisa+q(ADE!A2!`S{HWm#E%2 zM8_b$Yx#Mf1X>T=80Kc2>7ccev)i!ge=|2WHV41A?i-sMBO8u!Ax0fhVSORCwYIjk z(dlf!-?r`gCiyLx({4i>-AJc^JO}V96x*{F!X7|UXCUnim5QP6C{!Amq+1S+++7Se z7=~4(wuZDtwZmYSei$V0&m5^OiO7Tnz+HZbVPN?n%ha6&@9}Bh^hRy_(QqkF2AsqUCj)1JILU zyPyd9q&sjbqO1y{H$=fXLKX#U)uZAcDkJcGHey$433Q=`iWIZ6`7T3J5}K~avh)c< zl4V8H6N>cuvLI`Qlaft0&1Xke__S;4u5D_vPzJ7CpIGziqi!~z)pea+9ZTzRW30)D zIYCPENzqnQqt)Zg(X*N!chb5RPiXL$h@(6$u4}KT?VgI~pq)4@OghLc3%sQzoSZ*4 zUo}!eo|_hggs!n{KIr|A#NvprvFPf-GQ8|nm*URQT(la|#ZXuHu9W`nV<1p^s1M{w z>$BFSF)zX%UO<6}A5BO1-%!pwyk!QRz3WStAD@yDZJIY1XC|8Ug5z=+k4}j!WfJoIO&Py>00xWl%tf>vXLmIWQXT&caoXROV(~c z`VQ>`VUF0Ok$zr)(Lx4-)@>szJFp`egzxb*Y9=)+N2o;j|O!mHy3B9Yqxc`F;l7soCB)(&Sdoh-;#vsm>RH z%3$!HaM~D03{jB;QRH9|s?!Mu_9c;7dXj-mEet#Y^74vkcKkEQ@oo$H~0B7^QrWy&qI zXYX^frdJl&TILNKPBtAcyYWm(;%{dq(Y7TZ4>>U&ykTRiH8q3Dz=^^IZs|TWIQ>(u z=#H~NUN=a+Yvo**2fjb;>?)LH=G8Xl*wE{K+e()V_$zfvMWE2wa;nBwzC>+OV^kqS z{s7(+aSE4W`(jtd?xbiJv1)|53U55vgYO-+XYB3~@0`fn((QI?^xeB_xHcH`2^BB7k(5opfBGOdpP#t*e7D2j(r~KOpKop z0Y8SZ*#nFjN0IN*AC94?43-|D#Q>^LJTZa-K zuOOT^j@Uq!cRS%2Hz6^cdzIi4&N&zt;X3|Rl7U_joSx7{RrNHR=k$11PmZK~-Q-{} zHsQfJ(`CovSwS)7L_q|`C^KdH>6|S}g6?^VJYUGz^_g_laO_IKxASZcSv(Hre%YT$ zDw+29gq(Xi3jWr2HpYf z@L9p;X&iB2<1?yY2IdGS>To{J5L=TtK_!e-4IT)p5n!TkaWPD7XBTm_1$#*CRwSu>!cWcvQ%Hv%D<6axa&^oo*Mo7xYN3s?Y zTQulgEsTCcDX;>eIOQYG`Xd{tH+K0r#SiyI$l*m%n$;16vBx1yFV!9%ZBge+@xU&Lc?`URT7pqHaJ$*W)pi% zmKTBEHq6{xcZ;^>TjQrzURaZ1eC@aU&`u-LJ;yGJCMT2=O&U=S7=F@xJ}omaZG(7n zsFUv9kyX$RcOch9`}@Q;EsazGHCspW7*(Uk6~{{@GZ>6RXf2Y>lW#rAq*WD~axv$w zH}*yRU2KbDjn`2FG4N{`cwP$4a4_qGtH5V=6Ym=X&U{SF)H9bh%C0RKCU3j%$TiWd zp_${Qrw~BnDe0Y+WIQi0!aEG(9k9vM*cjV!nJ)uQz7x#OZ2Q>YU`H(sqrkf1hUr_A zV|Z4vEDok>e9&n^oi0!fBk?{SGuOFumWL$_%>}<6&2lr z21Xd7Tk(tDs|xe|jPGsRVo;;WR&x-@u^%Ql9J&P8>ox}zKm=!+z#a0^|Bo-WY*z*^ z#;EiE|6hwR^tFIq`Z=`aDzuRljh(PRwjRcWdw%O7Hf%K}nG!-`pYr_7^H?DD(G*Df z7a9|Z>FWNG5mw1(%1J9oo7RREhQmH%owZiO5?8AWgQ8-(_Z!#FZZhz7b`p2QSAbnG` zNg7!2bt2G^NGdWw4$&`brxH09UpI$R29f7-c^17La#myi-W%I?o}SECb;G#9Fczv= z%p=R$_~^BxS1joI4aVh%P8~XQiX`=g{f+&TqwyRX!{l=qn<@wUik!3CH}2ivu=4ao zm0o1%)hs;+^#1`YTmKy_9CL$4sX6o|5S850$b(SlN3 zkX8+2-C8${RS9V4Kx4SF=NqfmdFw(rC-5*Eatwc!Wa_3a zT_qCEb_={vsltQ}#MMi$kmOVn2-$cGV4o0$}Y##R}W~dh9G|Q2XLOrVfm4VUNbX z{ID#etM8t+WwrNUnC>Y~*-|)$o3+-hS+0+HyGh;~Q(&&ILu*@sM06qT(2((@>$}6n zwrC7wcrkQiKwsqT1Gkb8+z>*U>_Y^Gq=+aCy`Q)0gNGoe+WOdT$&yx=ebcDRjx@cO zG#E+FTL{5mXcUcsNTZj$w*QoKS1oz%wIg#fTy*VpEtxOuu1k(Qv&sm}VYsq5x*dNh zMm|h^Yj>laMYrvXeYXx6@|-EMMDj#{x5BrXrDERD-n`O>o}!%wo<9_NPLuX!Q?js6 zM)ybl;k?78^ENleIE=-Z%=LT`SrgS<0baC%b$304ZA*RQ` ziu3p65&2V+WA`4l9qI2zIAF1$b*tnQ%oM+G=JV$7-@8h|IAf8`AC4t6u}fhVyal+K z_e9bC#35R;Fa7PaZj_da3@+&j7ODw@f8)vi{Era~n~4Fs)Ak8kwO(9++@W7$0KIw% zDeW?KTcDP_6yK*Jh><(5*C7ukH9ax05~LNo8*tE3MYb^IT27^1bz~)Bm(fa-l{qGO zlgg-!A=WY+FR-#4k9)poE$jMPyOZ<+hLc$qIG?hexc;-mR2iZ=pSCp&O2N3$n^~e~ zKW*y*f>d*o>$8UDu(%?H>f~qvhJe5T(xS==C|}F5L{W;S>t;r)g{*@PMj}b{dJH~8 zisNM&IDCI0J>6KHn5>Q@h={&IPPR~;Xdfmm#e(Z)podJw1-gd?VwP9n5g6dqSk~5X zH9W2$jzs9I8-ANb5=mLuP@zRVYDjG5#?`B*p$U@Z@dnSg8>90En_3j1mtT8q{^%an zOl7zuCl*FncC7aY-GBgbwG?N}Sk%t4>5Ubu2!5*|zt+CY|V zoDhVpAQa=S8!ysbD4^S=dqIG*Y$41lM0CyfW9P{GVq+9j%tL8wWG57%5cMZMlwb8l zt>~{nr#y_YG*3QN$Z`$|m|dp%F4Nq_1gs*m*#fJaRv6J_HW*VR~U6~u`NAtjiw!{)ej{A4`M5+89 zP*0!ML_rX>(~n*2$g+96kt8Ig-(kvR~Q-FKh8`~KISIPuyOWN+zksd%Jx3tTr#qT;P z9u84+87BY4NnspFKIMG380NhQKik}ipN$BtVa+|=Xf&c~`*OX0Vso>vR~rS|@M_qT zf!_eS0QhpZRu#myH`4TT91z@#oFCeO;xEVa%|BahcYK^Y4y)b|A6!^?aN&Hh0snNh z)vkTE*2dMz>Or@d-B+#d%NE^(CyT>>{W{u$XV2pdPRD59?c?rr>0x5q*Pp7a#CG4= zJ?LwHLz@8@smXN`Z|l3mK$(lG?wGqtu9j0jRLimTFmUE50ft1rngs%D0mG37-@uC9 zwM)=Tj6l$@+}3Z(#bv4XT|BX#{x#6#>{N2@-5KKEy1z6xbI1}Gz72cdf~52G zh^o@=|3dE{Bm1=D$Cn(#-<=WRXo4E7Q<4YXu$0!b8)ED}8WT8Z)fUVGm4~O=l z&^_EB`jFk0i#A#`U4-9yef_KJ>#(k`ub;-%IPA2cBL$mZtr4Sdz0GVpg)Do;@f9CGtKc6YqT~o>5AQMLbLS%{N?i{Z&P>==J`E zT(87?|BYgdmf}jF>%A|(VQT8be&1HjCCABK_(iL3$;U7vB01js`K$7eKVCTf&9T$4 z&7Xcw-niYRdF`z*1G%gB^V0>`dliO?_{DL}D`7`Gx3LxV!}o3U%ibihF!H=z5(yq{ zKBt_%Vt5xz=|UjEF+h80GLp+*Qh z%CUVB%h~+J&*KMT^gM8R^gz#GK|9{7-Ss!|@8Y^#B&C4XCgH+be|%8um@iE>$gQC- zzZbf)hruyt`~KBr59-05IwCtM`5_sWlp`NGA5X`xl(UZfCOHc~Co5k$@IOC5PGNc7 z+U$U{&LNi_*?`M5_we<2|&YoGuTPr6I~FQkUeb!kK)XU725~jtJ$_ zqGjs3AX&0KolLQ8XL5RqWn{(XSVqDa6^5B{Y@XFr-*5yrp$2yR2ZXGu3Vf}MW_*OU zzV(HD)sfd%foc?!EXU;XGp&WWnT&4ota(IYInS$R9b3~>!%u~_5wU-PF&w>BTJAP} zcV9ZvqLa=5?hGfOuN5yjxz^m*Doo{znxn%84#>*C%&e`={G`%sR(|3Y^8VMphUTku zmnKG7D38H-Y`}On6yazZd0n4^c8eic_nUxJH+w&^)r}3+{^s&>Y6X^+)G`d_uKBF# zT4&B!=OLlLpdIvuXUTc;;Luo)R_?K`-J<{fG2VxLjAH3l7KsgSS8C;mjj^R#c4dEK zqj4I3$wqGrD1#HEapFY1zCvObV)(Pp!=FWulD%^csZJUg9-()xE;WFOA8JRJ#_ou{ zg(8AMPwI62F05vwZL3|W;j5x93AeQXTD5?0PUX&Y3xuAB6@k{Qu#Ka!3b5*7eyAx0g zVSHTB^sMG_!2SzG-ia6E4qp^d^`dH7!y!OQIYw4fEg(W5gPjO7Fd{*m9a82*X5qIM zf#*}Qn&c2Tl~9UG0I9r ztM~P2yb8;D-jaq(xwwphA0gVWX5brOgdD0@5=46&=p9(lB^(%l}`vU;a5;zsX_ zszt1Skfb5MqKVjQ?BUq2_s7F=G7v^GIQ&xaw;yTv`&xci1XeYiZX!K4>OI^ba-Z#s zf2b*-*SFT`%ri|tvf67n*&w&ER-zUANhTNX;++!- z!?577JWH6JF%3CY!Z2zqA)OVK;S|Ej@EEv5M3S%+gX3gYFdT(PZ(*76cvpO2POt>Q zg0I9AQ&_fMxM3(~lt}irHL(8~i!~9YH`cd6-sX`hqcaU7FR&C8hlYAbw_NU`EM!+U zk;ul)1KsX{xxJlQtrM8}@u0XEm-oxMt(NC||MkG!+=1?DCkQ${OH)$*wIkN)VuIB`9t#lSQ)5;c^It%8pJjnAX`2K zne%Bly{I7ymADJHVe?E2k6;-m=(XWBXInsusI|1cVr^I}cDe@NhHa7QAefr2)f(fQ zo8zLl%XLSZ^=s?R5!Y*5R&aggEs`v7`bj(8Zl~>&Iy4ONE#u?x#O~42(WAX*M0X_Z zy6K{2W%_ja=EbrTzhYAs3D%`2DB|+do8x2So0yYgz@F|sbLI@O#_^q%0d~6y^;e)M zlan<1+4Y0i_F8%Qg-htJ4M0}JzHnb7Gpc?;7fEC zuk1ka6M}>vhDWl)sPKYYjbvSAnBh_8xkP?kM_dnFz0~9GOrjxU@=nepR(}st&x9Fp zmCRX*OG8`vOA}V^!O(afcN=(S2)8+`{nkKG&}v7KOYp5p;}lff6IK#7r>tcC6lwIH zrJ&7H9XIuQy>D;!MC5bu94mi<$ZVS^3hF&U(FfOikQa{5)1zV{+k4{t`2qj`XV4!t z)Npkov+4kwJEA@Wr~$lY_t;#pdjuxghb-%__WYHY5Z^VLt97PQZjKPk`itei5XDgc z_%wXu_tW?_ZUyR@n#*9&Jp(>$00ew3^x&IC$D9t1cc=vSMb9UjO{URcntS7W55X@y zShLeXdDg6%v*jRTlVZb?l8vNfHA+EH8XV+p$i#7w$H|3QPXBS?Tk!3F6J)IItUh~x_b5vL8~^OXa+g5g}dcw*#OK4%(DE-paw7Yr*`I8r^abiy|Bxr3Fc zzKhhJHxotx4k-X9!f1y|-07oBn)F&pUracTq-o?8hvqJ=kE2>@yngB2 zz)t{iB0`^k5}U?!0qYN6vuUI=}c*wRMmRD(ZEq)-Ab;Mrl(8iPXQMgj^Ckw=diRd08Vfk zdn&mIFL*eboc{~v-^AJp4iwpSA-<0e}*2CEEaoT z{l+(jeNMAfP86v|`~5$GGmuB43WUC<4}U|GuaGsJlcyUuOp8Wv4?X_I!+3IZM3bj) zXiUqT7Tduyi4>(~7@=n8!vkT^x4HTC>TI<-`sME=Uwu2Css8&# zuko!_Jh`n8MmqgS?3F;zU<9&eo^=xjADRk=#47F}{&J`9;85#yX$%qSg&vu|=J^Pn zAzXLhil7z-AsNFd8N*UiPz)ejJamZhL)b`Qx6#csa-eB9+MRX>ZwGfl15p}&S`=Dd zEAk@oYgjfBg#zh@a2al74cd=0%TWum5XLz&^%f($ZO@=nC1yvipAzP1n7hOTc_t+4 z1)$zL6is4EfH#{a25Lj<{2UxssXKuGoflE(}HT2 zpb``v4edll)_{Q`JPrQFGDP8Y8)_p#I5x>KNm($Rl#>=6YCe-lSiC7Q72Ysds5@Ea zZNljyx*D@_o|WUQ%h*|sN98)pq3#{%Oioo3Qpv7y361r(`ybN5aul007BAUi1$c>y z&9_T7YD5^x|!=Nn;jOqt~FZ2>J&l|dz@l|JqN#|WJ zO)fDE!_K6Ns?2km1|+Cptt7JvS5wI)ylaY_rNmjwwj||A=rWS1D{tcz*u;z()7X~~R`q)(=R%IzRN+l%z_EbFBquP4zB61-p1r>5+5@vl_yAY$B zNg?_DWbcRRcsw2dUv&L_GFJRPx#E>)ah6e4T%UcVdwz&GxaL@&pV*>tK|+f5d8kl| z5&Z6WIvwx*Dz3?`yCzIvW`dXaKLf5=PO?}X1_<#LTBE=UjA0ur`x(i%k1>Vku$Edd9))fy(+u06} zZ@AT4Ia@5Q)Y6G8Sx?tiipBM8?-f|cg;=rnidwq1o=r5?Vf%_&B724gf7<2;OsY8y z;o6}~gn?!G@YoFy(rA&86QcOVYj?3QTD@J8c3t}`!SAKWru3A2%{2o1l(a14UXcFi zPF;SE$}h1+h<1oM>d~(hMC?%O*k9ZFw|3jQk|$lmJ@BuF>l*8#?(8OxZvTdvCo8Ve z`;)e7{Da}{@N?lY(k_kM8Ss=E-X<@AkH2H}$^17rh%%l=-YlKAzxmC7rb%ZXdkhcB zn4KQ)JvCIGNzq&{_Ex6)267B93Cp>2EC1mGd9v9*#)5j^gv5jSowgY~j)&3nwL-8=7(;6dgarQt{g|Lk5v>P<>rfRKJ;NdDL!AQ zD*er^+;6~>h1$~p96b?^rBm>JhtZm2nfSm^-TS>_?`QWGU-Z2~??3J>?2vc5@V%(IOG-k;F=*=?uYOvcqPhHLL5 zWM%*U-d2pp%IVjU&9VcVt7~1=gF#IhIdrQV%^{RY-A>E;a9rsTUBAMO3Txo>GQ ze(8AU@MqqZf9XX2pO{_s(fNJNsWrYjamk-R+GL*c{QpM&l-wVijiRFnAxwNwK6_wPet}(ungi&pVk*Qw*Pp*Y2=2+txUtHZDVnK*M(OrX*_Hm<1@) z*9HhoXkLjfdNhX104ytfds5NG_9DqA*2P z;u(|Sq_mSzSOJYA84(CwS&`7Y(PLRjvus}-$rCwE&c5NZZ^#7qv=^@X?SugHzC&1n zv4LdP?RY|fs|BD_tpu-%ZYr1Kc+IjbgExViHe)-!W$O9AWyMFcljnTQkFDKu%i7A$ zk9pfIw;b46X6<>)^do?_;r92O8*r&gC6!;9s_j+`aQxziZZn_S(#p)j{P6K zM=KD~Htyov-2Oc8@lyI8WT?#NEAcr+?JOk1U`IPI0^{)nw(NK-1fS?f#tOmWu!Z1W zfL2~zq$?@I%LhOs3u5g$=G(=w>C(CS+(enzi!(}A@d{J%atRj;%~QpuIQ0vmKkY<}$yt5nTrh-TcS7~_Qut+O$BzT@=y;Mw?J z@@&^JL>p;!f*(z-w(6Q(-L017Y-Mg_PwN1YN0?4E=&nwUE=kN-shX|ulPe)z7y4jG zFi#|?%|U2HL=6vN?8Eif#wPO{8~Mq}{N`r<%y;p?dlLfHT3V|!x< zV3xZ!wh_An?Jxx#nWGgvObtirXf+U4hARpuNu`!_)#}g8BEso^uQhQUtd0OHPGCymuG%X|m5w?J8cqRxFw| zvv?8%8tyuhBh&iX|I@N|oT3E%3u}Iw*n-x0aYAlt&A+p1f>8U8oUohPKL!m=uu0k< z*t=oh5P<8%w$UZDRRkhGP`h+*&lA%5z~|onu3K*-v%AVurK~|-mcI~F-}~vez3sN! zoW+7)D*48gHAMe8)FKZpn{a}xwCN1lLE|}?k?s|Qy`%a3S6=w#e13GV;0Qnd#Mt9x zKkQ)gmtXi5nk@7__4wE)hVY6)dTJ75Zp5i%o5HIlB428tYX*4D7ja4b?beldFHh9; zxFkEq`l(Y*${ih{>(>qKlg(Q$omh(NhJ+X^r_P?*qIJ4APS4WicA665LWJ_go%W6t zJ+B*CHR3jiEPchOhy161A9>cUR;#m@lp3k&m!_xFuuSjXLn^)M|5{#K`;)b`d#cr& z8|elt=`X?Rx@tAH1D7|X^_~-3m52L0l`zeOx%YDqJn*>(h<)tIW8XG0<*5fS&F7Ix)`H96WGDVq|@ zI2@j{c)0%VQ-(1v*xVharl-=E6|QJsVQT62n!bA%%gu3I8Lrm_p}H$Ot>^M7r)+AR z%rX{~5R2`Mon+%I)Tg#O<-Rp9gF+9O@hY&a+XvbfaCgt9D zGI>t%g2|mYS!iV$p0l>Hg(r6#6eYyTZ)_B; z{S+|&%;s0EB-K-pBHfuh@~l)OF{yW6n)_IB1GjxX_d)U?Je@`@Ld6Q2-Xmbu57vLM zPVR-7$uL_6?Eip_;epXIhwDJ1^bDHzqm*APg}89#NCDO&jSqal^1eqJm)Eu|@AAuQ zZ~j2dvp!I&t*?957iyR9=(q9MXowpb>TBJ|o2uIa+LQ)3Wcps1%M4VK==D*y+EJuA zpL~XwjNf56Ued^?7)9b3=JSFfd>(f`s|fa_2Ba(ZJBEZZ$E3(VX^GbpBJ!U%r0YqO z6F8oblPr5PFQUNmDxN5sc%U-&eUi) z{=i!cZ+&f{_w2p->z^&&TOhM6*DVxYQ|PyU#7GxVUsn|aG|YrnTp}xH z&tCV?cgad`>)A&ieel7r(fSkz@6PVD;Yamk7eiYB2@Vh5LTQ=UZHaNe(v1f#A7{38 z5?isX-X_LJ?`>KBF8}S?KJD$W{c7XP=H@vJT8uFXpV`{lTv;J!fpOnhSt&;G%iue1 zP#JiHVTn!a)h~JVO&`9Aoc-vv*WGfcKmzTdZ&2_1IM zC+vw}?23CcUSnQd_(_`FnO=~m#vviql2_G*G2bh4a=OCIvFQq#7AK6OYjgE^J25uj zP4|8^Juf>)*Omf#kLQogs|8X?@zQi9#nSc_`r^ogIn$>~{?5g%{k`wIHJvbJ^veji^rys&Wig}@e8n&Eevf^rYT9*^zLu0U(u`p);h^PR1C zk&$=3YtVO#k-RL1F`y|fN9ad2723)7X*g26q_uy4WB>lvB}Y#meTHI2603cc)NHJ* zG@8;??S-R96BKiDXZ)?O1&_ir4Egx9+H`?w$ag7*JOU{~i*Dr!LTkO#M6p{UFw;ib zJP+%CKl^9@v)=pi5q@I#1piFqqgEXWw(#DfQL z$rOVbq6;8tJK`(`TkgA`hxy^gQ%oB*w26F#a0NH^D7fbg${$QJBOrW2w>68=j|`U6 z#Krp#&Xs*BDJ|SNeXyW%-{WcvaYXCaoNC#UC0?{mTlH-Hin(sRtRo~Kh93Cel)VX@ z99MZS+Nbuet*g7Mx_X=5_nxJv*BOm8(;CglTJ4c!jb-Ddy$i_*VPi0g4MV)dY(_T5 zF-u@rLoi810))$DnQ(6cNt}Bfwh$6PKOT!i2+s*iLLOkl9(<8~b?@2wUPMxYc zr;L0)jSKmW>lV88lHX37sYuexbAq9TWQ8FdYt$1u$KEIK4OuE>W|lKSCeAQ= zq%|2%irxvYEWB$X8L)ZAr!ibWPmJpf~3l@Zn3%i*kI zD95syfY|@3Je!vYo2VJ#kdg=(Dj~kaRCX~FugDQQ95i@NXIbsqR((%7Q{7&TGbCaM z{ko$0#w^jBn37ms7WnqQrOEt!CZchAG&~v0&hD%!Ual1NO@?_5ZiWly)Ud#y)|TAE zc{L`c3nHV597(zQKJ0fmn%bQ);(AFSQ~;1ytn-B$buzArsuVYqGfS%9jGJ7vlc~=K zL*!))F+YolfIjAro@u=W?pIMgTXDQMk#iBm+=jtKQPV;eA~R8SJ7h@NPEG7f8MYi^ zC4HGmPkMcPfYFGw&Hw(W6bQ24D^4!w8=~w>TG>eD2$z{E>Cuoc5|44UWhVaGYROj` z;`w+SKGoxIh&Wz0y4^LnoAnExjS)M*3(23l#+>Dm$-#Vom3A=%gkPb^Q= z+fwIKpZu%DTW<`7alD4Y@9))Wz0oBmUj#;I;7{WmG(ghGI<`3x5Q7>Jx7d`9^*#g(Z!bpj>Q*ji`flhsdd zRz!Lu*Sm4426T~5(e<;4kvr6(pa=yPFch))fR8K`MawP<$UwGOT+(24cZylj6}VqD z&WE=7{C_kX=EjTuS}N`=6#d)vie zdaC(Qpwu>-Q~j@V9BC)UX6Ra0gJ)YA#5YCmn*gbUGyAz-{{__Ut&kM@q^4@Gsn@q?_twwuJ>h@aCx$CjP)=D1x~c zs8#F?O}|M~lF9|W-E7Fq`GR3Ix6TE>63jW7rzBSJ`4V2beSqU^lo>(_t0V= ztphIeDbZNJopZ^Hz(8Cy{DMwX3zK8X)Zi;dbB)Agu>Wh?<_t~G)7w6eXT$=@dk1&u ze!x_4M7>0LZu-yB zCil?vY3H@~a={zAt-*b^x;G57wVG3`k9IRsa_$#-!spsUhc~? z&fRZ$`Ip>zZ_qJ9PCs#a!oLniPRiMLephUE0k6EX*V~aB_5pHs%gDh@|Fv750q4Hc z(6@|yyr5c8jEEZ^B7x>i?7Z$pzEl#mO38NVs zP~xJAZ_jEsP#C9kNIX%1STtR0QxTl2t7|*c>Sq{{;|-CK2+y*HsQY2v^%5_~GL>fa zZ?bC8VhF?746AX3Co-2B=X9?u>sFXGI7TNX5s5{-QHIDNP8S%NX9SifLdsWGb9`F& zhIm-URZVKUGjsn}oGy7eAd!NM*Qd&ys&kqUWwbFv4AhqPHLKO^6ce_*1=*Y8#kdIV z+k)iPSXt#+Swzf5nfO^EGOWT{j3u&4fCCcGK+5mQP+5IFSN5>3`G$w9@jJsrVn ze=*zBEx7IfN88iu&^W#SET#wPzl{Ul|rsv zO#~#3Wn9x{0v%G9IX*`Q=lKJ4YAu|o*P0iDW+F#_Q}$>XtbFEP<6cU7{DlS3w#Atc0TA(M#^;t%{?#QqOC_P5}CCa8QY$@}0E z&j4F#Q|5x`2A9fRhOr2oZ773YdQQK8(;Lz1G>AnB#1@9A_zYd=TJ^Wx?M2uh$&0W*nywS41I7T)?LvY4 zpi-HiUYagPG7-}rkab_JR2D*=SY~=U?4)lzUp8<>i=YK zjbb@q?DPxdPs!_{50^bH8ZSCQ`$#d53LQ~EfZ}#1k3o2#2Q_S<4+~j7gLDPo$u_h3 zj1Lt)gYiW^Dr-b1y4?R1WEh`UgC#-nk`iQiAfq+;?_o$w{r^W|i~u<*6S@CwnUT*d z7bdB0lQfC$?f*(vi9u9(k`P7uiKLM*Y}>L|Q<6jqdC4C|?)Z|dd%yJHp-jwCs<}K* z5585(lcrXylysOP4#(Ma-N5K{Kn+qFb+J=)@fIH(+rE-06cVL!Vr(o?E+y{rO(qhP zK7Tp@Wq+T~(_O;F%B309?8IY-WAXTLU!s!m87U+FP%ejg&;M6!8|csjNTAO@@W6*F zmBIZV04}6Sc@V09LCGkv90%U;hELZ9@v5Mo{VDXbFg~H9D7E0PQ|vSx%`^;cSU}=y zT(P5+Yulp>;xX^3@!xx|-xw3gdN}uozc+r$drVx2Zm*Si(eK)+ zPJ3oOJ3V_nhc-2k%pi;d%+-TA+u7zW^4@G;v@Kk;?-0wqR3z*-AQy?G+?15)#_=jV zo7y~f(+GW752NKMc?2)EGq=z^C;iMw>inMAnz!xD!1sd2fUq6ki+sZ!nvIKMNBh(M z0hvoaxqoM}zmeRz-%%|<+JBgw_&hb^OZohMA3`Zn#`>53C~3hEGWws^@bG4T=sNu& zPaTG`EnGe3nFW&IfEB40tgcn4M$=PMenYf6mF#+DZcHW9(?lJct4v)pJ0Z)QUh5q5 zToT8|c4Y@IN)Mr5-@xnT%j<}{Kt2BGKB*Z9zu@}UxOD>)L5>gg-iW3`t%IqBF#aKE zL$|+yD8?jpA9cuqU;n)8mowC1K8ErpE$t&MidLjlr~=!?LqyoU8*H?t<%L@+1Zx;iQ3X~ zuSWzR>7H?$I16WZ3ve5G5e~yWe25_CoAaJ~(C#?Q6CGy;rxV;&--H`RsWh# z4tf3LhUwL%+U}gp1{q!<`EhNcUcrT+Qf{vXL?E2QP1Bs&zB=9Lzj>c9p3YQ-blF{p zoftm>8i{Nm3|m0YAhcQ8aO7d;v(K96pLyn)U;Y&i7pyk!xDO%{Ac%*>OcAv}^83*Iezz4A-@-_umt_n{Bz zilURmOR?b9X+1R|G4#6C@x*A+|6&28(XX_bTFR)?UgIAf+&OCokRu7b^YF zOH6s9OcPb2c0ES1&y9z{1t@?snAo5@+M=d8vw?bV^o^=asbY3PU3$gk(^Vv@K9dy~L^ZK^D=-NfHecQHe znea{NvB}w$;-2YbG^MHW@^6J-{$}25kT;ZP%GbwYzQdUt;JkGBrXY9tuyky;zDrN@ zrLnO`!l&T8gA(_K$XKZ~c6PE5kH`NaJ;DPh*iYLd2u+=aIdXsX_Gf3x&`7hmGE48^ zmOX2wv8S-Ir^d3|u92X*Yqr%F7YFM*^Z=>@q;W{yKWZD}T9Y{8P@O-wPY}-x{g<*6 zs|h>xH2s&dpRiM8C0~XAl~Cf~!9=J+cj9O{KAp1E$>M|NHH3g7Z|XIA%~_Gd?MQif}L9;nwW{GrYppPg*{yYXq7{K?%vb)UGlK+4+j}SkNCM0o4}`+u_u<&k#vuSy3YUUh&@Tshl-Zy%^F8#UNjgdTV2YjrDVlSXAZ+3H4SX(>V*j=w@ ztq@r|`i*S8zPq7bJm&_}{^9wpk!z6#?2%M?8+2Vm`Ac{Ei@$_X`)7$_ekRYI`D17M z{#I*K&e5gz5uO;rXcgDjeUCrxgDc+Z>vnxZTfDod|4slcH9|;2n=JA==~f3}^*g*( zYNl)Y|SJvu+3dkN_oXy>>$&w^%cjsnBeh+PL>h6kVRqmeJtN673yHRX0r1g3Oe zJ0s1xPig%rJm!r~Bg2QgZL>n>k*3@=XM@@=P##32pf4g$KJf0S3si{I&dxWlFoU*# zcXR%1;fnU$j^^IdxgEDB&dBna#O*sK><5yG`|Y7@W1ZTdMIFgK1tX$T`5;!;aO|!- zq^0@)QP+bJ{ykdAr;*RStgCDqX9(*0^g9OnetkE#`J7i+XL9o@|Sv% zVQ0l9GfR#R?QI@@_>=3^zfJt@HPwe79`Ph2N7t``QjdcvIx-(QoQxykopaV1YRa^U zqG#nP?p)g9N6Lz=OV1-lZ>8sWK=#*HdccgiE|KdaM;x?RToHSito)a|BXcL>luS}w z*^45n+EhE15yu!O+G@*g4RHRb0pvwT$>GUvck=s~q*cj=8BDSz^$c`ORjQbGs!|w> z!jekX7pJ~6wMdh{zeCbY=5`{fs`Nw>`{tNe`Orw=#lCegKeh5KMtTnNc1I-Z$B*yx zo!i_0_VOq1`S^GHz2nE9JVa9Oj=b@G9@pl1gMQ~Qe2Hn-%WT=D=SEc1t!6`{xFKS@ zL$UBNmI5q9d4Cpx)Eo77(Y26M(Ho=_F0r8vE#?AeW7gFtZDi%+++m`Lf;2c`$yo+N7GvbI0jJDL;v~p{Z zJ(O*G_k9lmjoeMaZ-X*y$6M7}t@__i z?$V_aZy!k)#bMPn+$w_-chW;Pd4N&=vqd5wTl^O8x@hFFP5AP+_ttu(>)@5UAm&^A z1W_K^bnTUqueK4`a}bb^kTa`{%6ws>%zd|8zw*rLtsAhrdWNLF@I<})U9P-v>*|?N z9RbG9a4l7R1aVOYTB;i#x^bmcqEfm?Yw2_?P1dj9*?eMZQjF|bT21eK4UJam8O2be zmc9NoOF>2o#e64ileH=nHojqm84~yQ&wI(){=b#6dIuemaFM4}qC6-9wzv0-<}+UeR}-?3vW$ByayYNuCDpC;?i)sp^N zuUGRYYtMcA+e3PV%6MZA(zgl3K~_LE1q~EB&_O7EV?D%oisV08wwgTn?7?J}4YpN5VQ-oGexMvgIr?>?|U~d`gdJ@}3)O#v7KoH2MSmhesfPMec`pyM$3xI&GB9 znF7^JJK(v6;ymH0DQFR69Cy&BfyxexS?Vdi8Q!uH!e#MzC|RGGUsf3jmQ=zjY-9WW zI^<$|b#Gy!(O%fOWE65q=PB5H5xh8DDyKp_)#LglGxBFyM!O4*l-U z6kA*)R5<181|wxw zA5Fez@0pLC*_+;e(<3)+Cue{3qxyUgC8@pnbbbG>n{L{5ur@NEYqUq(mh;7_$u~;E zTwqYrOMO-g7}{@W+9zM<=eZ!px+ZI>^*`323=VwuPTp@s0=f|#@#&LbZb}bp1q$Xx ztAA(V3u@4>etlc&v$(xqRX_3iVKYbbYoAcnXTO|Uht2(}X{aNujmot&N>4cyZx(nS zYI=`4h9K;~3|?5d;8`g|U)VT*!9!Ao=$noneN(h>!LznTdMhiNaU1d83y$R$y>Ta2 zSd|ottVq@J=tvlJw1AB^d2=Y?GpwvOqw_|IHHg8sldQ3CTZ2t;oeXQ}e6phb@z}V} zNb05c>x@pK@AH*@Y6SZK@TjgGN)L4{#6q7_FpP=snGBwwWcOvq@2!4~}PIu}taq zEG?zK!MfXn_m@JnkQOEXJ64v)92f0ZA6V_K{Q1iC!tC|_m+!u2=D^0m^3IkUAD~B0 zQ*@X*@C8E^^6+9abgr^XpEPdRzW2^M_wH#n-?_Wc?i@V0eX=mK=gueY#DdbnQwJ~Z zyULbWJJuk^&Nqhfbt=w1KLfM!*YRy3uTQ$qU^z$S&E4UAJ)(c)-9I|L5C6Kk+&|=U zd$QU6+3XgYOQIIgFxJy(-)cbzO`|~WXoYx=9<5w}gp`gvFn{F8{BzD`Brczq%HN8j z4J$zBKR&$kS6%ocXFuHi)lT@^l!<(RJnZ7@pz%V|#SCe83P^l~aCLpXy#;6{QMWDF zNjh#FcXxMpcj>shySux)ySux)cG7WoPrf8y-1YT+ZQ6uh6Po%_TCglaiC6} z!(QuHhB(o^rYv8Y_fh2ljBS}f4!>q{Qu3K(RXmMEAuK7LBF}^Pc1O#DKS|N*9YtkD zG>o-3rYl6~S0byYPu2HKF<=~DhJXx@+1ZWF`N_uYvFQHOp|2Q9Rv|IY+3h>mq>O`e zlcfj+Rw?qav?5q)0U1_4#9;55!#hkeZwE%uqGWNEfnFZ{^eChqd1~n*)5Rs|p-mWx z-`SeG*W>d*l%7{jze)nq&$swXWGQm%yVl-U=5yr;<);1{QQH9)kDtaJkRy59;aids znptRUK1zHL&;uCx`lNW;6-E0Ks3Oc>)T(7KfZ=85U!MjOIxcMDE0A}`s7ke4%fv#V zhJPeH52@~^(7rr3v4!#D%M1I^t3U;367bVlc^sSRsAz#b`cYBO+)-r_3$pXN-hN7k zTzRdIGKVRjB59g!b2DB`U8Q@K1EUUXh=#VYW*}@cRYkq}?aR?W;2ycO03h5@!;G8k z0eFm_94cJrz{|+Rv*t)j)?pmb0%qF%PU6+J0eE2BMj0UuP8*qTep5tu3Fz3o=RGE3 zG*)QO#>FP?MXxQ!KH=c|+U`ed8ZlWY&+qP!-|W8L<>!2F4~NI&^UIR2=6T+gT5Fqx z|CZ=pp+?AbhMUR4k_`w{2Bb%pu52ZeY@WoKjJV_Nv;l7}wG~PgUPGr7)pdOzb*e{Z zjrP^FdGQd`K!rpALcOT zXiDB>#S`ihG^S=j!3JFCk#p+&^5LD z&r3`1@_k-y$FrLKQTWd1Gz9|h^G4>AocnlT4#S^*;Em602`z#!Pm_n5(XUQ3DL|6U z3-e<`f3XKwv;1Ye=0pg0`YpsAR)_FqZNjhRz})0xbI-%+LcdTvYQRm|#(icMj&QaC z9`EKL_Xp!naPbL_HHOKHQf)h>m=hD0Ik(nu1+=S1G78fLOs(+1oB7$i?{UuMyBdr6 z_m05l+=JhcP@?voqZaeRIA%-z<9|q9K-b|9_2gurSv*qH@?VXJMbAi?o#8}haVuc>*cQ$inz;4p>Ixh&gxYXUg z>(z+L%?-QuVshI5jd_oTJ#vMU(lPQ`Jj}=0R2u(AAMDE+G}E?BxM=$=6$NX!kQYGi z^I{96(ts_~i01XA{u}@UD96vvq_yGn)VK0bj{0qQ+kAhGd!3WS_t3SYs!)KF&wXy0 zeLJ7ybnE!?vrEl2pEoU!mF!)m#dEa1Gpq`73_vAYIZ#m`=B-+eFBZxXTHdA0$HwPN zcdJ+Tj*BU2M17RYeycJ^-9gq2LY^TQf^>hcXUhm$6z+8nM(7 zhK3U3msX@P&FoCgX)^l|N$~KES9b39g6%DUI)i)8rJ`NmkH+#)BRse~(te`X7=_h3 zo)*KorBxi%05~|ht|m1LQvXkhy85y?3Px4exmJaIx7${QEB>hHCHyz2jJP(Vfg{H7#@u^van z<@5`92(SYtDJ#x}llcE8y4b$rJc7A_#T#%=LVI~;yd>YFaEH9x|FJbi6`p^oxUYef z`nOj6VnyI%SbGwp#J}C&>$_HA8v-E6Z+71n66D4+7 zqn}iyd3BHLwAi=f*2!<*D~SbP<&UO54`UPAek1HdaBfW}YkT$Dj0o}zZ#P{2rEf-Y z9U!pk)N-=oqnu-)89O#D()q^>HPCEq$<#@0#kJF4Yo)L}pM)mau_-*QCx9xEeqaP+ zH_G$f$fJt!cjzzvMwiJ)lWof(ON5oO)UVFT4s)65Va8S>(1SG4sR53FM{FWzU1F5K zKwMe%T-j)PF15E} zkcD)V?1}lr4HDd*V!U#6MNZCLZupu@ml{-U$;qk@6B~4oodugq9!$kXJq*&xW^iY= z7OY)35`z}>2}V&@Fc7&&n~;>%EInk8)>$+2V@AWSv*~6-%6gXGC{=sv#xLp6;Ip2vB zn{Jzk_xUwtM$AKi*;0g{JCd+z<40Gn?llLM278t3CntkOF$?6xRmQV&*VIw?v z^Zy;w@Y4|^&<4q{B{$R{&oB&W%mE~Wq}Ikl!^zI9lPOU;KAr$8U%s4tY$Nycwg8Jw zA=m4)QW=(2W`?@-!+A2Yg_*yugd%Bn)ET7k8&FUN8Qk?W!M3V%ACyfn&ohrH9)c}s z5Z;e@FjV-9szegq@XThsuQD0032nRelBrZvN27w47ByR%kt>bXbQS%sk~6^_rL%(& zPmA+Va&cufEk2aw7;k|zE>p@^bg|P$KBNGA)T--wnE~od42(Vy#e@8NQtw zb6EC>ew3er9@|-)DMqE7xsT{)i`-4MCz)V*6H7Aoru7fq0_eu+-Dpg`)%lFt>k55* z61)}hhbAzk$y#4x5=Aix*KuhukWbq1>Q#>(MtX1ycuFdoiXmgZP)J7A^cm5nPs-QF?eSvE@-KN}qT$ zXl)VOpoFQ~5a7MB>IU@txfyyL&#HHc^0i%B18E7iI2jM8f5-WL{OEi!x_BwPUM`FM zh_L-A4?v`a10J@ojTOWAj_~^hl*TmSElIk6h+PoZvH~8x_&dMR)=!fsOD^BP=sxpz zo1&r*W|^>f%lCz})$vWW6s4ZdCX*#1PhI>!AJ7S)z;{GpsG4|XrRZ|J1N|sLNu)i~ z)o>sPsu1V#;bUb{LTc>t&+*~QAIh!U$Ur4*<4Tvi;fDkuf({FTrk175>zbTI ziCz{R%*y)oKA$;Mn0<40qf-vf&%K{5!|{IZyI_+rw~INg0Yj1D*zI9$6iA8Q<#cwT z*;RPWM#zfUXN6~h+dM1D_YAAybG{2YJ^G5Z`W~P4Y0>&T3ob=A#PhF*{e<0p@pNr=fNJ=b2$9!K)QBSI&0ZBWf~0oU?UlcZHyWe?@d-6roa(56^>~P8{$Wm z4iSb{QWXx-ICm5~JleVLmA~~$UF8B?KbpuZ_sPoLx4(V97}DiDUpiaD&!bruMvDc9 zM~1(h@j!jt?EmvGql82{L={1%hjYY_qGR3qWA-a4{xSjsK8y^`8E-fv@hd&bksiCm zJH!;OiHC-!hw>(K!`fO??--3syYoJhXP4k#)BLa?bF$O4J@YioKG%VETxwwQu}2fA z>nACs`rWz`)zq+Rrx(UD^!BUz`5T^y*PH%?=bf4~hZ%#Au;tNWCb=xG8B=VTSwe8} zk#j`AZaWeGE z>yg*)fSqsza5VE^5I)*QwKam|6h%%!4IX@$#>bUp3Y{z~HUmsrWtC2-@fdI;xMWh^ z%CPi{S`-(ZPh^Wrc&D7FA)zHpinEpuplgv`R6NdCb5Uh9PW^Dol~5%QL0uAB#%+!BAxr|Fr7k!=@y%#>nsn`W>fZ$U`oS)&_(#y!@Z(b-DcL+xbbt_n$qM|Zn2G4cfRa~yy<_NT?(Xsw{P1euOCy&z1 zsBbfuDo+2Ku5E8M&x2GIHC{iP$B|g|>5>ItN^~S7?*aEsgdqlr8Nn#dlgk)Ug99q*k?t1qbJ4_M8mYWn}_G$9u5t#P-#p=M2XoVhh=%`T?iY zpX+=yi#FQ3ki?QN!~jj&(Zkj8L;JXK_wmC`Px-lDu*%3TS3%(A4X?Ge z^jf=%J_6*L7xow8^xEq6El+LDth`_HhU*(Y!krpB;+ym$PchZhFe48$VHQgL5*>O4 zg(Hb1-WP+GpWpu(i6I&p>`yyf=@1KbTAydAS`%vAOFYg}Q^KNGA$C9}bc0M^&>TYx zDt2M2IXu;nH6j9p5jP_yCdxSpwNm+dhNi&T;dvHp1gVvBNDVNLo-3MW3LD~Voq($j z(G(xqD7+Pn2o56yr9)9;jqn)94>SDKppez98EfF*$Qv8fnG|+a1V_)JJshP*4U470 z-M`(Ltj0X+-O5yj#t#z&p&2BCixS0@4`LHe+Nai#CDkJ(?nA-S!T=8x6pJDCM)RPl zIWm2Z|8tP38n+(-k?K)M!vZ>1cZ|xJF2M+gwv#~{QAF9SGXNPoIDGSRMMf@os31g# zd(ZDt>wWbL`r`1Hs66q_7_@no1OHYaX#^aO+P?3N22u|}@V-fpoEBG~<%gBSz4z5a z7V-@Ut`AtAgLF>t;T&O)KFUsW7)KFPOdXPZxjPilaE?Y`=Tp+g>MsgtRKw8>`FkZq z;sJy)2gX0W%9jL$j0W8S&SORwhi$AJ$~9KBZ9eP{Zj)lcv&;t%S1sHNJcB)NOLej! z?(U_ik@^U6mKB7gH>%Z21(l@bcc;ejVu5l|~%k(qhRcp;QCTcKF35RC2%$inVEmjZF97Q->#h0Vd zUomrLD(-wOko^c^lsgWLN2sl+!OCq?zh#vWtYT!}|Hhyw2s@m-wUH2(ETL#kXo9B5 z4+pu(xTcXQv1!&f&E1

                                                                                                                        *u9%63Z?jA0iu?PinPVJoL{dcw`#N)Ce-~t59!!$Nk`u zrILrjWr|t`5qQ;gLfBb-upkwS$+sOs4RhpRM@j|ki*LKO3tIAb&dQfxb~7Gi(^iBH zNx83AruYsKJXsq0uRnR&Hsv8a_Ji^Aqo^2q84d}BmDnUTDjWKL&j#vjoFLY}{v6~G z?)S!ndm1C;S6#W@AW%kdL?9u6$HlgcOH+KOA|z4v3aEi};hVb#caf5ox()El$Bz)X z>TuD5Im5wm5a%dJm-Z42@?Yu&HOw#N{Ae2!`J*fa+=9yAfU#RIM<2Oq9U7bcXajy{ zBJ~B98IsJ5{$+3!b&STV(e=W9CS#d_KhR3E;IYV8eq^mk^XNZ?5@+lttveow27^ik zjxb%K(nkw_9~_I7H0-A(`Vk`YKi_A31jjWop0;x)`8OuTIL-tRaN*3oUub{;1~1C) zj?rZEica~27I7pNWMtxS#NokjvY#BK-hl2pWB4OZc76MH!4cADFWw~=wh#6reg@sz zP6TME`NcccNkp~-`f}&_$tsc4l2+fLsHi#PCe@je8cApR-`4pFB?<<(D`0k+)~EgA zY6f;x%K0ht5t-UdD3HA^^1)T>g<%o+0Qr)PU&3kvNtLF|t+N(>{VTh3as?`-6(f;8 zLIPE29=9_OsDXK6i{8ca?aE-+@vo20UUN$`mMyz?%hcbdX3V+vED7jZ=EZq*ybXvX ziEvj9SJL1?X%=RdH?kcJ=2k*!@UPKjBotORkH%Sm#lQL4U9(GOaDCs#aVVPm`L3V& zbgG6jf+iDG#j@(EP19Vxpz@EICQ-g*0%&a>=w(B5t39IT866nt_eU+q zd?i`rY$*@<7q(E7}eu}fZ+o&Y^N+Gj8en1TK$_Ci&n`^NDfc<{KlH|p}yh7Tc zB1Y*Ks^C`M4f-Sq{mp~GXE^CR=L{dS&cj#ESAWaffdvUWC=E*~1GjD)Lkx3q#VdOQ z3SR4aU=+GhgJOsZe{vhU_Y%^L0&XP`Z73Q%tQB;{7EHHN2sXN5$K^_jTdeI>hr?Ruo#1Pg3lP2r~y|k|_?IWy>RrsRND%dU3`yW&*z6AA0r%IU1G_ zu?K{PP8c3p?RbSMG^`wf*v1z{t_GSsyur3aBtMap;$F7{)Gvkjz1odW}3 z!5jLX9y5Y_T-aBf{3NtFG)q}q}lAH!cf@-GBnNb8e zrL(L)__Jy5nj3fYh0zL~FOi^(;w#5H)tQdFWWKJrh@V*cy1)Yt99R7l9MTlDg13mWn>K2xU5!YO|O0AhX z_j8r&IozK(p;Sm|v0mLGT$*qD=RkdOiZSKLDNy21q@6FB2v)+u(RZ)Wo+-l-2r$x8SJK_-pXn2_6_s(7U774*5xU+@c+o;fvE^)x)utzX>ic8CcO~DvF(TI4G22TQ3vIL;hkZiVFA|*NHf-0#!S&B zG0vW27VMx6zr}BpPh1I7W*a0-l6EeJS=}YfnUr+vOLZ1FmSL=+myo@8bP^ecQ$zJ% z!G&X~1GOxFQezbrQ9H20zV!tw2ZKn5epWOU5gYxTNWCu`5b?(5rMr0({)vvO#@N`- zB8<9hZuFDSgZM^LGz8Rx!2z14K~bK;kQIUYm#jx7Xe}zuDx(E+&yNjCM3SG_30vZY z0UVw?G!EQN_rc7Yatzcc&dW zhF7b$^!F$Er9$y?kxsm;RI)KJb$c?4KR)UwB_>1~`UvA2Hl0&XwPxw^yg3?&brIj) z#s@i?sID4{uLdHm5acXIAY!0g{yNVTb(|jvZmbt3$D*8cL@CQb+D30KVUK6V>J(Uo zu#m@#J+o!4`}8(4U{5CNe0lIoz|?c`N~qAPPTErP1?sP>*pS<4N^iBC{Bg@lM}(> zPJ3P3lN#tw&y47mDl4SYYvwSG6KhJnIdk51@Thj(WSleYefaE&rn_40-&mUzDb{N& zv{)S#8gr0}n_Z=!99}^Wfs}yjawIlOH2e2OE&M(V&q7&?Rti%+iMk_c(QT2a09H~| zr0+2S^}RDVw{F)2H^XZ5HrA5JXFldl`^+}p8Mp)p|a}A!`au_-Lmf59A(w{ zVoC=!0ql73SMygM5v#>>LMU-|`~_|x8mgbab8CK+*L+`lZ7B-CnU5aohv|HecOlsH znX|GhzBN_2pfi$56|`Y@j0`q)2H!0{BK>`zto>;TKT(n84V9!2vrwp<&*^j&abn2u z0rPS!0Oq%jxb%$rMEr1K-i#Fm!l-bGl-D70N`%V2FVsP@{{iUk*|D&*GdH_C2Q(E; z@Ai=>hc6eW;9EdX)fKcV(?aGkaKtd z9yYml+jKO?0V}wBDXL9IL5v2Gye_7y5F2k9Tb#K zf7rx(zpYj)i7Q}EUI;mQ}2 z@NA+Yey)0U$9baU1HV^YL!_hMtTSdL*#J%br>d@CY2gdecogM@QTHx3r3MAIb3?}I zCGDZZh`kd;5?7vq8>EHbRyc#g5Ja*Gzl9;@1)z*Ue{upmMt#`Vw<^bEh0s;#HzZfv zAP+1FTl8io^nV1&JUYhQ$fr0|9ihWn3?=V(ObvIy&Sk_xAHe-6Th1{D(4KGftz2t) zQq7*=h{@sEqZ)F(60AN0&|<1&2R%%ACB|h`Qp9u?s|5e zXYRR5KA3(XBBK#;)WDKaFsC4|hd@ygQUwQ5N+))d$)p%mDsK$8nib_K01Zt$eujoM z23i>CZjauTG9f$W6{ZvA)T4N=+A>l`0L_pfNY%LDbV3|GU*{Mo#~9(A z$tfM&)@7NKc9y`|k*GI8F>;u2;FM`}Tvf{^85au&rD_V;TqC8jW~7KRINju5AUY|$6^`5jtbYo$Ia2qhM+*1S@Eu^`K)xZxDh0TQiL>}&3 zkc3Ukgw;8O6Z;Xa1$Pa_z1giVeN8bNPL~?abvE%I1sbf27!X+L36)bef#k@2TNyaI zlu|^q|5}TwdF+PJGX_KV)vaenY!$KG#*x59fa)Zui~)EMnk7y#EW_<49G5ue=4?n?XojwAAWiHmI35CX^HDHd zHt{s+@ESL)K5!iFNGi(IY0g_?8?81q89S2MB#@CUEt1Jp{z^dKlm<@Ou)2ma$<{`N z;C@O63!zE*rW11^gD?ck+de^FGDFT%?OuGigt9zJQ?^-3`$F=Q&G#^ILXiG+=%87&(!^j=$U+f&r_ z#K84fUTJiS^zP2!w9ZopcTcB8)@-mC`&n#W<%pSHgoR(!Q80MpD&74T5Ec9gH6I8b1UR_0!4j31Dv`CX)LbGc~GiMgJB82U{x z+L!ecAfJFZ@l?xPZbEq?KVE5ebTvhvLOw-}PdJx^D3L>=a2)>mu6VGZ%)lJwl7MK? z#D!6#%ogU)lO?N@;r)dj9ZpMwN&riSwPLbvV&p`eC`(RGo@-pz`G}dAyev(f_yWJ! zVn(|t+hCJmiV`X6#3m*4*Y?DW>Qj8x`w!{qi#1MN8>nxuN{m${YP2Y`%Ccf?^A+~t z!n_`K?VtH9BK9>^J5qe=l0O~B-5La(pvUw>AOtqf^peWf4-wH!@=xJ=iAj?jaTLji zld3$KIkKdYp*L5P$t{406=Z=bfW0FP75aLr^>={yD_ZC`tvvJC*+f_Q*z1fpZoUnB>e?DG#^Wm4zb`K zKiJt_VOV>lm==W&)nrM*WHT-|wS_}&lM!#9K5tP3_x7}1TTJ)GJ0xF>A`u;VYtAJU z;}0?149RY0RO&b(Y`3^VZVUqsD%JBdmijX4L-%^A@=~^8$@yr4vSq;ThhvEI}Zzxyhz4!+5%bpCbpPH4;zZTQK@p#K}{$_M2t>lD~ry8Uvi&d2gS zW)Vk3s;J9fpH&k!6&w1HB%x<-Gi*u?u#pyXdMl5+W`TirV~28neW2Y_nHve;&mUmZ zwlL@C;`W@%u(8Jyq%P)B-kePHb{9xy4M8cMwkLk&{XQ;LuW_+Qyz4+Y ziXH`{fVlni6ULW_nKRgQZNN(SToMXuo4->Kx$@2_*d`45TavyitQ$+oOHz46i?sF$ zgF$+LxX2&dVAx#26p|YF)=S8E$>_I#Sm91)dl~)!!fx#j5xr?;co8V?o0q^&G4fGX z@?tbs^@rtd(E~&9`i11mma%(ta`thizO!VMW9E75o`BRoc-__US8QTe6>RY1FcRm1!+4-TQt3rF%1rOs zTfOn+Q;|B3{jHB)f=4upUX`?0fVol4SvV*jdOR{sDIt!rrYgeOo$5H}?b{124Y+7s zo32qmU>TlE*JPcN0h%h2hjLH~Ssh7(RR{LorkBQn+++&Z9Q#hSUFvdaO_!LWaY5Bn zek(}*mm7)vtf0PN_fGUFT)(D0cqN+?3r*K1$ke7|J0x6gh{1>T=ko!r!3c)yr`4Oc z(yH}a*)|DREe@P4?e#JQ?uB~+BT9Vz_@Vo}3uZ8qs~pUu=F~s6O$!H>q}@d^sYMBk ztRyJL=FiiT!L)@gj4zazFGR(@-GK6~ll4QclMzdyIS!a9P6;!n2jp03@!&AFvJ1@R zaos28tM=S+=L;g3iukrI%(>;)n~q&KmPy6`!qU?luR-he#_;`d8 zqe`aYx@yT#u%axQU{SVg2Ujz<53rIlI)C_!YB*bBRxC!1*<3-(axpCmD;hA_y|>{8 zwItf|+aYStv`b7?SY)wCkL?0Vaubi40X)dwOL>7}gfrMs4Beb+gw$ArznO1}Ib=g~ zXgYK_-PA|tLld+aQ$g4!N1I8sejhwZ7o96@f2w4Ng_gp}@7B9bSp_Qv3Us((Cx8^2 zMkfcpu`1sayt-_obmum0BJEGsQ(OJ=QCS1k3tC6m-Eo<@Z##U!w?1+=rn$3 zzOlaZA(%6$@@G_?eoB9tO`DWMNY%qRXATvX7JC zjVkc$Gr>(K^*sXZZ6XjD%s!ssKE?g4kVNMRJ(cL%@6tN&AUarz^p*04T_gu0i$?O|j0Nc*SCyR5iQqOTTnQ2~xEX{bJT~33p~zW0 zQzdGQ?WwkDjOk3LwwiJB6US^E#^(b!65_9@Qs$elD#>4k%1ZqTt?${LT1pAuK{^jM z3p*io*K{n=M-?~1J8Uxs>g^H@%8OmXcH8(6mML8EelwnRUW$3nXdTY(=wz&nV6%eh zi?mX5;X%yg$>nlo$1|}*mSZ0y*$yd#`4~5UJaT%>)XED-eUtEaS-#}BkPt6sJb3f7 z9zV>nW76d!)U$S%F;f)todhte6}u3f;PIt_&>Op-9arDji<5TerGTrW)Z`4HKl-8+ z^LlTejDO|Bh{-dPmZX0jBH=4>C!{xpk`)jErWKDH3cN<%K$eK78(5liBNz8xHn3dA zLl#U?li2UOnKOWg)H$wk#U#%?!lY(GU(_t(lfIgas8~PfC5bDpP{ETG5olGEDdwyL z6SPcT|EpKjzElao36#srdy+U1`+GkypMUPn4Q8U43A}T_FGi3 zgrevTams?Bl6cV~l=~Kvxgmm(&H9dr2ZdwOP2PZZC#uW{ zeegKcoXel^l7llEse^SkajCQ{G5;5t8WU?rfJ7rEk?;@K4JrBTsVsk8_uWqS4kPM z*P3~iVpnds^y#$d+W7oEGLt+aMedM^M)=Swg0Rx!dtTuC z4p`5iUDUEzE=J{q9jA!0oB&$r!L)4d8g80-931b4cwJDtl$vu;!oEr*OC9=)S~SMh z%42fvij;1@_TKfby+hI)4)au+$G+9HGnUZA{Ngi)h8-V;hbd9)F+{&L27$g#%>6a< z-b>3LCwP2k2k@Na(o@;S;+J~_^34)+o|yY!`luG3ZSyd}TD<729J3LS;6=Ai-fV7W zzy!^Y$*BUZj3lEOOGLkuK`i+sw8}@5i*MUYEu&4!p$7BQR)*Tur#d|CI-FH0T2)U} z0V4{cC8Q8iIh=(hrn;pl!r+AzB~8%IBlJi$F-aAu!N9zPv&!_RHLxnd2pKZ3iV>tZ zs9zDVP$Ppkv(wyeoGq=F+qYH(-!*RLU)TB9-{S2*B2@`W7rlQx1bS-W>&38C-9oGN&0lQ4@8 z0fOeSnL_05o$t3lBa74T(gms>QRO+FS28dp0iAK zr-;z4i61Dp^UWP=F);)%Xp#}r{{TOHA;R;)UA6_nw4W^EN#XnJWJyPWN9r7%{4 zzR3^Sa4pE7u$%d3x=G9j!0%NuFlU;k!0Mcq831Eg3c_l}l4CZTzru@dBn|zh9lc_( zZxyh%541kc`dv935?6}3y<6=5>+&tg(bBYcTTj2!L{#^gx$aD$pfEq+LQv3{-Ufq-g3sr=BuOsJ(`kfy+;;}MN+0p z&4oaoc`$eb?~+bSpT+1vL_L z!BU~FKd%6DuzUqw9X9Hw2$QYx||oK1l{(rlifZyy4w)Wuqud!6SP( zmO`z;vyJ6vGc1=^e%a_4!zT@Vc%DkvG4l6l(bHpcAj;7Z2beD3PHvD33`%CBgPW%% z-5CKao-a7)jX(N7Zr1ju8$Lxn(c0gMdiOcCdw&nY5^&8d6Xrc!@1BV~;BSpOdbp;X z5k@&LiLPBa7((Z{>bkHyUD+nfV>LD2Ucmaz#L?lMhg<*qd>hmk-7$cdX4FUi509!7 zui8y>Q)Pm#^-FzW#AhHLR`lIjDe0MWG6^O$Z!zDtSm5FlA&B68-uwJH52L}c z7yB69a4})nJ?WY2A4F* zMG}sn4hTtNPduZ0H=)HM;Fc9imXORGpI|xu&CDN14xT3ezU|@eX7eNdC2;5%sRoqh z!2!l6+}j7-ZXc^ZaPzFPd;srZ*|kk(yFs~?z{C4i8J^}L5u)#KXLf+D=YYo{n?H8| zFCu9`_nbgu_#l7<7v^ZK(Ch$&FT4iDVkE;@RF7CBsP`LR;*a8x1A?_TXE*WgGP7hj z^Zcz3=@jky)E_cU%eC7vG&G>Hemts;YDpV$?;^>mJ{921gYC6a77Axq>-~Jq&?hUx z^CxWHcNzxUzpdJ7kGjdmM%CU%dJg8u7TTk(EKG&*X2;}bvmrWn9_dhjvIpB768&t} zHEefU8#1l$>O&QB0*dnM5yKmNTh+YIB5+*NdOmfdys)>P`&M84CFDvs!-wp3zM zEAmQUS)1)YfsM_+XSau4K7pn@-dWAvwbLVQ5h}VTcJ6 zJLB~=_Bi+!M_XQ;UGfHKTjK0B@ecG=@6t*17rWIywo&RpNp~gPl)@Ey?y*U%M`P3E+wBT8vX^W0+(6!~*+xLBfc5vmVjpyzEIUL>uU<9313|p!@SDPcNZw2M&Er65?}fakav+xXN?!9R5ZrrSuPGgf z=Dn=fyb6T(UfgMF2jY3J?leCG!QSWio8o~e?@Rp6vq0GQg}$bGAkO z-pVS(h9Zuov2BrDYbN_D`i7FWWk%Zy`-a-4Wk=g8!p3hNOLJfm(uQicr8}^YuQmN? zg?~f+-O?YgAQ8KCo?8(TV1QR7;+lc5io~t-PiG#l*w{5EZWWsQHwC~Xw}^>bwH)A* zTgc*?HnYOTt$qsd(Jg>=O{8BT>rzPvIO!JBxTe;vuyv`e0=%{ha9oq^R_MA^+W~Id zg*>k5S1Wv7>dyc_z5>X{1pE~eFO_(JBVQrKV@lo%i zuCJb5KK{?U*Ws(7tH%EEv)hMUe0hui4o}Z(yT<#L{E&+EIV&JVA?Po8@D zyXN_)Pp`dC-=2PRjRnR+<3WDl+b~{e4^(Hr=L!o1gxrI6e)d9hqdbtENzbJgPzWgm z<^9BienWa7Ig^-+FCY-&2(tUR4b_F@LUJZP7h8by|2EJI#f|hpbS69(TmUJA7=-^5 z59))!L*T}D?|tAta2Ko}QV-Dw--GwYeeZf;H?SYfAMy*~1Mh|B|KC6{I6=GwEIxViOe**|=?7#_b5JS~PN*pFTkefiDK~UM$-GdA?v=lkayhxhvjPO3}F|BteNm(`O#sSj+K^+_}2_o@qMj!VX+;*;?y_~gBE9ykGx z3)Pn&@9vxrlz`t0#U%_<>PdN|cv5ePF2n$#g}{;L$WxSl3Oxm%Jm07N`;k>}1`J-E z8;8MR@Ne`F?HjwncJNvBukY%;^&kaUe7cwBy}v;iu>7Sycjdi`?wf0_WN7tGsgS4=rj8J zTWB-t`#NYd%KNxzGgA9Ls53(QpA0?Eq0hZHei%EaL+?5r`sh1{L+{!i_OQ=GL%j_S z476LYu+M`-d<_n}G+XyD&)q{l`W@qFSN5fgpE!cN#_|6qtv`PJv%CBO>ak&LU|?YK aBWQ|S3!m_Pew8T0RR910L91v4FCWD0k=p10L5$o0RR9100000000000000000000 z0000#Mn+Uk90p(jj7kUu5eN!~f<%PER{=HxBm390#^oTL4jUMcI7- zmD~>YthaLpo*k&&4iSOUzjpz57&Z??)fY+D>+DbIM8XLiN&R+22d4R2v?8&LfV#n>O7y@kxA= zz1zo}_+ie!d`*b-jaPn?-N-l*KFoci!PnG*TVE@yD{M?LB=t<<@Ze8Y*S|C&#Bblz`52x6C;rn-w`@AP||6#)fB^;=?0Ja6Kkr)p z+sJGgB73UXQI2mpGX=^PSoq!whaV6W&;LRJN_0bHM^JPtUjuV(HhGBT{^vJ|vyuW3R{Im;z_rXQYk^WSC7y9`3YNOB<|gpq`UEs)8W0TPA?VTPqL zHQ);FIB~2v3XX-gj#WhkYg=2zI(9Xpt=9Ip;;#NKrZxu{($k75TZ`AV1?E3%?BqC@ zGt+xwRrO#ub|u09V8Muy(37GAa}HJsEt98W7Y+LS4*;lm`oB`OzPo(u-o17ALr}5} z5)6_xK`A%~1lzn=gWcif3e?f-`RLL?2I-M4xZhx9dA#2$1b1^d1ll zWY0%H5Z?B;fy_s;L1ICHRlpTdXdy1HP=!NYbKv{`F2CuwL$(z~Ys!==9F~J|Gs)!g z=k5L3)*Yp5+)uXU&p5h7S%gPehnE;_ng7&TSBW-us;4upFr_BDhfCg`T08b*J6!&k z1pcxjkOU&K4HJP=WSk<|kg-jsn2<6ZNT!u8VVIR5$;dbbGYvBhrjl%{_0;R(yvOTo zwzTseZhN@g+y9wrl{QFW9=Ur)b5^&J@!167O}1g!^?$Yd)df@CO##&)MKnkW>LyoU zgPausNdrLAJP_16>q$`KAZc!oS}UFRsSjOxp^Y!PBs}`ZE{xwB{CGfKS!uFZ?6O=z zn-HY71yV-}m6<#Liw%3X-fpZ~Ah5xRTB!H&b1!_i|2~P%blc=1?64DStIEX)g zUBsCIkErYS+FnYSutByZ%SwKSY%8kt6|><7Y^*O}=(qVhO3!%gKzEemh?-a{Vo2rJ zI}ZSWZ@?#EPCB@JGhMYmbpVEoUR7Ri7s51i8rL49_54Q!k^-|wB!5)w$ZZk)JCAAQGR!vr9$0X``ERh;9Io!3-o7}9L}77w0+B?f(C7>n zo5SUN1%pyWV_sux@8sgmzG@U98!o5~+N# zT5q;{!|`;!Twm|c_s{R&zzEUWJVYLvSa|#8ZsMJ)r$1uPD2@vc@>!E_N~Fd#{I1Pc z{;k@IpPNN(uX_Lb-GNy0Z-m|@jixD8E{j%KkeJP%+omZOqTkAjoqpLsPHk<9@rG`!6%7YBq|wOgfe5n>2}C+cFJVdOog~^J%vg_}%^P-PvAmEi)}*;r|SKD!f0q zm@UBt22Q|XkO6-?u(lwZJ@~WK_#}Gc^c^RAy!E#;t2G(Ne*W~Rx&YDB?|GW~QH=MA zSrm{LB=)ZymQ9(pK5FKQlSyPPpuM8msAcwTKHeG{FD4sFl>)85imqC)tk{(Dzg2&^02lW*?2*HXV_F3Hl1d z&Iclq$}0$sT#7+jtxbSkX9kWd7TMoa->n0dn3e39j(VH6hxVV^h@^_a0F!zxG$_`9 z{itV}lb=vq4*_f;5q{f|Zne!|3c`wxP1^Pd0^k89CkyDkpI}vJ22wQ)Jl+vAuR`P- z9xQTU0t?O@KG?7aea*?I^ReGZfgvXg5qSY1i6>89>Vs=>mQjrHffJ829>!oCi_M-P zhY$_}j7G#fHzE#=;Ji@kZv@b-Elz%{I-Yqo%IbuwY(H3IUI@oNOjf5AFIWn;9j0$` zSsVjV0x%BOCSJP4Qa(JyH(EPfftyMqBv5A{jNK_J#gI%pe6f3gtt$2JGJjdG9A1c_{7)x9?BAOQiSu_h?*t&IR zZ^O#=DyL3WvX%D+d+R2q6I{Os%=^v-!*W~jO2fje_0V>$J7R?0)t-nM5q0LR|V%v`G12ADMb=t-hq-Zv00u-Yn5|&0ocN5|oV}pIJk@~z}^Jc((GHgaK=pkQn?z81>?u}N27}P_( z;cG}obmc%x&FuPdSLPOa!ER@`CW`Abdjvjrg6G9m*a8Xh7l!-4Zqd-ct9(7G9ULMz zVjYPK_klWg6`p2+CYn-UkHOc?ot7<6j(O9-2E%~ehm=zYa2V>_yfgC3%@cD@FwQua z^Vo%R$@#x${0YP|k0}Wn%6sLid@!(U=GN#!Rp_?#?dvy)P)pwn2?p0%Yq-E@ibdHJ zu@W`p6v2R{Vt=or`EQPo_GcztN>irwmXL|U)%_FiFR!0Y(|n+3ZOjSuQnQNt=NeV5 zKK>JZ-DH}$+t#+Jee*_Ho}<6O&hAa-x3hSpY*Rbqv8$PIB`;R{CUI))iN6Ri6Dep( zASz4gw`PEpQlx11@|-GCMOvdMy1ee8zHac~&@&%n_|-i3g;9W4N>YhZUx%~&nbDWN z0j?-^$^@2$U+{u`vO;8CC?!Z~9M$?#XTqVJ6UXkEQBP|me7f`Rbjr%f3+u;wqK8m3 zBW4mWPDN2Ff%y#MpvtEznpzQ<5u>_ZUyD^tSa@OOLF>OpB6UD;_YmfS(p6z2MJ%4d zy=IzWoKM;KtQx8>oG)dtNjXke-ZB&H!WE>bqFCTFx({Y3PLu(PBBL)%O!0NuzQ4}P z&3={W7{LTkiLPtRiJ4Ib^w^W+k{{5YVuR^3DhNln2ouzZA=&RHQD=*7DMw+RS}t2xaX)sF&MdL z+D8aWmW1Dkt-7uU10Q_@H${$wArk~ zQFo-e_MrR!$*(=4HafD76z#moWfuY}f@*c>@1hFP(>D(BxVpEwVZ?C57plg1>?ZISO$mrzW!Tvo7O|t?A(^!A}qytum z^X`-z#|XHFqfG|1)7Wiy_jZ{B9$nVX)v(Dd_7r%_8T#Mr>mau96O9u`Q!1592!fB1 zqDL7eKpOg~+YK`Bm!RvWe$RUiq$TCO+ZM$~ia>Bfc{D{adI-P>!cHq=+~rHH2w6Ps zQUNb!&pKZFX>R~qLIXO#g1a?CbLr!z+j`RNM}|5by=*@b;ls5xjMC`kORaASyD;Ws2KO*T)^!2lxcp2eWPRbWU?8K&L=K zv0h<#>pnIek>TEiY#WC>`dE##j(6#5RqY^!SA^m&M%kl%?Rag!>GuBVu<7?-EKJ$N zaud$0B+ksLY2<`LBnH)pu@H;RO-SfR)`e-HtbEcS1va4xMKNV@86bv<7sKpx%XEzA zBt%HRbudGQT$7LcKuY3-^+ipPCj*p>>bMDbd|l0o%ZTo@;U?fFXY6ZOdNWp7U)a1Q zaf+i!6EnCr5}^o7CP>5lO;Dd@Arn#Z47swM9F+j2+LV_wAMkgCp<1(gw zA*=^7$<3HR9~1cL8|dSB!ZJ4O<*|MrlqY^Z{sXr!+dZ>4aGjy=_D#&PHgIBi?X4pfT6wX znf@XO%Tk=gk<-_^Iv6v5@TPW`WJ`q4wvVq~$ZOQJxmtI@;VO^27 zaC3)W$vsZgMa2dZSV%!`DnoOM74>KY8Jk9k;oCZzRC^+3ugX<}Ze38wgeJ*i8>d38 zO2&Zky_U#Q#10qKAQK3A?5Luj9nK|igQ#gzyeC;&!*@M9aqs(bK*KR)h+beT7-ATfZ(xZd z47r`=npg^%8z$+7NlK$fhi}UTam*RDSUdLm;r|CXq_10Sf<9NjVwzodj0I%(E%X%Q z90Q*;Wbw@UJ26n0{Mf>@wan_>H^r3kr0FY40tXbIC1AGXvo%7ow1ZK~EviML-Hi-d zMDNyHLFd>~vLtHt*t}~})@`#`F`Qz8B;qpmK-I*7Cf=L#C0Fe_Z~rySbqcpS7i@?B z(m*dx6gb>gQdOI;Y*So|V=vl@(7aWKPW$i8I<-^N&}I`;w#g^Am~O%Jr0JmMa0gnQ z01jru_#qQML56E?!DE3J<~BAW#j^sDH#-JVgj`3}*{uqN@;TE3C7YY$#*the`-yTgYs}*D1)x zA`paUFEx@)#vd#JYhrtay1N;aTUbiXUa;f7@^`(re%tE=E!Xrm++rix#4u)WTz$+MEW#7DJw!vLUj6uE@Oh zmjUPY?4eF$+_+?AqH6L{W1a`lf$VZ%8(BS6GI+$ z=Ja6Zkli{4xk!0D!jmee2iT0Z7O(({vyXZaO}~vL!6|X4g>sqHD)E&n=YCbuf$tTY zt3Q!+2Q~Ob9h=lY*Ky#6eW6)>s|+BW)B17azGUOI`du~J-u^;SUG$X1QZ$0Vdt*})iyO#pv)sp+Zoz)H!`IM+ix7KbNN4a+zYB-lBbbm78QjMyE*J+5^EM7yRjS*-V`*CXg)I^nn#$e4xY8X*4~}~G<1qiJ zn$1S~)d4RgE#~KIidon>4s>bIism6Itn*kh{G59G)LK=s!i&kR;aFBY9Xys*fERRI zKMxoM$cB0%2igzJY5u+=k+)RYLDxqYUyUv84lHC8gx2@G4tOHB+C4vDbA`GhG1uU> zRZkZ{+&I>nWWtfGq*1d=&nP$xUVN%?)D!nHA?Kl>n01hDcor*hIRtsyHe#q(xUs;U z-ikANs(;dE}w8$ygl(^h%H7CQA^ZvyWWGEJ<#vR!*TnD9CM|O;k{? zRF!mOtLU#q?G2}suv+S1Dyp(T5z-Gu?IY{46$FFTFmhiFl4=q|_e!3gedT9BBX*h$ z21*pus(2Gos1tg33b*@vTDm%L!*T&=uG|>OHWtN-z3MLH!exh8#{vaf0Ox_~8=4Mx|P95VP z-JMO5J`B7u65+U^8}eX&J7>xe@O8&9%~D$Y&78Jf_>*;B&S+jP{B4sW>yf+6s7d7b z?1bI>-AP_PjC$}-uP9`N+9u{u(A=ADqOcmQ zW0W<&@dqi{;f8({WfHRd8=SjJvY{g9IPlZEPOdTa01)fgzR^xDMVjPCvh-@QSs&?} zC)uE1XJ5CyEq}v>C3=2sx#_p1mZPm`Is@hCQq>_D zMN>$F8~gQQP9uZvZh|OSpRrN+hH{!ungGgSZlqH+zgpO*t<0yF z>)O0@-Ow>eFCIX`Rg6z>+C7(yN98x!8I`tV=V=W82G5xe; zl^Y&t2UC5XVu9!aI18e_Ip$HqSN!xc@UG^N4wiO4+#+%K;?_;{649b%%mWl+NJ54L zcw;2?)+6U<)5Ky2r+4r!&hWU>GizvFTRix2@!u2LOe=0=`FvL5+CkG83D-Q3TRcFC*zg-lh7Dak@$Tq&gHgqbe#G_~J%Ku39rgU0e5 zP3_+hEr-7W-nLAq?15r-bppIJA3bfC2@pDimw=VJ*h?zhg!TwxIVo)2nCj>Ry!2&p zgIm$kUj^Km$G{Qj0ulya!VG&X!FeQGnq~HuXzJD1a;?jHVcng|>4+)9UtDdseTK}y z$kWl*Y|yEbU8mT#+N5@x5@N;(-A@D+&WIO`I7tnc6%muQLS53!#YYkped%8^7P33y z3IqpLsNOoqfVKhZzOQ_1HlcdMRL-M2SHEs_bF&S}Ekh5?)LwlB)rc-y{Td|ScrfQ$ zv@32b!nL!-iTA&SX)+6h$PR^bgc(p8rVeP6Tk;4?kHpKbfDxEXAYfze{&XDUMX(}N zqi4D0ej{mSBqt0*;WNjFJcOH7zKj5se4rLffZg?=Mmk>0YzOTE9X zp34fdfMpQxkVVW7jvirtmPB2X9isudq%tq=a zOQouk-{&_;EHz1!ChrGurtFRIrfgO!-UujEnu5V8b-(6jf#;8P$lB>TP|I}4Tw>KG z((;UXt1Kv1jAacs5r^*T-=i%lOaoy-flP5EC&%)ovV%$A%f3X-(sYm;RIejsLP)Y0 z<5UuwKMqLC%FUig^QObZ3`nD1@8GU;C9<*?>>ys*7Q1WN>&h76{t7zKwaD&^R&@Ts;0SRfooCQvK>~S3VuTe6Uwbs{5S_=qZsLt>7Ab*?y}s{lOPxG z$bl>Qg}PQHabaR4)f=Ow*)2r7CW+Pg&MM!y3B?1UfS?;6dD{(mN%hJHhn^QC&S}Hx z$F)LIqP$SK$+O$e_WrifY(w{hi@itpn(hz!=ZBn-j1i0P4lF30#k*9^c|@%iGSqg3 zt}S9Iw@XbDH9_%3MzVe6iskpWha{!-&{`OcKQk4A^?KfQsWbAtdCYFrU|`Qn@{7&4 zpzy7sVE={4o)EEhQ4z?|&gitlIqY$tOC3)Skyl>I1dw6Y+0_m7yUttWAcG1}kWgh} z^KqkF2UsQMlPoG7C8R@j{iSvhD1SbCnE{@r20Zs3=_?t61v{=&|I?)UI;@m4Uuy?<{{cKuiGjy-99@ldJUCN)7;=B=rbx6^CRCZL5ZT|LlY|fKGhf5- zeW^Z?(>4;%;(r8|bEf+-xj zwYL&953r5edsURuo_Et^uM90lEp!*hfE%7SHpqk7^(+V%-k}msp{0bSw`RlRu-&=G z^9^ol@vW7BOKVun5aR+*XHReIPoV?QK4`34?}9($TTteS-D*D!;akv}&(mf60%MooS=Y)sy&1xHEF1^xy^|2R4cQ*!N zG@pIVF+KH(Kwfy-7;a)q4oxYEn1DF6j@Tzz4;|}sX?H*HPrZS-x|MG?`$UV+hz0yP z9Q$OFNs9m6ELCr6A7-}dL1I*lVRsN!%8v>L8M#K2D%4~+FN(fNo7Mf2C8&5M`u55s zXOS-M1v~xcl|%qlYOm+;<+PCNSa)!Ai}F+UE_Xx3_Z5;xuI6h|-z&tCziiiAE`Wix zknB2&MfOBX-3G?bg%;D{=wQup!mj&}LF#f0R&?b7Va~?{9@R}OkgOf>L{*%nr@sAF|bLuZ(Z*myL+TtBo=b8<6Ej-qvpjAnx)@qp1`PqSf_-WA9?e>TCkO-R&OW_K+C^oP8D>^0q^an>5up#72DkuTK_@&#@)rp&$-O zXqhkNbA?iYUs?)QC>F*}=Ew4P#kkCuU4a1y-;GWv^er__2Osoc;Esnmbq)`Q-YDvR z-|qKv<}hT?DcZXdJ8UYF!N=X}{sClGv9y_PFh7SJs@UUIIa6LVkpvO!2&WP40G~eJ zGws_%#+6dMZWefsfwopf!xJMD1XoMg-+{QH&?E9a)E&e6OGPtZWBN{!+v-s4bgi#8 zlgk%nv5+e_9Url+X1fpS>E0R^?_lsBo(e>WuJ;*HpDAa$T1MdIMcc?H+TrJGyGrOS zwW!WZFFyQ2@U*akkst6qcKpkaaY3Rx1uN7@@@oZXc9oLQc(EXG*xE-^oG@wO!Z=Kw zWWQ*?dMPmTNfktM;@84&7Ni34+L9^UkovRad2LNqG^WO`v2sQh*}dRAvbVisz4+}K z=Vj~#Gkcjcw!DfnZ9?&6z{3J4=+O~dbLJ6!PRM*_e0F`kwnk#@wp)R3g%E^85Jm0I z0OD9|xXgG@{EQFRdKYU}?!GPA7!gd?QSyU=Sd(hwczfy^BOW&@x*8#YnbRVKh9mDc z@!cPEXeE<^+p|3Wu758k1jfb_^yM+H-r!S8*0P{AiM-yZ_*T4rTJ8k@zAa{m?n0cQ zMeH;n97+hjLE`iu(-^QhL2+7(hL~zjFw4&`6kqSU=@iiTDjPj7n+0mE5>7y^!|k}wN-K!iOup`7 zB^}1tgCP-BKaY|itUzi|{xe}Cdx%VUs(?LFp5Sop5z>tWadi;Mv4l;kSjN-9*<}PZ zIe2)Ebhu=vUnSJkwjkqlqS>P%A%QLaaJxI^V{U5$?Yb+UwJ- zVEL2UPni>7Pwo6V1IkaW5V^O?;9c~120IhO#{;7??YQf2PRe^Bm%}O5P|Tr zZc9=#(-f77P1j?lQTwu|R0#RETvy+ux*B!unT}1<3p&^bt2g|$c?Y6`d>0B0qO3eU zVBUB*2n?CHj;V=4?^^Tlh-|qa5I@Y*@T@c?YN=O?Up_gB8L#CL2qiB+Hw6_HeYZmj z-3ZCT2tKnBtB?phGTLw$$7_25$(m(RbvJ=&Jm&2*Bo}d)jw;$_4lj1D@RR&WUgX7V zf^k@{@aHp{l`$o*xJwjOo;Qxx8|TSTG01{?E0VmR@8#pLR(3~2QYjwOP#N+Y67qn` zAbPDC|L-=8sVNZo2HeyG`VXiQV@X~`sbxjAHwg^VwvK0Zy}dv~X4%5X5WLhI4&G+( zI~=SW%~M(=^eg$Aq$+F6rRWJnK8sl-GCtrc7@jvnQ97e6(4}tfF9^zU(N$xSDfweII2&smEA2ld)8~x3DsOt@ia52fDe^u+QqMEOD^~f6KBrRt26WzReTy>-qDHOR9_Af|8ZU& z9u!NnYNY<@XE|TGJvP54@k_es=#5_a8r847{>Bbc&UzQiEgO~@t4k87Y-D4|QevTl z@@K_{4825)P&D&|aMjGbbRDrtwcJhD{{R%&dx+xo#bm97n~KGYT8$i~ds4FH^BuD= zp-HC>)2+96q&dmgs$+;C{miyel_b^;o=ZsMwU=|TY#bi1Zn!w_HWbODF2J*r8Q0!K z3ZNoFu*C}Y2)>31cweG>cMVxxU3Zf*P}z7VOrbZ@+X}hCF;N}7u1TyjdDM^F$+tTO2P3x!@c1CvPYSV_Q z{Up_G?NicDBq-Q9BcJP*?O`Hny}V`BRMY)T9(QvFl1v8+_@@jDk!PJM6y=!%vrI@y zcF^~JKE*fq`F9BCmG=d;h$N|u@QBQ(h&oQuIM?N%rGLbiPaFB+iHnw}HQs+Zx??;u zRL|WoP?+!909HIQyfstl3j?8|+1`8GcGo{R9q{=IX99Ua^1(bze>ePd#2mgL>1Kk$ z6RM~9J*bJ1VEnx61baa7G19H9v>{dvc9EEs!VU?>aUYAVzDcEq{4^cWVZ&?%d8^AF z(SR&F3qe0rAsbuZ-h+8)Q!t%Wg5MWn@l9vht*wXG@9?x~@g6AIIPMfK&^)QgP|f7Q zCiP|usdrAN@{o9#wT#D-o0_O4n;J_E0wlwEpl4GjVC>}WnnTIuf$*-4>kwt;HK7u!z-{SW1yX zys4V6Z4jE5>xk#$TB7MnnD=rtm^(#nQaMl8#o`WmrUHc3BI9gQDkFz?y z+(JAiUSa8$dx>w6PKR4zV?L%{)#^-Zm$>A4FJD8-l@iK7@{3koRF_RV(A&}z$Oip0 zo6hiR-j3bt#o7zaRG$~^bK5H1TbWTO z@jhair}rdZeo})P4)c}xSUxDpCvN}p_~Tr_RSj-kI3oJ~k5QF;I#G*7A-cNTkm%=* zV;kytc-{RRl;4R?nyEl37E}h3A9e@@*1X!$_z0RI&}V zybfJl>k6!0WTi(&szm7&$F-0sHor0!FkjOmoVChjInb)y6uwdP7n^`j6| znu7y@#8(dHwHTHOPS?>-;`6tHS7N_-u!}>b3 zbkKJcaPujLF923nRF?MTYsp7A)=#H#pxv%+$Og`;WrKU~(=elDnvT#-J5j3KB>g9i zS7BZ!67%L0nh=Fixg6fqApD}fi8L@P~5jju}Kad&H?rou_YR=Fqb%s99#Zk!umq<$bm)qa{`)T^vDSAFh@`g+UtQKsn>2cQUP3 zFS>zLYh{0ybno7}R@J;1T55;Y_Bv9in^$TWZ zN2M!&QAk6fhAp9|s^8ZA92m|Qfnt++-;MY8i;I1?n{jk$X!^`3a{M0%ILt46`nb9o zOiO7S0h!|OzLPe_RLBlO6869qm%n(BHn!o=BP9as;9xMkT~_8Xe`*cNSx1(1 zFv5;rPiaH3WbM$^IqMXBbFr75lY^XbBK68QAgQ)(nBj+*>X`IKO0wFJs)hvPG`Vj* z@IL4bRl0AR!!fe;T<|e#Gs&_!*U-n3mXJNQ&e7$!^YJ)em^GcteRq3)8p)>N4EIGt zKJWM!vLQt2IPeCV!rFWB8z{JG|Gd^->8!SDHv(-ZV5>F8{g3R{q9Cw%*sq-GAKQ%! z2>9;?2D}0!v9y1ET)l$W7EG#K$v;@I%(^ii3$^uZqMnT^HT!$xyY2Ps7UQLabE=2Y0J z03X*Hj}9>o{oN_x&#$XJOe25&w2of?mx&qoiH(^j{^_-;loFRW0P--)-5L9|Xa_~Z zCdiLuwhhA38V$DAxERU!LNoSEHF22>U~hvv1JB(T`;ejB4^s!DNb8;$KXvkaN2hUX zL=90F#6FQfry~#ep)NTC4Bms1@PB4?NE~JCh~&sl2rL^F_;G@XP=w@W0t`H|g)gvo zZ%2w};3tb{$GJX-w|@yPpl{FlwSN)AQb}K51i;8t0hjWxyn>i{3j-0UlAn3U{4ukHYdc(-oEL*M3L_o zre-9~&Hqo@SzvH{TXKCmFBnqnx7oW*!La8T^G{o>Aj^QLM%K)BVm~{@j7hP+d;hWlB<0kY`*`k&CI(jSK!Yg(I6)mwFxxr4KCt z=rcv_QuE-Yy>$7zA-_JFN-z{i3iUppy;JKj1Y@n-s!(!XU@lsRRtz@Y=5>&R9FXQD zLP+R4?iSQxxygzA^rYO+3A0^I-kzXulBD!bVv26AehCtQ+on_+{>;A!FxWp7fjjC| zDW*kbxNiWgcmk${;$?6_OGCYb+QKrJ=1TF>BTn| zbN|Y-tB3~mmzLm9UVG(tExD^M8sPxln{HY`Kk3dijMt9dlIGYRk6UPfZ_v=p579S83HTNO7eepz#3aNLY!qD2(hXwy5TkpO{9KLth|L zE1Dw@xr=TvI)%QfI~b}9I!4b+pW?w377SCC1K-e$082n{@naO@8RVo>)Ra&JuPt4R9s~Mk%!33{(cIpvL%gOoa;vL$Rt7v5xwb)a%f#;&EN;PAN zH}m@1s|@tXG8hJ%ehe*~JtQXzF=%lOQ5(T-kIgrEH}!jm2<8r^s62r4@03T!CZDC# zBc(>MU+ni;(n2itO3mIVpB9_lVx!w9G504x3`d@SGXvvqQ83D*zx+ji`l&X9W9=*` z)7b0S(f|5J;|yX~rNR|+I>B4#Y%j1#`!v$1Mo+%35(qs7E*dn7Sp#QKI<4H(v;N1G zC+Rn=)HcU}FC(8Lw_HC&^ZzjPgN@AMHNtDAACuVbLR;%3el6@8f}E-y0_X`(j}r)0 zxCihEV4z(CW6*miT8<*VEzb{4a=FfH14_0Ydv%IA#6-pOS?T5dQ^e`M%xXlJ?U3_# zJyyIMwne7#WI`Vn+{H_G#l}^DCKVW{E@;sg1z*y&C=7+gxVGBlFT~Eeg3eea4Em?aAoA4_UUHh1u=l(O zLc zZPQ|`KTXPWQ;Ek8$a-DVnySTo&FRk-+Ec5N!-wAv)2FDBp6CFWLP*}01DS-~7J*C@ ztt!{3bqlvx9+b>LUZB29r>nfyma{Q=Ks)LGo9_p-4mi>hy^?L2OLCJQIZ(^MYQ?l) z3mo`)ZW~)aDad~ZKr7@$SG`fdFfg3ME1-M!HxaWX_Wlmv#v~SQtlJ>|J}e#*TH^G32Uq(?8IGlgCj=AuUBi_ z{G_Y?C#-J3Q1SBXm4O9stFHEnjx;XB(maZ@yyO+eac@pPjQ8##c|qcaMC`O{v|Qdn zse<`6n7oEi{hgHsHkzxTt1`@(6fLTzmG5d_jbbP}jOm+3;OIdSc#YV|(K>^X#N z*{UpMaQoz3A*|5mROU$RjZo;1cTV1#oPsI!JQ!ihI`M7)+D!gJCilGdj2=q5s7&Tr z{#Zdz#t)F0J61&Qr=kVp!~qJyyaa`ldH6AYCf!@s=EWa#28`peOg%`4sr~|tqantN z8ez9|eD8QW(2rfm_=F#nW>h$1=UDeyGD8vaDittGFCe@Ra_9CVRdGG9wd1IX%7Hv3T3g?v}qOl zVg41^Vb4z`x%^#!&*Bf0anMuGdY`EzFt1L4YLDF3HpRuWH+{=nVjjTIJAw0K{yx`G zkp7ez7lD}7sNhBRkP6HuZ4u{DOE@JEc;qomgh;Ko#-1}$mBbkEN#kHbW$28_0pW#J zX>MU!VGNl*Tq?x@Mz3iWL3d?(s`~5hpuHE1 z{{~d*1)GAIlsP_Y4H29o0(}4$!68}pj^x|G9;(MuS78N7^F@#QG*@PV9u6mS$Z|P& zMJ7gS5vRAr8JJV_*z7^l|N9AgTp&A~_^YozO_1wF&Su3cyG`>n1KP-<+&QWs=js~z zc-AbZg{O_Kiiqa*xv5Cytm2=!sSM2V7S_#68SW!?sOkkBkEdX~f&sH!H20RQ?yA{_ z{(p+Y_LF55Cq0h*X2DMf3^#Eac7_a{w~LjHrx>@&4=;^+v+a?;pR4Ct12m6-rt68 zcG+I3_OM=g$UDmqcw-W#7*q^-W(99h{zsO=n#6Q@giF6gwF-a`D@o;Khn0p7d4(A1 zSUGVYGv^9o7=w7PqN&Wu9gKIkw;@tuRJQ_))?nM5A5I4MQ?oHzWq{6N!Rm^uwwM9C z4Id@tb%c}_>AWi#ukOEKc0;WUav4~iUsYwaqew=hbX1MQOz`6ERYqtZr+B}o()|H@4dbP(N2{oVkh%J515Xga9X|Gy~P%D)x2u68BNZa>oN%k(xu?e|(<;01XZwXAhX!_#YaI4zo+Rmeb*K;#yfY$-!0T zqdDMM#l$79hT;z^oA0J{tc>K>4-tR=EF{$S5!@kj9z*=lIZ1?E^B9wSY;)_VYQrY- zR;AGrw?kayCM`DEz-Pm8%NQHA2mEM@wPgkls|6_22{ca&`=l&J!ufxOye;YT!q~1d ziJv!*M|RomuE8JZ4?+oMjOt4k@8y?N=S!8~csUK*2MmoT-M*X$XovSk-cF}HI$-N~fV zmA`<#yh zEgU8ah2A6#7b0v&yFIWYQMg1UD0@5|WR)ebUxyeDRv78nUTm71Q8c+nCArm}bC5$4 z&npq(NVn&X?1d~`?>KocCSItBS}ztGy#p4D+Hos3mriM)Nx6t|v8`2WsAxuM9}~kW zdES0R&U&F{y2Soy>O$pTJ)Sq=lcS;$E3&-!;-X0~D+^jrQO4G@2a*hcxf6Tj{CZOE zC>kljGN_z8|C!E>_TVY(s#C>t$gS#rmsy{6D}&45A;Bmo*(|P_hDon$3#o<%&$3DE z-mv`g36ygDty5PH~?0kX^r^o3&U;bD=+!jl9xUwu`hH~f31H~}GDJPTxNfk(!mD%L38g+aR>8;?lrpYOU>WsLH)`{Ad5|%-y@dJ6j zptX5m096O~2?+`10Rj*RRE-|J=;jT{-_XkG1*J9To6_xTf@jzU8 zt?bJHH9*S0e{nwl_lmOYv2qVSVzJZlCQolIIfq@Vxg|1p&t=;mZD=op3$-cTWT~e4 z*NOC=Z)I;DYrTZ*^Qr=dIzGd~1i+=KG72=IlX)Ab!yL7;a={&PHppjFy)FCzi|uaH zAv?jf+Pvj+?O-$iG-mbujnR}%tYsTi7wN1A6#pp;qK`fOy|1+Nrzh_Bw>u%aDCv;d zSUkDdsY9~Vp3oC3XCFP^8SL8WK{Osur)m?#hLO%5*)^ZP_IQt>ZP8RlLX04mk{Ic)Bt(`imSqDBe~gqk9jd}nN$;mp zew#TcY`nDRbm%$%Ja0MVEQh^J@)~Do~&*S0YkoAg0=>HltieO92_O@}XTYI3tfjE2U_9WzIjb%O2ic z48JJ1vdy$m|7-PG#g^p1)d)L~GURTIvr*Yo`CsMY|?eUqaR_KOgtPkUcWmwqBzCXJo0aQ~&h$wL1vOmR=vdc?rIu zLwzojs3MWKxkSdzqW9}YlxZ1{ZEd?9UBq14Q-S(0mVe-8c?8AU_^Hk)ld=zN{s&EU z+U3Sxf+s;ttsh(PA-hrQeUtkc)=H%cnS(^Xl;M~j?t1)hiE|SRhfxUw)Mw z=P)Q-waD@^K)8sofXQJpRw(AL9VD0^9LgQ8jg!dr z5Sb(;f~WTJdp-KcUmnMmz*;g{?stf)VhASY@v#EfTWeFbkSi234l6xzt(ecHH>nm4 zmn8EpkKzOR9}t;A-jP(Kz}!H`qJdzYuQffgtabd;*Nb8+X;Rm}24 zcp7*-{Z>$1IACK;x0j;9@Q}XqeJ#h6NEjcv#OlQr94~j;B(X)XWQE?$_LW_*ixt&1 zzq!#P@w~|1?@cw8TPTJrtDBD8=TKUbnBFW-`wh1@f$yi!-;jmsjeKr&YYZo4fgB-^ zi{d$lP2uIwDu>!Qax80{cZ?LLR#>RZWKIE!hNy5q@&DcPjJOwaNm9Gl%!u5DgqT#4 z8vm_L=i9=OO)M|`e`Q$-$*S3`6M+DIE9vj+yYZhDnY^~{C<&Y4CS ziwhY>GgzU5qye2)0QF)uUXe6WLi!Ur=Wgp%zLZXFpPq-gx~t| zqsrXUPkzdDhbSLQH#A;l>1j6oV1VC@$oR^>(r&OeH+0-YPNlk5jqa})*{3r>1$pl!aF z8n3W$=Y+E@hP;K}3@x0rn0{xeU4oaB?$8I^VFPn~IU_q)*mY8F8RvR`G`Tagaq`k= z+cXhRX}fu7L1|yOKFn*SyQ91F0Y>`S={ty@<<=j$7j@;04Zohc9I4OEz3GnIgtobM zyyF^j&`-RpPuGLa$rO?Zj?DTGBHqSt#3CeyXqOFOVcstBrbS^z`1frK^&AP4;EQl8 z|6ooZ2y6fNwf=4I?-Dy>)eQ;hii=1u<#n!!#Z1?lRsrP25CaYzI=;4Kun*FMMF-}f zUiyoq_)ZYHWA7=c!*0T0Qp#Dnw`fQ0jxD1jkDwUyQH&+YFH}z{vM%6nU+tDgi9uxlc}EAFVX=b-R3F3o{!t zs=J>L-I-NZGaVtEIZ*%1{$sO!V}ehq?%Q&q#jS}Z^yxC?N>@y?t>bQD-BlAITU_gI zHmMp32zz~`WM@)Q-F`}^fk~n<133_5vRk89P^>61w82^O@cjHiqfqdE2GzUNw-V%U z5bE790tbSHq|^2w^n)Sh2OeH546~PFsDLvgMB$(?tnooJc}eo{!hGLc{`s_vH@fPe zF>X|#f2VYsVKe`YSTB@S4BtOIR~TUL1gin&RLr(qHwk_Wz@-Q$k!F@kgk#x!hP5P7 zY2LCRyP@Px}e1|=-FCK2;W@?(vK z&Z|1)J>vhN1fBzok z3#k3+2CQGtLy_4+@E`~_cx@EQ44A8OxDk5hAlO=pJaLWka-TLft`OFn z)<|4hw`Nklrp8=Wel(Z3q_S>bKiUO$SD z2#G)aL+G$emjhkhbjd}sRH!rbwo6|!Fb>#gbZx}YGYXF44_xxHW!%tn3a%Y=#b=iN z;30>~^j)GrOo7BL)mOg2f3LsP6k$b%(f+w6V$fHmV0CpX!&PgQ0%f0{MIxgG$g!P{ z!Q((w)T;X>fuWZ!(;ws}dvY#e=w=R78h}#)!|C`Z?4f>HC0oPN@xLR_0xz4V;@e5R z&(hnIp+w6eEIo--_CAZLO`jy~vBX+qL`7F9c@FBVc)-|_MiRv8X>L+HD~uKZ0}5sA zfHxs#R-ZgB9t;e9mRMGhZL@KvA?+1>FnUIHKatbPa3=oc?If zrst5djyL>jY#1OW2uc;kEtz{zor6~Gv&%Y~R}f}ci99cvZDTnV=&Udnw45Fh!m0O= z?qf3e+r(t$?yW&(p}>NXE@-xOo{txm1lzf$V6?!-!dl%tc5WWV5z%jD2RTs{WIuCt z$BAZXJV$Qq%_Ic4VB(SHbE0jmYK&0*jMLxmsv19#{QHDf9;(qJ%7`|;lOZs>a#w{{ zpc+9pt~2t}Wp%UaZ975B@*XPTBb}-Ta&X^MXr^>8A97pWl-rJ3Z6QnYh?VuF0s5`z zOF_{4N!+D8DkxuLDVL`mNvR%^u>^t7YSogdnh~mMxaSdf1>pPZuL@YH!y;wvH??K1 z8;sWeK7c8q7B|}6`DJ7~dHigUK-rLtCeNe{Tk(!}_JV|RXTVwr6ItgH5%kUxFODB&gc=HNYnNrP*6KZQM^Q&Xc*ULQyjkI}JJG@ycfKyGvjr zL4GgJjLNo@e0uuPlUTk=sZO@n9(&96jX`UVe$R^XA!Y}ms>un^Hn5=-mm<-O1ceVG z3TQzvU!sEzf{?`~9t3M>6K-|R$Olh0f(%G5GkoLJU`SW?R@JSP_;1SW)5*l>*4r<| z>9ALatZFypd#7v5xoPVkI@4?=AC;G#T0OXz1JCT}mh7#Y^Cd`3r(D%SU#dN&QtN7{ zB;G;l^0+N%>p`H#kEqysI*`2@jS+)L?C|Wg5PMaK54fSRimPkQYw$JDmc4uowxS2t zzuYjO@-KgwqJhQMC6|0dY(S-=(d2o}v&M8yyQ`Q7S%fyrJvuev!K4S8M;>VM7|RMg z)C8|GXhqm^wZ^$=-*pk{Bbjqa+#^CH7emftsct6hhf}%kGf}A^@k$zfbRb)m9bso- zp7wZpYK2uVUtZ})Zf#&K$ zrq6Bz^Ha4#9I1rZ@#jsmGjMTwWf!=a?lag+4OkR&tebh=r7@|syS5`&gF2jr9$t4w z6k3$GYslQ*sQPC}_{(ugG-yesH|xvU2g|Pv|5hzD>}j{9_z`EWAQ6Mr6*{X~1TIlQ z+!`HuVrCU863U0Qe{i2gzaF?zPlO38lvH(aR>0r;2eG+r z(_shZhzPj`OW@2*Y4$KPe&@QzMy`mu=umg}F+g{(re#Q-3k4=CeljRzze1K80lW^d zqNfygPWnTXbi>het5vWvVh8A z-SGN8gov|LJ=?jtTW=Kk<<~krx1X`C23Z6o z+~EvyREZ5Y`ieFKTU%?seSPW3{a@#V7Z^JN{FcT>ZpFYr1sAVG>(A~kjEoigc%)4M zL6|d5Jq@|33U3fM=0@COs6&1_dp=(AzM`7+*w7^40$V=b{(EcQsxhx!OUq_+S@x>8 zPjksY>{2?F!(sq`KX#B45BN#F1m9;LYy8vJ2yg)hB!f9~@L~PemMqh(odVgw>?F8* z_EZR#Fpce{>$0-}4xXG7x)cXwfXjhEMxbms`2m!p(>n7t0(Jb9$3YkF1*1-B5GXk< zCujLwpV$Y|dNr_y;w~BQewRI@A-R0symA>0P{8#G8gyz=Ha+&*%a{MeYBYHZKT34R z3$VFcQvZq3YAp*+K;hUfd?wa++ zkw+6W$+>I7steTQbE|7=qKb9sziYW!vuP7Y7F2@=>yzGdu}6x6W*TPBl+PTYa;tp_ z`(;ggNZs_`a(-JguP}JcZ+#)k=y@TB-X99_PGnN;+5z$v9~n|u43zdbpNnNStZ z7Bym|Z4YaGU5#_+YhruWSQ&@2$=Gvxas*hqPRA#gW(N54_45{5mv%4M-R)3VwYcfw z+&eS)V!a$$KvZ!VLN)qoN;98|T=ulh+yxSi78-Z_mMC};2Dv0grIsQ+nfZTq4JDtS zMKphRGBnbIEoqwwSTD+AEo=0+g%GBreUOYHnFL3cKOCv3sHwjXvxug#^{WI8SOsPR ztAb1MO1OO-6s8SWk1Qp9ARWAl-!fvczS@JE9)*Z7uxm2(!5G^>-#`Ey*Gwa4$5Ahc1Ani~L z6x%}vf7UbOpvGljS;TKeEttOW^he}9yoN7EEV&lTo*m2+3rck>f)MxF7fiG8!v*)Q z&M!c?cv>+MING163-U1{<&h!ec6+);Y}CF7zTm82k<-ZlA#ZWv1@QH2=E|<-N|(p| z;kJktPbzz;LuKDw0I~G8L5Ra(yCJ+T0rp zLE%QX*lBz(7L5W`yVIEf5~iU>x|E|Tpc+L)9+YPE$aInmr1xw&~;!BaG__8Cvld6*+z6OG8?}_ER{n%oA zj>*lGjy?qcZ$Edi!-)~q>dvwZ;}g@t%gqxfmt8J>XiMKuSJTSOu7jtGvuGO;2thJ< zhQRu_kOY!-2>c8nP~sy0wI|nNTa9dqRr(hM3-=}hJX)FhQa>SSkqJkEKc3E>_C=HX z^L2C@Cbco%ZJIXrjzS)dz3DHkAX>fVyj3bqnBp7eTO2xlt<-lSm5^83jH5KcG)9-$ zUlXLzi;@A7YgdXaARRk+7`^Z{;5M#jm#w>EAjc@^sKz8Yu zw_0`0_bo>X;f{!}dQkbC?KcyIsZo826Z}K3gA*r=CF>G=FJ)cgQJ%0*2-Rh3AZLfI z<+bj#fB@L(U@J=&FYzv)VN09J3;Z}g=}6rn#Jhi@`}0A zf2G0qY92fIt9EtMpep#f5k>IMevx>c7R$8J03X`DYC2s6m%>ObbW?P2C$WX$!s&z{ zU2r83!=I0A+|5|Bgt2ElQnKp2L>F!(*I|mg%>n+en4*i>ewjMS`Bf!pl*`n9#*ztFGE`>3ys2wI4H0OUT~xCglwZTl1DC zL2fudrV7z=Y4qOw5P;34wP%_|E!5_6m#@~JEY>+4D%FyxY zj_m1AHgj;&-*v$efP0pren7zak9+CHjosZFfpb*S=HDja=pY1ZSH{px+yKu?9BM|` zKGIB<8H3I!mvc=#lFVimqJ$QRkY`x}&BP_uu7;2gf*4%%r{==+zx_xX7!Ko6DpwUR zgG48;l2d9h4#T*HxK_y-RnCleCMro|=5sU64-^R{1=B&ZJDX(@of4l*sIg%CE6xb@ zr0U8bGZ@zjhM_2(gwSX-P}MMmj1pxrRwf@sh!JB!lB!{t`C)Fg&)`d0&0(^MF;dAi zk323&_TYFrnKCja_E-aJboQ%8a>B0#&BJ)|;7+oZOY7ObRmyV-c!?^km*CDxcXEvQ zJ{2ijZLDE+X)KzbSq~J4N9d9&bSV)(tyoHQQbb&r50Q2_fPh6#0&QRjg3(k;I!Mv! zDCecyh|U~JG_6D$RD|9WB%^2<1JXlT8bL!%Yk_Euyqppc{P0W|X^#FKV-WXa&f$O4 z(NOK62jRe;LI3?nY$EQ3tsjYbpnh3r2FUD;B;rzq$a;TGPWc@pGJo6}t5pLul1Ob= zXv(?l(?*R$+#SR3b1t1EI+pe}WrB>(Li|?(V=(a26nm9&!_h+cr=~FWEH_B_8_Od8 z6duF{odw>FGjD%<>vr=L|&`~i+LUo zkVx80EsY+`Lmn$nV3KsDHZ3uKtSz~9P{?EU2GC#~HwglFb^3@j(DL`EuxxU1xJGCp z7i!0 zk^zY?=vby4P^>tI(4=|NM$$zDJwY6^%-Pj7|%=teA32{H4PoM(d?zqHB ztEn+F63^PRlGE#|%<3}`gsvGmgy*D&kLebA086tV33?QKH+DTAu1}hdOTl3%LY37} zlg3i4!0yWXl!&u3hsRL}lTz~62zTK^6PfXcP!s|fTpZAO#=V<*$3*GX>D&(hlpzni!8v4GfIoT+B#L49J7QkLfjN=P z(r6LdjF2RASgL44_Y)rfNjINI|6qrR)LpyXkJP#5J2~Do!7f;>aV0hip$v+AAqXQ} zRD_HY9D>Zh)N1f>NQ81YgkVepKpB*5C)7D; zfw51B3e%aTU|;b3^jH*PF{K#@aksfkz)8z;lKP@{`CRvm6$Kj057%$kX3&k0Jv@Z z0g6uVb$I)K)&%1b?xZdkOtSj;CXC4V6=|hbN}~e^JF(*15rTZ6zaXxrOi@bZof*u*$mU-p7F06)w+bnx zw@i!>i!zrmAk5{<=@Mq(O~Y$IItg$B^VnA+onzzOrJN~Ne-12!d~T|();T570E_XRcr}- zGaSJiR1WfdzCnSjrBB`dpE!@*O1=JX4?4=e`ZlJ`EM-nNcN9#iaWgtjltROA{PNig zLt!!g3m0_MgjHq;y#CR;A70C-xy9XNu?W3Zpw2x8-H_aKJh00Zu0kqCl&;#Ba?N&w!an+4z7F{}bTbEM z1g14g=|}fc_a^=vf;p$cUaDS(c~x7}0v7vkmSG8)49GSw>x!t4Efp(nFL|uYZm!Qv zD>P+kmUZ}43k7UsSK}64;D|Zs)F1B$jVrye2oV$jd*WXU-wm~FnrVw4efI|nCh_XZh1A%7 zpfVc(aJhOwN2AT=vDv==9wC?sF=JVNgi%^eD=S{3*8_Kwo|b;Ryr6&x39}d=+q5;rZpM9L5=EV(J)4Gz4W7uS zA$5a44;5M>SWgeVv@ET6SXa{A)WzN6+PhadoYDtg415t38F`=D^~3hUe+7PWZUR^C z$N6h*=0tf3QVM+szj17B^DrB&zMKP<6G|@~;EgiWAL+0A%0|z*P;YQZD zB@sHv1t55Qpr|yVROG|@zi`KkRFCHKm~!qc+~4GSS9XDVJ?I{vF+RO#x++7ZQ*CD6 ze&72dfOmNnq!1bUv<-{{&KU9tHp!V!m_Ex(lQ_m#kn|_94})PCz9k^wyFA~{^LH`6 zyV9APDw}?aN{~DynkBcRZX^T+CV=|g1^b2B7`sJAj>Op_eALU#{!0}GgU~#mRnN|; zW~)M)%v9i75T%pk5>~ywAbB5)rrWe!54Z9iOBNq6UOYexf%m1sv{`RLa8OP_zYfpJ zy=o&fjcGa*jRJV&$daKOwvP!p+=RIYkv?B@_axaejY((N>< z+vt5ggmMg-VyGG0pCyZT6+54fT=?iJ9i%5`y{^3hzKZciX>Kl>$h(itDtCHdN?+}i zJrm1{YSzdlE1US3=1OR~tGWy9u{lb&*r@sVD>vdcnaiBP2t%i@ju#e+3Yli0uIc=R zw&=`_!tA48I~rOc0cFBW0>!r6riKEI3ZMPB)TTHG)@n#a-ph{Rb| z@9NyvgAnDZqVXrnJNR zmY7JieL!-;6EwXSedQyQ<>MqS?p|oF3M13@42I)1-?;hz=NKvF5e)dTg&gF*$&3$A z$;vm2YL-ZeZM1||se3m&M1+hFpJv9#f8K;LSXrcS1djraAc8wq+~}IojrzpF1g67C zte+bg{^s>D;-7`umKA;s$W$>eY8&TNMw1zP`|Jx$!Q4+or*}o5EWvQ<-`T67BAloY znPwXLbvgdX(rq!^Dq8R|?geVGTv11)dYMlBpo%Z`qa()YAQd8C+`jDNFkS`9`XUFb z!iszy0oQxR4i($)IP@7XR{$1)9n7_-1D=f1d5%-BI0ZQ6{A6OX^W zL%CB~w_Wq62wqQp0Q%BHdNOEVsB5{#MuhMhccnGAhhmNtj3{}P{5bv)C)f`ZzEvm` zP zZPtm~q8Gf&F0k{?QfI3!=xrO1nP@MNcj{}NAX2+5;}~TWM=aO^<~EJ2BLa#DuBR=xy(O;Kf!6|N~JeA znsK!b`1K`t?o)@UL{C#nE}4pHplJePP}3euIsPm~aE-5&PdAGuS*8yF>J8L)wMo{)eu7Z{fN+X4 z%$NQzRWol}D8)e}&>fGsIUhKSITpmZrs+l^lE~(45gNX2o1aW%5|IaU+HNE+qi@Y- zWqersTx$}XefIuC^96w%fahRx2*Gwb5~~3)G#E;tMuwh*5#ZP6SYyI*7kd0@nYAWI-wf;Px=QM4XGif61i{Jd0Zy7*aQAQ_~>M5|)@5+@Bp zkO@*qU(aUtJ9(-Gqv2&H5Tt&A5=c95GCkzLPFOf7fopPWV96EVq%S>eNoG5%MLfe9KaItYB1aaVr|7pH8fLCepUKxn&UU z(&+Wt08@hTVM-wpX-~b-#Ajs*(kqIOw5ep{Xy~EYvk!%$<1$s-5q*NO#f#}3f@}?y z&y%VS&jQ*ON{8g3d~w7c=@IE+80|J!Nl2_=tbndey?q|Sb*_lTQnEg*x$5ururs#x zz%|vC(Egq~F00DU2(gB$LJzbpUd)_veenJGo&Hcoyh^GW`!^tH>yT~G*Na=(yq&x) z1*_YL577T)tQoT8<6FjH^ZUpvC;k2VW(&CHqL5rdcZOCaVY5d^$#$)J-lByIA)6_tE-x#~GjgZs>eri^n zp5-l7;JNvaM!Y`iiubBFBjd;siM+`v&t4sQ1hrt|SqMUaT_E@m0W;QM&V>v9ap>Spq)G z`_W;x+K_6lZL~~$RpalBbNXvQOAB{^OF-Or*DQ-jI!G9cDR_dlnxcQlpYHymG+SO`E2_u&8yAZ{&jXU{KCPI z#oE{<#MQZ2U*)UUwmUY0n?Uob%|s4gwedP}Rb zZvCR<&dHMWfPywF;0`GED?D7@m2;sBe8yS8KpW2o8!4*BAY+c<`cvN-zE7|7XE4UR zPq~aaUS$+D#{0~r{89ll6Pvu|NR%*W)i-G|{5Tc1e-hbA97OoFC~lUwgE*K{%9NgO z2zbNXwoANa1*|W=egHIQc*9On;_p-5017yKyLbg1ZUQd%8|~#@n4>-bk0MXr9VWVo zD&oWUV+|1iO_{cw*uN9PvZ6J_zRhYBF(IhB%fPmJ#R4IOxF|#}k$gti2rG*g`{Q)- znR@Z9i11rDJy<`0AjEH1v6B8o$O~n$fJ}1?!4#6M8oVH9)rV4z4Fo#tt;o|c{@xkj z)dQ_arkPZqRn{ue+r4bvy^(p4Y3Jjx&`~#s-F{`#$QBmc16tUvvEkSzyGCjVF27@h z@p&M&h!Fh@9ud)cGKCZwCR%Dx^M5<(&K{3rQ$<3(1gCn}e@@EFZF#&omGUKW!dJf| zlQ>bfAgnmTUI&MsOKeD-&zA}^szF{_#a*R<4D#(Mfx+)FhB7qQgLxb~z;?$bx5tyP z9v#2Ku{38F;c;(rfbCSL;3T=<65mSSbsay=?-oSj*-*87n6ev9I_hixd_R6SBWjP| zrLQbRio30U*_kGFSIysg$S53aicM1q&?d2lkvb-#JzA~4E?U;gaMP7qc`LhKRIJiqxuNXD z5@Tmr2mVT1AG0wFmcUtv|1M@O2JG*|w*I%+(hS73k>u{E^2ykw5rp(XKvx8sJfcBV zVlENzRL>Y8H)Xce#_@6(hY=fLi zkTu5-G5lIGk=W(2;($@dQPgKQD1Hh&Ck~i=1mc*!MTWI$Jmt-4xMKL1?>cfs)PX>G z79^c+2_r!k0$)-`i;#BqEG>L$$NYsjXBHBUlUFAO5j>^7#3qJTyu4yQ09F9_#k@$2 z$TZPmrCNe>ATKo*;QPwvAl#xs#dN(o!b0QJoF#&$=MIOO(*-coF3uCZ!ZtxMfOjQK z#RNx1Z4tFHrGv;id04A$*oN46JRTV8bGV)(|IaaEhcZ=zLwTOLK-~sV+S^r_6Bm)T zJUOLEsZEy~0xbb?Gh3Adn{_9clblHsgp;EM%QiPRT+Sf26i%La zyA2O%gSMGxis`KAL(ru#%PR`-RpdNg$O+2t>?i3_;)Lsv6{^5idq_+iCuNl-N7dhZ zv=kAXf(geEp{)3N}Oq_bid5)xtqgOSqPs%`^1SqoWfl&q z*q%-*1JOw|IgE%tPKV3Rp+lrYYM>DFw1i09b0{*f5L{Vrivk3(w1g zSr$>UdL`S&6{4y^hNcHQow~OH;GXj%HYykNx(EaLEi7?L`#M3#g$JE-QU^4x68%Cf zdj5=0_OHsJm?rS0e_tF;F8(d0UaT&osKyeB(36LT``SEK;h(ED4QT=K^!bO;UK>$= z?++gh%Obi;p&ZM2e3Sn`CbM@U;!^j;pZywC!i->l2Z!ZSrhm747A zwSNl}Mh+MI!DCR@7`k-d?-6G%90W!ARpmUoE?S4-i|J%t)&d@O{$K=($&V#BmRL+F z(K;?&Z_6O`sl}uB9`&S!0Uh{OL%pd%k&ag_O+NiP;q~d*72E2`?SYgdgeK4YObkB? zV_DiWCE8BHC^}FeewU`R^HvW=I2h|`I%tPyusK_MrfF#&&@o5vSpM5XQG%1&Q%Y7ac@e@MLQ6JaBoTKy{l?-yrmOfji?IiTWO`a`$DFNqToU%R! zcu+nh#^8Bv$b=yyxC2NE`TeCc5qyX=EhB zuaKG2d&CBnnLWs#0i~+};=H$70?CPUX5`dnHB3& zH_v!M5aMtQ-9xaP8?!Oe&gcG1erV^7>dXsi(>Y&t{Zj?{vEXMpJCm z(r$OaVD?}jvtua~D5=|~uq5@ctZSX#-;%neR#FL4j%7c|p2$*L5^fqncJvF31W(j6 zqb4DeF8+67^VDkL+|nlOvi<$&(mjpzyJ<0e2v`+vkmx_I#S{TE{cAa#G4qo%_s{Tu4kp`#l1hidMksw%B~iWDlGvI4wl>R;>B z>&A+_q2XSWaqwf!aTxbCWKk_*3?ZZ_Wof+6z1V6zoH60`6ZLx1lxZmvSQ}+|HgoJ@PjXWd zD)@2}!fqM+wWO^8?|B1|BI>F2`|}HU1yhM!_#ITw$(9bd10ZM)6%^LYNUU9YSAtfr zMLTVW9WF3*%t$c7<2wMVhjDKIlF*WfM-2CC^begFHXO!Yq+{IHA+U94oC6KRPYpI+ zUR8G%jIF9<%F_Te=GfQ1ihs5$F-)nvzlQZ~(V|CQgU+rItpC%|wWaM9RO!i9#7t8E zAA0rN=?l=~^;ad7QQ&$n3MJlp)(A^Fn|l>O3i*?gFuZ;Ad!reFl13zVBS`1-lo^c@ zNh58RZJGpar+o4W|NWVH^Ei7=3-c)rg9>7^7f#EzL??Api%HYqjn0W1=f_Uy%oRtX zrT$4xw}-#d0Yj6AB74v^Tf^MLK5pdy{YLX;WVg08uL9)8YDh(OegNu+)5bV9OuPK) z(&iM|R(aqvG`m>|)u&Yl6@Cl#iRG4Zm7vAd-_pVk%Xqr7PrvC5L9UOk>*ley%R6uXpUO zX?~F!q|j&Wjt$K%o8{sD0k{{Z&Ie5{YPYJKS90Qp$olvo*2}UiYIQLBT~J6wT*RgW zCjTM=VSU;!HN44iJ|V2YpOs75XDm2K`c6NKoojr-#8QAa`B&n2<|5P1#3DJXuzM-X z$M;4{D7u9yAss}JwUx{W@MretXRL$Q=guWM)sCgS2U7C3ZK>7K@XLIpu8$Btnry!! zM&5R}L=+S79yNI!X_)r&`$n+~$dbep5Dphc+|2Th0WUrpV#N-Q$k8hN^DHP{QTVJ2yNB%Mg+fCt zsu!8Jmbva&Bw*KUmyAoq%P=0H*GKfT;)Rx`HnA=s#R=4#ElxD#;86XY`Q2jY?B~A1 z*^1l$l09ka*D}F8mS)vpt2i~nn5d798ncE*Dd71(PLi6!O!1)7#gv3}K_~bGWxe;T zVleGM>;d*0X21|0hyauCxn3)m`v)fa#vX{RqUmPx{N)v(&pxz}oexx>_k0@{ViYK@ zjjmk3zH+(QuBvSAHWm0z%<0VQth&7iK^y=NHkBc`ZY*soN080s5<)j6g#-zVGebJ8 z&V+9ku&djs`d4_=Eu*MRDeJhA;u+ypLLxTMSeoar4xq(((U{04G%FHPpq|FreL{Sw zvCe7lgnoT;u)2>mcQcn0&k#1h#N{oUd5|^tB_4O#R)&zOkr&{rxO&VOVN-^fk3Aav>Z_{?J-jw4Xu}os#u_e; zeT^Zj=&(A%{zdZSdHNz;*>{kLzt(Bx=zVeCzrV-C7;MIa?tzUN2D#Ccw#-vm@*&7 zE@mLRn5Fs*6FQE){3&aXXE1Ya%$aong;4qenx@XWbD8RxPyf}J2f^|fMd1dY4*t|2 z^{o{UlU@Gt?umf}OdS}tlt_W(6O%D;2s#VBPuJ&qzwvy7A+XkpDDr6VZ#O*ar1*1!Ds`r%ps*t^o`w(i;y>bX z{;12qv6ea;JQ%=TqFBP^?B|%6ros%|m|wZPk>s^Lv{ZUv zyB;xGVQY4d^>@8Hk*M;>)|~8)jSmo(Ebz0|bxyhBRcpLgoFSaQ>wu)Cr0Z|3BaIt2 zG+HcnyXAV{lP7(aoBj(;f|> z$-~+F-FF#~=bN<>{MNsZX8^xtVZ_1ZyCC6V|KFCecE~H4W7~O{(IUtdoM07*2A(q;i|`sam`Bs_#1q)Tkmh7gUNAYcn@_pwX(R9&PM30L zwWHGrX+8fI-1U9HTB={cF~upiK^q#0>S~9flMaE${{@=R+IKji%Rj*FZ%}hD^SGxp z7jyQo4fj-Ie9lSj#oS9QXoZI@W`sAu<(*LsDEE6PQcz-piPp!v7A0gh?o_P()B=mq z<6|4M5*v@No43~2>gyL6#-z9Ofj4V?0#dskzAUc@SguJ()&0K5H8HuhQde20hzr?$ z3TXSX=Fa)BQ@?J+Hma)Ib+Ef?xlgl*CRZ(;u^p#_M@Ixr$kU{P^((hV<|%&nK5}a< z<%VuRIl#S3$zGx1_;PcI0cN=-2 zg0ntu0(A&&TJ$`=KM{^Kuy=Y%Lw0B2=?A2*Kb3IKKdDtYJWQ!7hyV~c1araEgkYZe zCxC7Mp}b^5a&9bb(pa-e^aq?Kj*FG7zPHzJ=6~d0&9x$SK29uDcd1wP&ey?kzbE08 z*^@3QtiRt8?v z1g0PgBSq1J%{RzD=ny>G_gU0E(VdxP(m=>N(wdVasKHP!shw$&h}XBFZ1DGj(4Jc6O5Hku`7=ySNK@W!WRQHX=6 z!Y;2()5`)b`BK}ykpenB2RNc*^&khQAcU#(efweNJNxu_nr7Pho)z}iTJBQCW^NrB z87GIlVjA^*I$u=tMzcOMrM}y-ny+OT)4RZpJY9wHe_iPZp#lqLa`_UgL zusE`?}7tDfxsNE12-dR`!6I9U-KE70@4{?P>m*t;`q~2E} z3LM}ZMZP3JwBk#uKAjMdQ0N`YQRK2U1JX)bO8SKGn@8bLID}w4Jf+l@SYBu-j?m4R zy3daQN|K8Yyfb8EsFOqX1VilA=oMd8MF6`Ulo#7<2h2A1*ZRr4uf##N)#a2Ay5AP$ ze_Lm}Vl$tde)49Qxkzfa*<=EovKbs+9%u_Dz`hr-KroftfkUYpi)Iz~Ar+ySx~bBQ z4)km|gkz#?N?J1qr@;E(a?iKPa|NN7^^2$}<=3@lrw5_G`< z!{Ms@!z1F#g2O(kYhH_0`&aECSAw;_il5-4=lwjZxF|WPxLC#&&j3wq?P8<@e2FMz z^wH}Rt>0BWmk+3g`=VVJ;fCsa&Sw9VuVYLnf2T>U|EJ| zdo6VYFDqIkp~&wZA?dQ0#e%5z&#w|-#Raxl+uF~0+Z<^<)MPn!sirh%_8an`TdsG) zy**~)D4rw%*kbwMR}=jm@p(@0D0TQHybBMeNZAB^!Q@fQCQ*2SuF>9W2puUJ2~Eq< zc_mvVbNMT+D+|H;G7neE9pIV-STppHHcLM6)?NBJbMhl5MdXXOCl&F5?Y4?AJLDa( z>X%L@7-}N)p2sJr;dM?Y49TxsZ?_MF-ZRGleSFf0_16Sf3j0KIw&N8QXb$MGDcj}L z`}^FUgC01uxo(uHHFKCZN^;%)h|s-c;X-hn5CM?;0c9ue&n>vyD-7LeNe9k_ORB*L z${xa9_a_t>9(jrw;;9Is+2_X}e{>%F4!MyJGU)>zkX0!uQ2g8#mYo+q?DO(MQ_P7I zOc-&V9zR(6>8o#x+uzMa)U#Gd(6Vs#J&9=fX9&TmWwRv^-rRYM9bq8)dmrf+up)-5 zlISr^EV!H^`CV%=RvV4lKV?X&RQ9LOScF$_MRJAOt!3(jGSq^FcD7&h6ctWBYVTDs zhmhN&uU@&wrBRRj)i_E^0UA(=yK=Jcx}Q|iu1HQ1C^dpFq0Eygl`9C@14&_9Y%`Y6 zux*+Acj5^y&IK1ut<~egtiBv=ZOcNyho(+Q{Cmn*;NAtEPT8)h1u_7qhU>(oZwnbg z+3XY}r7{PyWzSXwD;EBpmD2`HEz>ZnR8f^#Ehb29ll`~+({mF2oo$}=H^_KfO}Yu~ zJ-9us>Asly6Upc>o&gT>@m@%OQ{;M4}G(&~Jp!bkw_*U>CTl27%7~B$EzGYZL zC_PGAeqK9#G5E6rC6UgVA{!WHT~|^!hVyDGSsfx-LBtLa zH^D#BAM=;_v(}7$qc%8VY%xVKb28SJFAlb}N{YS-^Plpjp?uUYQKAf*KnLkBQQZUh zNC5%jO1m4^OY|=LS0&_QSq!UC9J$v#cnK{&*ujTJ12GugZMsqAI(& zfM}{4m*K~CCuQ^{9aLu`-k7~nDp5Mf-uT7P@ti2UvPvCSpBO$iaV*??jA(dSwcLk! ze;obS2wTjIxJ|_|y_Zzd`(7afk*VU6K8wXG8*$(pjNk1q!4UjFJ)S+rdxq?Di0rUxu!^h$Xal(^75Woo`90o37Y~G z(}EL{ko)|AC18B~<`24L&~@+}z$Mm1iYZ}kqvK2I<<%G^21TxJEioEABqrvHMg;p= z@iT@vwllyvZ6R*VJ+Jr6)8Sd{EBBZs`qJX7#l;#c^Y#^1;Z=~w<@9jc2ny89)(zQA zyBA71Po5#~lHQlo;y~qy-;TU#mT7rA{6I)= z#J!&A9#c=6q#kRy)eQPqM45KtjX&M8tvI4&yk~rAa9s>3{DTb|F{sI74Z5H>x;Qa)! z_T1U^lN=BELXgjq$!XWp7*UQj%`4p6cp**;^L9Y$=b$!#X9q{ib@Qj`6t_rqvkNne zQ;$#_*{tXGHdJD{x^YiEb5pmb(KVWS^JV-*&6gDb0slrsIXwD$# ztV=qtOs7nLlCIPNd9NRopt;|6cg~a-QqbFq6ny8oME4t)sBg}>$*yl+gqBxLCVl+& zbDwE>5i`ZhD&m+!{ktz7e*4j7eXXcZGv%530-99k^KO3;oHFMeunH=~?xE#PGf;a& zVy4@J@g5Srysn1t^YMmxedrF2-SSlvK0Fv{5`lTYRFx=020{qlEOTT;lJV=H)X>nF zeACfymM`~CoqE;_&gN{Z4*5rGQp0}@?G|kK#V0psO^~~G-I2`v)ceSL(NP=HpiAuO ze^?m(;V&hJ_T_ds?au7n#eez%ci+jLIsQAnvRGBOBDnMYgtGL{JLJ$B>5Zh_j66Z2 zI<~@*YvndKD(CW{sSUgYDn}aq6n=ywXy(wkX3Fm5Te$gKLx}diqigI5GiB?{Ke^$r zhNF?FFp$=-Cql7x4a;`VFeY_)j2ey?PNEe%x$oBn zks%oBlcDzOA8)+;Fu=upjLLK}^aHas^5MA~AFtQM&9`80{<*I4Yid7yYliO9ygO?$ zzTLa*P0?-B_=oSJpMR+O)Q!LUa9P1m-)b22U1)v_)VF!T_{2@?P90gXeD(4=hr@v( z%f$jX0ti?y-vQleHjd3;aC^Py&(+nPJMZt5yUd2z8>*e6iecl*1({Sg@`SV#7yxe;7q!oYIg3n@%aIJfAu&veJ;=MXh z2MQY+9zQfP+B+Dz|L5eJvNFdq=pBBcal~^nE)uK9Fe!$49xXIKb6;WoI}#P*t3}3U z%6##tmx5stQvGXUq)8-xIWl#g8C;|w}*t=HxHE~Chjc37nnO;TrAVIlgFa?C0Ll))g%N94)A%C5Q+ zPG?o1`1jxQ@>sTXhd9^No!*z|W1wE-@hCj74fZ^jXcUr>?`Zn3|(x3#4O z%*U239b2|^))<*-ne(`8;>X1QR{LWhTXY*V_YnQm%CvV0w0D z_E*EYVRq}(_?8uYL#aaqchgH^iADmt`lfd6nOIg)v%?#fO#~a->wi#Pb9$T9LHbfb z!4^8y3C=M1L3ZR9U7js`YbDG+xs6~nf=B9}tjg*x6d8*@4pj0~XFkMu8tXh~+&4lE z)GHKjy>7Qa8><8p|I<*-b|KO9EMBPbU`^46?t)vO!CVYAoA+4<3kJC=yEbyI217#+ zRtNn8Kv@7WJJD|mj!f62>omH7iwusH=m~{|UB2=aw@%!2)vH%~;Y~;auMye(N+cNt z8?Tmq}u{4b_)^B4Yv zq}YE0@7+uaaS|E7i<-w~&f~?I1EfO#V*$c@E21N2{M114eYkW};pX7*-vXzk5iMU` z2qbuQ5AU705#ayy2GTyCDu}EM67qw#o!A2qk|?kWgs>-Q1)-BKRPxRqX+6dh&or`l z*>lvNcOZHN-n%+Pto0OeChg!%nf`I0{yw^jtT-#3L65@hk_(%;O1Lch!S)>IR; zBSJWPh9DvstQt<~)49fnb)d6+w=c~Z0sKrf({OAwDA( zOd!rES$K(qOvz#+b`iM86+MZxV4WKAAZIk*g#T~crH6)|ouR8|y?NOtsKH75p%bQw zk!|U2N!+Bkil1Pvu4th)V)$=!XRNyL9IGZS~zWIBQJl6)Y_Ikz2Kh>E2W-8y>GV!4Hu>thylkIljI-l5!Wrn>$&$&0e zt6LOr_Or~F7&Z|8M&zTjUzqF@cT`kUtgArEC^LsT<;M$S(`>sh_qs~fObEXbp~f!{ z=a^9!=dwSYUf!A#?F~go6O?mywJSCj)lBE5X#tGc7~I018dBm01RwpDNxC{WX#J)) zWRxtb=WfabK7F1Hv4NYOb!<~egaY#svzQP?85L6h_zg$RboWQkvcKq0lXR0~shR&d zo!h7g$p-;-;PX zzI`Gnb-^|`N|drobBvVTkqvxy`z{Urk|R-83VqZx4f(-u{;M0*_yjNO#y4sw*m)RaBx2wH?-piu^nU;Cdh7MdEu8C!VJ>#!v5g z&(56hjhiw~i1RayJ&d~t`m2YNuMN3dNgl55sRZI7;2K?=JiWr}<8C&e zZS9tjb{0fRNJS3r9ktS_mA~34YS7fkPyhn|^+jE($ z|Al;Lez0Kgb(Tg&u5h1mQ4pF4Hjpr==?b&fQQv|bXBW6Inxkc&$&&x$klf7Y;opr@ zp0YeFEPSX8d3d?t^1~42!{++22(QW;F~-*PDoy!uzR~!Ox*P6srO<3SB4oEZdx>U= z`jo~F9T@5(pJ@F8zkg!Plzkc1$F zhMp}tsFHToRQh8w*60s5}OvI4;g&`y{c>`CxXz{Va~LF?$2|i*sL6Yx*^##hNE92fCD6Gj7-DG%3(YrN%DS zNHpL)dy-cpmf99CC1upu4W!LsAc3e!-OLYvJX2I8gaH9j3c=5@>}%W!PZ=^$Fc6~b zIFT@2Q{6VD2#dl*%CS`1H<+WE;v;xxOyf)KcA>j*{~2CHd{b0i?=#i;k(YU~Q=A38 z0~&62@57m1?{{@N_ln-S0eC-Q%>TT^-M~Kl>PfGQ{MR^UZpJ)F>-jnX`u3LzXCqbT zMlwgvsX|T!*xJ7RIC<46d}-;W2}Q4QTX%GbGHip_Z$I5^>!E;)AFkYO<%%%zO0C;v z!l-MYWx#qIU|q{+Q4gt|7<#C4#IR&7y&6rArlP57cX$?yfYOBUiRrWo&El5KmZruk zF-uHtZ~}P;x$U&4pJ?OhD4`&awFk0$#Oi!j6f>Ut@hNSF?jTPNI$d;i2B~XSy22Wi z638Rn^q@I{_0{dx|6INQ15bm0imrciaB@15E=@<%dv-an$fegz_0Wteud}sudjkj^ zYEDuYHYd-noISwpph?S|K;s9fuMLVG~sB#*}fJ1Z)1ua`s=EY2&A4~|ST zXvN!Jf6ZIk0sT!VWvhJt6$IuKjlI{_XTbc)vD04|_Oh=;sJb<^Z~ zjXL<8h7glYIIjJQkQ76huQKP!Ta(Xd2{DO;E-jiq6qi;m^XG(vATR?A4cYCw%E~Ou zJTWnq;$5@Z?#iU8NGeChF9UX$Br$MNLT6lO0K9X?_*6H(QP&;#R=(Te( zbB6OvA08>kBwF3RgkQ;D(yl%_yv!DI8jvou3jxD{wkofoN}>HOf%?#@q@>!U)b4n$ zfST2!s#k>dLG>J|1~4~9e9DAl)TC4qCYVL zt7>8B!ao@}>Zp!e`};$S@80$Lq{ToYfhCm^i^MMO>&(>he9f>EU0FSd*Z|u$FK5vp z&=--SS3g!ylOmqUCXyc=lncb9<>JOb(oK;4Ei1)W92Y=6PvZ5CU8V(Lc-Si}=<0i1 z-&bFsQO{a^)RHbnx0rm7FKO=whg>imh>oMaGHK9t#Em#4Fw7p-S4le@&$?|*fZ=mo z1^1HAxR0+^%Y4B8J234Q&wJ@YTz_0&ilkq10Cr%w>j`OufS+SgH`>AK-*~jfn||$X z=W`)C9u?vrvaQoU#D7t$&+~TOhIE_WY!jE6Va`r=Dppgh)Fw-><3$ZXPjgSBi-&(R z*dknim9L=I8#iuf{{<$^cpNF&u+gWT5^Z>J+V#AeEPcPS5>@6FjlpE!Md0hJ(aD5+e|min&wQK6b1P3S_ML?E)9qPqUow0)eLbbd>8H% z`~6EPv64+taY>t=I+E$gHc0AkoIPuaGh~jW=4#;-&;Hd?Nn_I|ecrFrS5CjQ{hR)} zY3qBw-5Jc&XI#b<39eId$^ZLn0g%k(Ty)(&ur_S%0oUz@v-h>uYk{k;<(fv5F@}_A zN-8atAR&)4GfRa%A;lY9Q$YDbbOskRhQeZbokh+ zs#VpXDCtA__KYnl8B>TE5!S*zbzI z{INkUGI;w+{H1548k{+EkO$L2dMHD?SY#6|v)F*mvaB6Gug2Zso>996SirKQK99o2 z#<}c=I9Ab<;O*fs^e{YH7}y^HXDSmSU#cbA7@2f&ILs=HvZ#iE+Gx_4gs8} z|9}=B^Yo(ZqK|n6 z!{6p*Q_@n)bOdlTQDq3f6Y+6U&V&qyV~sb-NXM|vo6Y9pnAq&>slLgUaXNQZ;DAb} z0=l49NO=f%l_t~4QZjXbHMmeU8zfr`phfa^r6chF-aUJCDW5*2=+-ts$KHu0ZnJyS zS{t9Wc7=ESYV3`7$7kbbm>Yh}ruC>Ye{;VEt76rw99A2&bh$$iUP3I0Q&+~Go}L42 zv^OwM)(kWZ`P*&q!L@;lxB5w_)FXul;gxqZof`&$rF~7AnT%Mm;JMre()Ldv?cqjs zqdKoLa~@{9CLB>^_}LP%*)r{l4cz`UK2zTj2Twe4@bl=m_Y0uutF=kd4T)t|eQv5e zR99w+UxsC+l*W-#22E>^2q)+QXs2!C_@9^evB8l(L%|;-e*jK_R{{BZR^&U64MwjB zA9WoFS$DEQ+X2YRDO14YDM(#gbYell^n${KpKoP_iP3`EEd`qjJOxV%09YTQ3Q?`^ z8v;`Xp4wtnsj=@L)l;Xk)fsp$FUW^4yuoj|&!nurLIJ%1b?*nTY_7$~kzW#|Cvhpr`8a=$JKQ z^Qqod-94Y)`ETWn7X?O*!DCC&rG0OF@#89^XXTt?@$)yuf;lUDx>x`DtItI9n0jsrYnrh+V7Uxl$8x7XJoMM-(n3dUs8SL^ZddedF z5DZ>(jGdYBdybiCn||n=xpb&ax=KaA7*3}?K?UzP0W;z4PJzlET~B|juC?c|?yv;b z!C>$5`I`AIccDRPkRZRs+OsgkP+mGgEvQ(}$-) z4O?bcwpQNgJ;_Ni0q^^CD&0V+*XAXH~3PYMM4FFF(&R@#sk+j*47x93Y+6D?;1K76VIo8yy!2?lX3>ts~mP&GKqe zOy_mRt!e4AQVf;$$h3Kl;A6qJ7Y@uQurzP^>H2h<>)Gb!{K6SqZk7k&uRHS{FHuVB zjwlt%4lx8)uBD~+tnkOvzU10TiIhZ=*7NHDwW{um+b}#Zdk*HN({jMco+K$Ku9U?a ze4#scbx*(sE02NsL}&=q%H@hIWd&C%G1SzXG=GMt4Oig6xHUh)m8w}BIyj{~_S0nF zZ1AO?ch#L^gvY2hbu{R#p&$v`vKh>pl^vh*$0X%V+#43Lz3~TX5 zjO)61L;~o2x(f%jbYLA3U-!S5UzeHYk21&kR11?A6;CbR>?co6ex*+hr1kam$jrsX zdxaqr>LXH=DRHW}(Kw=hLWpoLIyN%qG|O(6pJEz6J2uAZ>pW(iZn30vKkftHkAHmt z9}o{RfOy1aiB4iU)N}|8MJ_@oPbn?ky?cDo!qSrE%Vi)wWsz_!UoI_NG~R#(T>akx z6c?rE=t*0FBhG)BS)>6PzWJfQAs}lNp(v0>;yE>85RwsMh??WWr~R@1r_XUJD$=15 zelH8atI(lu=7Yv7{!4iK{gh&7kQep!gCY!}d>CPd&1QN9^LXA8Ki|_ngyP1I9MVt; z$;~1!K4jsY2G8k*vx|L9$%Ns)_!P>p!f%K3vOZSzOgve!b8w0Z9~H3wY_DSYU=i&% zuAgN8!0x%(G6%LHEHVFO_tiCprli zG)DV`nZw{zp3nUd+#8(~XYWx|YK?I_m6nuVi?Vg9Ttn4$g_+Wo03Pjg!ljh1W4d{j zno5wu*!Ur*z2CFf@XQ}GYt3e007Ctvw?xY`GUaXLta;%4kLco!-94~Wc^F%yLD_zd z-Mt7qtdwHu=?&QJ&CLh9yKHfB<-Z%PVOim(AF0|D9+qh{{$7ydY+%63`$Ky|r>xCy zRsv;nChpP!9}u8Y*?{J?b)bK}>fpN&p`F@yf2fQ8^jCE&r?F3#@nQSO=9-Xq2UYVg zNvwfZ^KgR+uEPy}$U6iNkzADr6R|Wz7-#ZpI7~42g9)@$m51OUB|kF%BJ&KG$c$h6 zan2Le#PD}|WUF=0OR>7`Nu4Z<*ytCk5)oVoWbO2ig59{QdN!hV$sFaff+-+R!o=U> z-S21PsMVYs(`U-kJD@|;2lCqjK@c>-;!}+C%cgaWjUaw#&Kw8N%X6$+H4b`vm1?lp zLjV~E#)}m7lok#xZtruquNSU6u^N2{|DuHOC`A5EnCfCs$SA=QGfyPsuMAGMWt&aK zrK#y9wyeMfmHR0C@jnC0CfAn~H8&O)HkQ9lP3h(P^v4_u0~v`#zd{l;DKad9IWd$F zBWhwX1{hCv?4AjUCt1X?IS?3UP|U;pS5)L*6e`Uq#fKoBPJvf0YS#un2hqc_|qG?cBMI+AhqZr{hYaJlf;Y86Tces)b z)67uCm}%PB_&60ud+dYoxN34JoQ#9nj6ii!*aTN~T+U`~ci{OWW|*<%CJ_%c-e zax6h*Z&p&ycgAIVwOl9$)?ws%eZJ20nEqft4zGMj$!V-hBS9*PLbgBJW1yHBw+{V;t*5a8QtQi!XRP95E$rB|Whc(Ed^?iaV|*&SM(?>hdD zfPodble=-XZ`(t%vJf+{jpW+Bs_SYal(YC`s(Q;BIClgTynX4%>U}O{5LW%R!xi{y_v7`_oaH3Cz!w^_=y3?4^s`vdTc#XDf<1-D zk6iz1R(4So6nRkCziKsIr4QK|kltnz@SIfj$`$>>VmFjfo}G1}+TmX(Q0EF=8Vmz} z90lg?d&=315-?%xVZFq-<-RD1U|4eb?Ts@tAwVGufP#t@7g=#;!@iO!qAS4E6g_zLP zE3#`JC}!&4=e^{4dGC3Td4KSJ;KfGZH8W}2&@VQs7A5^ATEyQBL!ZloZ}~!z(^pIU z;gBx#WIXHdMF1^)*amN5uah8-cyY1qH0f$L1h&~`4~VNZLES3(KA#0z9t zbp=t3mk?@V=C$s7pBQMj567p4j^+rdg@`m&eMo+u1 z<@;oTOpk5n7dX`c(}s*jjFr$iuy7_L5n-k?Es;*Z1R5~ci()C@xNxDZ%f4v^(=06A zu-w*S2U91A`bH}@rkEP)=j~ie(!M+j)5*fs@}Iu)5e9KZnIdkG(Dy0cyJM~|ttd+U zd%P{XWHzq@ops_$zsaStNwB#8R$jstTGt`!V44>OTbF|mo5Ul!LCG0mkkI#Cl`6VS zAtg^CM^z|;Bs$OeWI+^+zcLUxQ2nclIC-%7D((**a=@KEHrN*08^rg)OJ_$Z;>vTbo3&^7IS^fr7;bg4= z7=eMmNnW$QAR6xsKqXQ>NyXH4Rrz%BNzjU{kTEp-R2{L9%}hY5hSHtyqN~>zDBOHc zrrODcrUsLlD+>a0D8aqXbe7t0U;*k!YIHHw#Qo{v|HdVeg}Bxb>$PZ2~9AHwqL8R8OZTS8}=BRm^Ma zxmn*^pFGGAY@tl0b^7I1avv-wiBLl}nGUTQ%tu~T9`n+S2$p`kIy5RH1B*fpkr?zm zDs**k7Ewr4ObsS1nn{mno?ozEMa8_80RyYz8&;BF67<=LT@W`=r65O~H5v|n8J~%& z_J;^0y*b+k;*@-%Ij{MyA0eE7J>-^w&bWbXIiHJ&2K{#-`&DRW{Fes}#xMQI(RBlH zWH2wpW*srx-hVLrM{MTX)b6r#=WS-2?cBL5p}q_&&!TCwG`cE%^iDw>_J_JqB4g)d z5{+vbU$fIRr)eyv6+b%DPPC5@86t5Jv|%$E8g;0L9s`Ezud}R8Hy-#Mv_;y)1<(8<`CA0{_ag zng3N!EQs5u=s}8Wac+%1f-H&~w%}gAhu=e0hCM7pZscX4jRo9?BceZUU{cQ|)Z}lx z^gkes<}JF@aOsxFFLVNQaUOM&u~s+XH^c@7&NeADXD(aHJ-{WMz?MZvst_N)5`TOQ z82naC^L*&kb`oZO()}YpAT)Uzx&tbKv#vVdqAEMI0EW{x9@14eVxxwQ%O3Q1c- z5G|r&@9ce`ujP*sB0Ha&m7J!b5aF;^s+u1f7-9S+aa6`E^wcAeG<7cRB2$+w6DR6e ze1wuu+L+!yG>m%hR!sWWAjhA8YC&^vp1PrzkRP8HHkrv^>|Y)%AFwGt=?5#R+JdcH z=Y%i}&rAT*x`X9HF&!6hLow!gk1fWrEj$!$Z9PZG(M_m}p$^4)c&IAr$bg#$ED!Rc z@)ZB@IT6@&w2)wG$9{s_Z=r=Apttg+*KKYANwH7IA~^hi6fY?0)fi@Q3u*o}#g^^x zPng5TT+JlOYOi&a591|?%h1^`v_5m59`(`c#%vojzlV{G%Gy;vKit$t(RMl#I z*KXQ6Z~^7=$e9{SV$RQ6HXiyQQ~cPcjqiQ=ylh`f213(UjC=pLmZ9r!`LZ>R0}cmz ztEd7DrK|9EKsv+#J3fCIAPo60M&2Ipz;pZSZ9}lPTC=Yl+oUOEYkXsf@8;zNIF-ll zzlF&h`y7e`zCDBf=tJp#291jQ8_@~zuaeK?(h7Xah!zSF+wX=K z_*^hADRFXu4jch+!Uv#Ac=;~>7fr=pSOULh@zqSg-e;mg1v2Yib)3l_gXP8_@4`4M+TSD z14z@4gJ|n^`q{pqd8X0t?h}|`N8_mrxs~e!Eu`xn=D@ijY%{Rv0h||V&^frX#b?Jp zI%@9$ihFLB^v>Z_gCWD}H0Q+>He{coh_cA#==RI2$>*4RLFiMLyyM-GoqaOdu|5u~ zV`y%1O>A{p#M!uJMTej|R-JpiLjkf{SUn;iemJvEkcGNrTr1gG7BSs6(PhM!ZUcG^ zRP~?8%6E&eZ<7KbN34sH$>XB?)xiL|7HGi0xE%-q#t)3&4nqKRm5}CjEO@}CrvJHO zUy2mq$G0BQ$?b_`{Q)k!$fWcu%GMp=(PC@#@*_1HBR1BBBRk>}6CnK7PWiAlyynyA zJ+n#dYuh5vERfXN?x*H0TNd!-S^h4~drqiBkp)A3nu=$zfy#~axOoI7 zo}&Fo!qHoNWt?Z4<5wb>vP);g!4li~WDDz$>Vh$0v_F!h9A)HvI-7j}Rlb;g3ihtRzr(swg4EFBWtnl$k3@;KZo+p)A3oB!q2I`KtV_irk~1CiGN@ ze8nujsUn(6drL{QGbvN1kD{=$*N2eUDl?Qt(@+U+z-p88sp-GDV3(H2cO!wCNbUbm z%_V{9;SuAL#v=&F9Kbh%JQR_$Lgz)S37Z30Ubkd(0}4cAy084)63E5xxc@Tsd&i^BLB>w~;hS3*U>rnqBkeD7-h%*c`Zjkup zf*=8g5-AU-4P*Bxd|YV)4Q40+|JD;8EDSpuNQ)GZ)5Ej*QMrbBxhYuwB<&~7raz+p zEaysedX{SI!GakD@C)hWlS{VR9;G_+YC0SKrzwN~dX=_udbSG8^gDP4WBJE7t&Y`| zl+N*3&pA_KC{imE=z_IIoE`qm?Em=z)lN(2Pp$+|60z=BhdFEvT&B zFl8r#B74j8hG$iv1hBw0240V>F3d?&hjP}XIq6(Taaqf6Sd)3k6|GmXB36vse#CLha^oUV zfP;6U1jnGr%4%*6o|cN^=nav@xC}Wb#>%t$yZ{+JL$ z%-kN^Ib#~7W@1M3AZN+wK`dyc*E;I2CY4~Sc)DT5xg2f)nf6^vGF%DlUU8k1I4aoavB|J6n5bojg48fUZqg;Y*2_$ zue=Xz+OT_J5!a%u(biPTAVUV9RF1K6Y7jZ|s4 zeQNCU)~_j-rb{N9wIT>7@18ZSpy+!eDOI4g%Uu^%70!yZpLIqbD?GhZS zPTi2+J)>h|q%5_%cv>M~r9Ba#48SjCy(%r~M{V}6zj1y`-C)yCzOX#k4i46RC>l6jKT1Ql+v^( z-T(YN|0RDj-^*uD$HRXNUd!NpK5l^nY+QK_eQ<@a2LQAc&hLUi{|QIQ82lD_ghYSQ zIPu5_j^If-L~tQ7@ZT;M@<9M>r6idZ`uf)z_MpcUwT{I97F5iQGERn}`-mm~CI&$Z z2C^cUIMRmm?$E0Sg1lSM-@@M@N9SF8;OBbQWT#atcF+otnxb{ZTvl^lJq+0!zaHJ&y==Qug9%jnf# zw8|Fw;J)0OK)Q`o>U#<6Wma>iV+Il>IV+o8aV#BAdjECZc+b^1syy`k*0-WH^Q)+l zp*nS8!CY;Ur{qe?z<#RdP5FqTh`O(8cKC%SPjG9zvSu!)%9p^mdKX5))ev z+jVj)N~!@5UAx~;yh!U!V5UfM3Aou3eHYzn0|9}%HLZ#Cjf-=}y46!S7- zL`LxEf97}D?n{=Pt}*-!`P1IC-NG8UiSIbL_!*=UXC<}kZjpoD_b2s6T-!by+TPj7 z-Y1#I!O=qT!4|vLq%4~OzeeOzyyOMHS=*Qm@Z)XN6Sk=X`E<);$`Fc(i&Z+W2G7y! zeMMbG7X*dt4}je7+W{atLd~kJmO~M9Iiuwiak@*x@4u_W$#|E^rxwhV>fQJ0aAk9g z>nzs^Phwj-=IJha@+-8(^P;OscGxVzBmOH_eqvGMpMx2UcbZxj%iDJ>ajVj` zdG+XweofG9f0;NxZ%gO6@AVxEj2IO-5*yv zNk{`nkbtw4(S%l(RSN7^C$uw(EM)U?k&d>mW_MRl7Y{ct=l2(y>9q8sq>tF_!%si5 zI!%mFntD>yYiiWut1o%oCQsSYvu4horbUxBb*-AUt8Lk|ZGG$J?Q2{(abxGonLAsT zPTkt8E5hck5SYOu)~+t#nZh;IE!`k8hi`g%I)9r(VgZX#>#>Bw3Z{uJ%K|b>*d`x+ zR!~{f7@#uEBekeCXz8_#(yHc*Dcd4)%i1p=y?XZU;mfCQvo{}o=-A<)GEp-`YVN_5 zjg~QT@d_fHszEbj7KW@ejhcHe!DOax*zCIxx8%Ip(NfjZJb}y3#DHPWLCcr}sxb#m z?;Oy*bI{i2fU?a&nv}(p?*e5hldzEx_0sEWpe`)BQrx&kD)p5nAc9E@0Ia zskMIj2D8qHtv>s%VAqag|J4isewX{9pe)b4u!no)mW_8`D8iZlobA}0B*lX=lXst9 zVR%d;xd%k>FhGC6PVCkIwi;pM4W=E0V=e7KBxE`h|q(n;!uPt`=oX%elOdn z#-fEj+tqw_t}tui6h2iF{mC%#REhPW79+)}X5V&hcehjXd6DNb!$5EA+ixe2w-hQ) z-FWv0)OBAn6JYMJuPl|<5D%J}=Ov*beyZennfD|WPZYF-UqOEUGN=>bZuPqFwsPyW zsO+^{uid)ixf$-i_hxIL!cibE?0kG##WP%#mtoy1Nd|_RFld1MZLi^JG16Od=~&rg zAae@Pb!OY7*rw=zM)3r78$^vVvXNaMO*?)J(K@4I>O1vlT# zmipPe~s{9E2GJ2Evd{rvNw?VtIl%+5R5 X!g*JhQ#fo5&_-aWWh=e02AU55YNPbRi)+qN|m+qUgwGI28d`)}=5?WgTix9+*;-saxm%KzX1`vIf?WzzqXDgXnJ{14^fBggwc z(*NUd0IC2dfa!ns<3A$-$OCKuRsie&A^-sCznsN?kvqU1U;=RcPhkLP{-?MC-2SU_ z0yzFx&kA4yfc^u^f8hAf`2M%{KQa4%_5Z)w0RT}oDdqoXDgT=S0mjY%WtB|%)n_ir7W?W_+Y_D#KddL>QE(& zw5`rjqdYfL2Oda3oBl}8Dtlj$K;$ty-6Q}88}BWHMVg2meMD{_J}DrIM?^cd_G_Z%>dMUOKuavUwP6bWnce=$v@pt~?}ya~lbiE5>`%b;0t zbna09biI99;!2GdWU2H`p6EK0z$fHb{ytD{mh;mBueows!Cte)=0O%YPPbZKGX;9F z)LaM26Yv{Bq4WqBa;kQWwLNKU;*Cn2aBpZ6zeY{_G{-H2XND7>!e9>|hE@I=CtFqpGo?2%j=rym zS5Lsp>Gh)&UiIxY(JmkAY1t*=)^3t3@dhP@`H*ku%epYu$GPh?hec!66$#TH>vn~m ziSyFVAU%4KPvp-JOlyNkAEAEGUC^_Y+;&UEU+%9YrPyFgS~tK@xS@wa7Gd+!7Ka`o ziBtT60s(yRLdGax{(=vOq6%j=b9WWL)rCqK#=C(T^m0s8dO0pu^MFwPYI7Thum(*A zEe36h9Q02(tAvL?Cw9YUdN?Cdff9nq!4)BDVAIjG=?0t*D(Z!i#xw1(A{R z+O%0e{^&!?KbCRXNP@cVs7UBCv$xVE9P059)fHI9DKM^$oW04k{c~hu3cM&9|Np7C%3V0|5oY{UW20O zG;;n4>dhIiAD#?A0~g<-p+1age`Wzl8-_IeOH-@&2qGVj0xU#!I=A+sI;NapUoRT8V zWCM64V}?AVk#v8f(5QAmI6Uzv5vT6-#jpeqCtPS~PIM8Y7Q77W{L=$RR19m>hzz1Q zsu~9CyQ}4Qzm|6%ghRG&E8Sfok#fesxi~WqPS0c#u9@gdZj4EUDN2>iwooO;4mAv- zy*P^o^UmZ?E1EU*-}C;-Un+&7eF=ri9lzSxo-0*MDDS3-7Dg#oM(5HOu5vrE=m7rR zgjr!7%6vHcJdb+q>H-C{ZgB_nlTX@NalbUT zcw0>_uB@V>o{5>@^}7ERJ+SY5=NiaZ&6 zX9)h$D8nMZ8e4G*C{9;uRobVux{=HJMm8X0$OWfb`a+l8jcRie@8=>juU_Edhy8o~ ziF+dagkgJdb?LFxhP}3b0q1a#N!twRsrIw*Up3$FBQn_cYnJcANjlN&13EZ%JV9T^2#9Mp_Ytaf%N&g(sVc!B>>P(*PK2T+3mjQeXaFhcw4aOs9-|ZmTVX=RQILNEwi&kqWpH?m5285x|3<;$E zXW+r&diBQANR(jaEnHl(iBE9s)?uP6M89Atwd?c61O<;!y9~sJsE@S^tysSGO&5z* zr!hZG7I3s^JUx<3#+D`D=v^!<-Ab|RFjapx4kdr?>xNixuk}*kdzKcI#^uYU?J1}g z#SiE9HbLY3+tQmZHCo*<``c1m>m=hZ{Bk14aXP1r&3RFFw2hPaahC2YrS3 zdzzfAu$=}5h8CJeL60^bf~rb$G*BE=2d)=A(+MOy(D;bP!-{j!&Iyg<@A1`N{7R9O zEt~H5vU}`(?4&Y}O2H|<#gRemq`J!}4g~K?SbjO{n-QGjXLC4;l7}ce$DbvY`AV_} zLPG>S3zr2Q03M;EWrchCY0L%`-_s|BRH~8)kyM0f#pv=m1nCgORHQ`{7h|h+s}##G z19cPrB3$AugQE}?Lg_)G1QpVW%wj}>NBSmW6lELF(cye24U=Awmx>FKa-pD+f1p2! zvsk4;1cj37z#LXny@@a&OM6U9>H$rp(nh0<9mb?_%0$Kq;B`}>IYio=!UURmHW|9*Foaap^a(R+3c{#U}S-jT*q?_ zz{6*MO__yfmV!tuz){c$;OT6D%!a`(?R96a0dPbq3ns@BB zlK7a;DXiPhy?;n!x_xW^W!%{7BJYQ!fQKe_Ar}c0zFZI9UddBb##1UBzc=gLm11SF zqIP|`HpdlDV~}TR6>YPbQml#GgK^uuhY_1;jp0TfOGx$&x z5=BYe@%K0n)nMZLIz8>t%lw%y-279{u^eo^Ynzv{-0wn!6~hEG6>h6?vIy3|5$Tt> zCkM;25q5xBRH!mR#Cb&rxVy!Pud2kVst z#+XGVvi+K5<1n^yHGb>Wt_&BbjMdXVD{e>CIE`C-jZ?4VoekfrKpFjDUxLXZm#GBUZnyoLv%NQYNQ$Rxj4%dYPB!K%2Ei6eh)7QpVIy7zMl@y z#uX3#;(zn>geS9Zz9qdttc>Zzq%jca$Uz(^vEY@JS8iv?kFu_k(8z<(=lDM3&wWW_9#fe2BL^YliMLM@v zF=HmQLh8V{+~B1a;i|(M7kCqdg+YJ}G^l;~5UwDT9=YKQ3iC&UwZxz$dAeF)Mrl`I z*RCVl;D&Sd%$V3I2jkzge=n~fv}Vu8arprrJTjSvGT zQ3& zQknp`WI|;_#r>a?o9xpT7DEEI1O1Xy?eOb;1lu_K%|dK7nIl-mwuftwI;C0#QY377 zK5s!G`$W>kvM6`I8W+5uvD?)t|9Ka)&}~5qrvmv-QR@*x-Us%{H8V)VL z@Rop%x5Gpbh`ZDclg5w6PMK*V0GMDM1EcJevJ)vv)1;g{^8s=Ub|;*5o@I8&m=c_C zNY*d1m?<7jLMSL6b?2Wv2$hG4-w*O6Gct)n{+rW6G2h?)XxldbPFxY9Sn8T6AM%F+7W5orqAz;f4O8c^1z*gr_+rk!(CVvH`EH7^y~0p+%$xhvCy5Xb$~BffK; zaSdX|9Dhz;7I>r63ZHRx^qA?6(j!9?Ye*Jege;a#^Gx%&Hcq2)f>`5drK+uQcuxXt zsAyf9Bw}^uc3+eXi=P5}b~UF^G80WJH#ReA=08ARoIBlgNgd#dlPQ z_jG-?OD|*h1aRn#n^Ix(8V12eSpWOz2P77C{pdfshLR(9?FLr`fEIw{zMc^;$7J>D z7kic;rzEF1YTkDJorO}&TAeXjC9aVSWvq(*YFWi9oHxC|mMqeiOfShj8#=L$1@C-YYsMuG(*(v$ssmd%eR6aJFrOO(ku(a*zzSyN=BYGfqeq}f zTL=z$e5oi823~kQROIop7y+|&20g^xzg)R$B%8CqCivE=c~C5$l12$Akk>T4wk71- zt(6vfSAN8INu<5+VK7lZe57zJ>+;Q&e>tZAGLAq;q_w_85^`&=kui9G>vEW5U%re$ zx~`xtqt9kIttWJ3GHi0FczM3$UG zdyfI{*ek?%JE6L@Btvn~$4GrAKfyYJsRujwPmeou29gm|bMig@8(J@G+1Ccd0=`FJ zr}5DcyI9usxFj*bW_zeSZqZ`|&f;*wo8K=oU)l1~SS%Y(Son)Nc_Y8rD;?7K2Dogw zs|`tspw17M6sU2R!gVpIF7laWG()c}=SSMzd5o1!nSZOjT2Ci}K9F-W=l93?%K6K@ z{d#=W84n;Qm67IJInD6L{;X0bn8Z=O#y}jA+*ak4jS>RrEQD>VcUO-!p#8VBbaOl1 zYb=XPdV>+SJ6h+A?YJAmf|nfy?+&_?18pEtXz|xL)Mb!>f8rqC=toiP#8oHkL|?nJ zBq={2pZ#w?m9L6K$_bHo;&bCrkfs8x~ww!LqSO$d1)SAE5~5lePBv{<>cy)J4r zj8*=rrU&LAu~B(w-vu^qvK?H2zkdug9{*_M0-P&lk|LD_b%c+2v)Zg{WCgpSC_yF4R1_U{XZ6YHi6Ll* z2CewG6+0YPC_OgMb*Afw;^Ou2BOCLbGQ>Q`TkWSWdop{=z4mlL9P&*Zw>GOnuXDL? z9Xh4TdV{~F9f)xkN3!CTW0We+IuCph+plQd+jGy6UEIV28(A(z=Uf=Xkj#70*{)A!5R&(6COJcg zYtNvFbm;90|C!ZFs9A^{v~YQbjH7z>Hm;dq&^p>X?{9Y$a4k(V$-U6fcoUv5VsXa%LPs~|1c};>|1r+LRc&t zGKNzKD~+Pbm&&7jd;@N9rM2}oDO!SJB^uI49K2(!1S24b;5!cHlfn0|{MYC46lxqa zd47*W@WY0($-DV+R>YCT*b~Y_6;}>Lr@o01_SoiZ^-RJTMZbHsN-nlBB&n*@xhPH8=CXewZ9 z+bLC!g9A{B{U!2L&*EHVHV9;9OmsYoai@?q6aIbLlpX`?fvnZMueWUGON~F4M)A=r zbnzx~lXy$#KlEqWo^$FJXj8zVVUJ&QZuZoTValI0p^<5zMS04ckn9aRy)*s}PJC-G@e7ZC6e#vZ@JP13QCG%&4&L7GLY z0gD%?bWw6E%M{Uk_nOIRw<@is+qb5My&vw;j1*9yWPhth&08(91(XwjIRUC9<3u>I z=Laai?h)=ps82`8PnQY{E@pI!{Fddagdkf&Dx6a?-&ysA#Wzs0D>qEr>JX;SnaSpi zPDBu^;Rz133=5Mk)PAvzN1e5(&Nj|2_`s+0vurkDhU(|LY`KRP!Qf|Tm(U2Hm+2c3 z_K+EnQ;3+f=}K?S&dEPnCK$+|T7%(?kVVfZPGYmAB9xnlQ}QmZ zduR6IYu^vnxQtaTmsc)$wjk%8K5=)}dZNQ(+iJ2XrF}=Y*^Uc)_qAXsZs+mqPXOkR z823kNrh*HneVNuyc&238kKfM8PZ+1|g@P6!l*Sblqopun$_Le7ztc#Qh-h!hT{JaD zhtp7@Gsz+9)S>d(P*k@!>hs}YYL1M&0jNcC!UT1Co6anP+x4x--DW{t!KtlkI^(HX zUFhng1dE(%QFN%`Jo?5B%(%N+1N@q8{zdrUVHP5Kzv6}#i=k+kbtjdmNen@-@lTRu zn1WE&#OWQcqhiYe>$ACmC$vT)YX1J1b_l0^xuwoT2dIfk3)8w@r&0M-HPwUsZfc>G zl7smfn}2w8GL7KE!HdSv|8cW3CjW$1x2!rBp;eF9hz{;Rhp}(qOi^GQ`C7;D-XTX; zoFHnr+2dvtqsI7SCi}-D$e?Q7Glhk#@LhH9b^#~-?KBdWE-a#ual*^==&9DaTNsGi zT!!YPwaHwe4{UM0eCIDN;zb^M9IeYHH>&g~)f{JOn+R=qL{+9lMOdz(3q*lDKBi49 zao+72-Fm@UHRcOLx7^7=0>g_aHmzPI>2U4efjg9JP*7%0&l} ze~ppid>{;Ka^Uvi=A$;n8|}D3F4dy@5&NX`m2$?FRS;bA$Rf(Tb%TtjcK*1ppYL^bD4lJ;J(>6yN5tkKM&qH`tO0YO#7*prb4rnC-u))vmZ8V93c*6V~O=M z%A>kaS}0)~u##K@@gQ~X%f++CJB`ZD5%&sFA{W4d@#Q`f>>mjT%jbW^8rhn^O8my_ zqNNDMT`!ctgF1lA=3H}STgz%z$C@~f-9lBy$HKWJ;^uTfKm#--;-@~}rMp<&C1IFj zj$avzk?!hzP=jAmSV&%hjAIjrq=Xl7Y+h}mPyn40vzl;&muQ$F(71D}!R*T{g<9L; z0>4dTtP?oEY|f53=xb)*v%qjk8oTxuCsYyp%^MzeSBj)%)Ttu`DA&$OX>$g6J?S8h zsh+Hqc2q1&^1dw&} z3y^8Kg7pDaK8me89`(tVRjJ%z$mN!T}7n8~*K7Hz9yc>Uc~g}Bed zn=>P48yAbEAre;Z2LIp&N$W{={~*rtZEbw4qs+i(!$X@TT;e6<-kWe&o?)AF6B#vZCs>K(Ip`&eBiTP!wqfk=D9t z-=W*RBMd;4M>`zcbI4%jAIc#%FF-l5?uC#8f(JjsPGB^x%j(EgC5 z5m%827FHCc3PB%tGrO2VA_K97mq_z&*?Kh@!$RIw&aU>)PFG<$9)aC#kHs-xGDoro6|DG6kA{ck@Mvl(j69e zK9MIKVZS8iRWkAuL_){jDX5cB{0X;<{=2lTdF>2Xk^U&#w{dT^7UE%3y`Y|iQY>T@}nJaNey`78ss6w%X zJ@%;wPG-R%HZshIVLs#ly#90MRPd!w78*Ka%RL1a}q^P}RP{G3{OdRy=cXKyh!bl+c_rxDN9w}r%u1+iwlO8dv z5Ou^uaComyt`tFe&H)g`!$og7g7$35=NIRCo*0n z7EcNh%@RF!zDVdCC^?`h9f!rok9|;NV1+&fJZTeUrcWs)a$HzZ5hAzKovsYm{aB89s4%>`^4ZPxoLV(v z9tpMN?Gk1+{vM5F%CdB-Y2gR7(92hTxmlf~AH{mfDBk$D5I+1wd-{YG8w|Hdu1yKN{W?UZ{6X=<>rub{S+Wp51+__KsVFNXqOzUrbVcY- zR6nv*oF=~U{E}^GF{C=QQ6ky7L^w^v)i7od84CF|tGz5-p&Ef0nN{-B)8V)?`%|jk zwHHf7DipmOdH?1(4F8EDzsS8+gt{a(i9qRScOx6S2N)((v0G)|u)ph(b-d549(@Rd zm(YpvA+ovWuh&Tu%I&yjqAYpb>vZbfD;DR2RO`+u{JLgPnP@isYR7Pkv@r`9fNl}D zcY>AKio$OJ5Gkv`*VJoO{=O*h@B9aDi?t6#9sNvO3LG4|fq6nZ zO+8LTO3@afF+HOUr|wXxR3T~NXHDW{JH_ltBK?v9LljuBd^~s9t|>nW2DS&Cr7Du zyw|+P`|9H>g1GrPD|h~6?jjvwA64VfBf+&6#7VoKa1@TcAL5D7idbW(L>7?Lmxjo<3i&fG#d&h3_1FGNS3X_=LJi7|?{`_k(i~MbTct1Qlf@@k6d--FvR{|>i z$8_u#PJM08j^E|k(h)NkJL;xB0x74yoIw@h-K3?=M1>GFjASU4@RL!P+Fa!@-f%=2 zD)ad$#PhN7o;mgHApJB6Vci9cfWj3Ans$Ukg=`fI0OuX zIfdwlLugDoE)9LQdYyOWld~mV&*GeOV^8_471cHKpIb1Nc@;&PBcShqCIh^Q@&eKr z!Xv6?v+XmeW=mf<^`<|#kMhnBi8BjI4JjYCQb#DIrqz=IqfBVlEf(wi-5i0_b&Dn_ zE#F))6-XhC^A2eXR%Y?v)vYjjr+m1Z9xcCbYespx#Ro&F%5dwcR_DMSXmk@6D~Sd% zJmXXS2T03pD!8Hw`=peo!F;S3;|ruQb2(#WYK#AJ4c{v04G!g%@QWd-biFLSO3{gQ z^1>H1PTqNWWQnbic&}DRLo$=3SMsNF5a=b7Qig0u*>5@0edD$K@_3HXv}9SK8=dY2H%vu)na|3si7Vfw#)9l)N5U=c) z4C6Kt@7jj)cV&C+b5B_9y^d&x? zCy@gcyx(pauBK6nnR8vj)EBuG*xLmV9RFHbH3^S0&aF6w8jSjw2+`ok|$svMoCk~|(! z5|m+o~=@&iih zDhi`B;VZny6;^q3e7S##81&u<4xJe3%fKYgr6)WFNLPa{jpBvGktjjx(31TTDONT zBB?>J{NtcHRqKzuCQFe>MikqPo7kd0!9qxZC*3EA&u8-5{Vcuev$}M#{-Osz1v0px zM^8xjhfo!wU&nGZB7D7vGa_&@KR_cI{*L&I>{3aG5PTLZsYRgdJ{{w`F`A7KY198E ztqke-g@P1(Bveu_v=}5{100A6v4R3n)9S4R9cS0V! z*_`6zUO44VlUO`BE#?09uvMCfX6>LMyiB`aDSw&iFrJ0_0$|XM3SJXU&bj|w2^6_% zG2{|e?u8=I4B?qjO5kWMtLDU>!TMXO_f?6hn5&Vl3$9crx-L>G9`Ww79w3Ce?3)AK zhVpW2scW2uO?9e%o8hAwO76g$OCzeU1rcL47O}75L4n*I%z-2C^0(XnCn*HhZ{Er^ zQ#M$1Z*GE=ePj@g4au%CUZCMVP9mM*Nf?&WD%J@RJf-$huaXQTHvb`vC1q^shILku zW~UO{7uv7~3yqp;O02F570TIBK@m7B30}(FcPsiISaxfoF_-02Gwzl=dwMp9p<|CS zM*4?>H4r=Bd~rH24p%NkxJJ`hmY9Ghz%AnO#nuk~F>a2?ES-re&M$%i6A2*_Ri{aS zBb&j~ixUfo7NhvZX<3pDj+Tr-@~mTlO3G`_zHMixkIez!cGLwyt*1)(tVffaN$(>i z89hFwPAr$Gst+n;U$y zG0T~W)l|_0*iaO>%tf{G6kgGU@@WMTokuDExm`Mb0iF-Hq`@{O|3Ntl>WM%u=dt^coGy5F6=p#06(fM zcokL)M}jrn9DdFBWbH~)>`u^qtEbGgtSIC~pq9SK$jwHB6$tFlt! zx_|@{w1};}L4Em4=)79A)R5SGM+p>&aF1CCxRP}|hMUYsSG@s>O$s;!v8Gq!QFymK zrN|Bi@~E#*b`D1yK9y}+wYG+j*Q1j;{guTp?9OP#IW^xusF^FiHc+h09!>d!uUvKL` zZzL+fL-y`qOHMKZ4xOs81Vt6_&mxZa!XfWaXxR9oM@(rfF+E4`#B0 z8C2os0+2VfpO7)(|0KmVgMQQ?<51erhzBfP4r$@}Or^7Sdj&;h?G9D~$KJcS{Ci?q z?L^f%O4?1f=s!|9PB%X+hLCeOK6?del3ovzHU*DWW4e{njPR&Z16XpvSB&uuW`3+m9bltkSAA{~bBfdUgwIpluLf zqN!1vP)rG>O*6w5<(st854hZKj-iY5ZfcuNF6XiTKu03npOQMXL8?d=QZ)7%U_jDB zRU`F6BhqZd*zu9?WNk}<20vmIPvdy}xxw4C5(Eb5a*Ryx#-On<1>tE1>eM3m~7W2n>giz3s-5n^6YMjb7HB8BWj&b?M7vP55cl=d7r%MjE4R=A+Re`sg zDd~ioe1H9DKOOYnN=(|UrX<2crrU=XV_9`!ghn~CP`7Qq)du}s*X9xJsDD@Oye-;R zxd&A-qf*~^>kA6Qz;yj#_cyXZOk5|sHAz(RCOqNO5S7E63AyM73xpPII5-hv3d zQ~}Jdj3D?}$bQI_pu`9hEU~8S?Z&1-PEkWh4@qa?*-_y-OUmRh=dgqneI`)D0z&3J z+6TThE{Xssde2!ySsmEg%33;pEw@wRUkXmJrWAh@Rtr)E%^yF4QI~6x zoU3R{~9cIH{|I{CDOxm8yz1^^{GP;3{KF9SWY^ zY7GA>2UbV=U~bu z2zZsl0?Sr9IDg+h%hh4vy@f4L;7!@16ty|+D-#A69~f!b7aK`@Ag8~OV=qST&0chr zg_Ts61gZ83;bR13cxU&pEGF3Eyv7ySN9Ok*Zy3QG}}w+OM`4NG3l$QOm}zAX(g zQ$epoFB!lgE>?{&GO86rgbXM&05QDN-3N;9f%uJ zmdmXQ__qL@Nl^OzaPn|aB#LUQg&pV(_zsLqC8dZKn7{WYlX*E-MvFk9i2mv~Bm%$1h3$hi|c(dM$lj5o%J*lumRYJ1zKNLiVT3Z+gECtRi;vh^{;G}>zu5nJ=&Mvo?rK62YI%~8Jnj0cN-UZ#idT5RU>NraVFNkA6tSv2og$=n zki?0_6uZKTOL2g+`cV)<*82X13x^dXgR8*(;)V*xs z>Zhu4K8X2t48C+w;jw`aUl;(0MxHPmIG{*nmy%{yQB@^G8Z&E=j64n_-2mNpk-qu< z&@~XE1fxX7`NrpA6~vFMq`;Yh2(k4J_ZBFCKjJhKA(oe!E*feRqYs~p$1tdIEhP|O z6ogqtiXBd?iXBa+5vMU6D1)5=Yh4_7wG(I?FCwXOu1BVlEH2~-04qMLKx(jE-o&Jw zO?)xgt(CQI&(9x<3Xk(*m70^|WT-x>eE1E|&I1Cww!@}U=ef4)FwU}qMpR(=zQSH& z>PM629zun-hrm%1Ibnt|k0lN6j50*ydFm+ zQ^yM~F4;r?F8{p<6e13GKnQ_x@36LA8}SN!Qzx_ z9O<1%1~13gXXOW+IY-jfX{ZIs>-wY** zP?kv*xfbL63p$(4!KOy@C;yQ+7R~SZaexFx z4@pHU=vq1*4y%_GpLO9|8eM}Q*VVXy%h?E+3CFv$(5ul@D?9m@o|~&GN#vA^U2$m) zvk*M9W!Mb@w*kFOWWLia32N#l6Bj1kp!vs6^LXG|6Tv^x0$5l^1!?FaT2GZ^2Cyk2 zQ7(xInmHA+e=E{3HMdCZXUJs1rFV$3^{y9q_k%l7b1d2{Uz)ekfFgRS-Y}=W_qj<& z>)CU7utC(~FiZ})pT0gtqlJeC%38fl{mCC?<+^=6I;lJ=(Tn=*5$Ijkc3QISPEJh8 zEM|uDlxn?jREp(#eP;i-JQhljF6%LAnrB8&e@@@TNLM1N?nn53R=<%u-B@8T)X3c= z5I{ZdyZKZ9i=TGG*fkJww&^c&fAv~3_cE5g#Lj~9DNOy*GuEsu3>I+~VLJ%b%i|AB z^+g=LXSVKtn_b5n{(bZX^Cb%46&3|3&EVN&@8&pLS{Qi0yN51pIl~auw+&K4^MFOW z4~u4MQ^uy&A-U0Rgpryl)jK*Yc2aCUA_LLa=}naw7YD#QA-5co1=1FZW1OWxv^?Hi(^EB@`+J=GkJN(44{1I%bD`_QY1&`@uAU;<^H|ArOGJeAH7IQJm}GHLI~c&h5&|&K z7z_zVSSZ_~F))?R$6)-Oy+rOHs?g5PVYzG)dVUtW+<#-pSPWW=(d78w#Sl+;BSYiq zyYF?uw9X?qI{jbf1Oa@DwTVFH??fzIeW9>aIn5=pYr;jT+hFs)urqcP)ZC*=~*J z`)H_8<>L5!dM+QY!QW+o@#eu^##GcHVaWTgr7}@5X}r8CYwW0>5mi^%>$#FNoe6`H z#dGR-FV{mbLv0Pb#*4Rw>p?)Y9NEHfjcg8buY~)jYC)HBuYNY0duJCR(+K1$OUhFj zeH==g=)+n}4?*0y;_l6qpZX!vLUN)u)DP6)VCA9kfv*|)9CdikIp!KD7694(zTtE! z|K6rkHB#3!7~iW|X5L@xoZwwg7I{f{L%`8oe1!nOHj75#1wQwY6v&Lcj z86Hpto`Px|OZWuk>EcBVhI1oI$l3n^rcnKmR(F+DVPXK$Q?>gd7ti^wz8SH(L8-h3elBvX6501R*Vb-!l=T zGX&S6R6!~&ZD0_CLF#FuOD?@GwKc&O-h!-EvaHzdqX(f<6)`-Nt8%l~L>687z_-o) zXMLNx4Y|5Iqh`DFCF@GtXd7rSP)LhOw{e(Gk$4T5nC5xR>f%Y4W}9JJznyrZH>ver z9epP_YP#aQvHo0+SFN7i3x1<4?uhfSvV2pro8Ac;ogP^)jT~;ycq&38zWdv9PxW3` zQh;+Bhf)DSWEbCUiA!rn;J!h@)me(~UeRn`ysH!9i2P?+yctj)^kX^NPE#X4% zNFWcvb~Rp`P6tj=a4&hi>MDwOR(`D#<-#dL$4fEv3^kDj>55V#g-Br6CDl|H2|qqO ztH<~}F5GM$1YhlQvK!MzK3YEk4oi)vbr+uSr#UsXQ86Ge3Vi09c?Dutgrja@EwStv zkBrRASyV~`>G|hlI9M4D(%s9Ku?PdV0K>e?XLX4#hAmS?D+NIe;n^Ram{?znVU z^nRi>3{BRV?KDyiUtw=JD;b~TlA+*IG__1>F_xt$DRx#&8^I~+$C=jOJA!8Zw>0f% z?7EjL%gF!a3Z>habESukFiaF(GS3HZ*&Px=M$jeww_fj(q&_fLS{n$LJeZR`LhxhD zWKKS4k%FEA)lwWU6+PUvi1M1_utBBoh+{t0>a z26ApIRq+BS*A{7v6-i49!NsGA2g{fEv)i-{BXUrRWz$w~R0Mg}n65+VM=59`^3wVr z81!538-hfzW3eH$eDfjmv9+iC5`#@#*m$9oQ5Ag!5A6xwH6awFgd~{Y6?n9!ABcF0RwJqeg1ruA^~u+O{d+d0*xa z2WBd-CLlDopbVDm!;BWH#`X zM~uKX7^%<>PzQSl2E&2Y?9s!c&FavwpnNxe<#?lbMNt)vz&ac?0KZAfiyxg&2$y{P z34?uTCe#yvwSY0-_EL>_v%%TVt`po;#mo*@P;3$-Zo1FN>iq}f>WX(8BD zEh_<@QbS?@MxlYgaF}TW2SZsEgf1(g64D6R=dB6nGp+e>uN!o1 zY;*UJeYnNGBd7v1o@HL`gC6V(d-bPU?FDYry3Xo4HlnwQ@j7c_p&&*~k_2l>@k(Rh z3(w7VIY`S zI1qu0jzb~0b5VfOzBj8VlOFc!@JRT{v*;msp^8u}(8G4E(Q6wsEmB|xvmI|j3}Elv zYzO}hWFm01aqddCZLeDzXys-A5lC9}>D9B&mLBCFNwW3Phc5v0%{y;OkeLLCqtm#z z6M4t3kBGNy;v@{>b$b05GtB=QOPqe@vmV|fYsAUN5Y$Bm(303LQ#>U$i!R}bv%Z8& zqH7jD^wJCxSU|^OXs@elKP#I_EJLNM?UavL_3hFzf)Sx{KD`i)x(MTm5s)84qa~$T GcK$C}BGQQf diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.svg deleted file mode 100644 index 52b28327..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.svg +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.ttf b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-300.ttf deleted file mode 100644 index 66bc5ab8e299e9948a6fce6b7867cc638bc703c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32664 zcmb`w2YeL8`#(OjyLXqKyR-{Emym>#aDfm)2bCfpJz6N5<*P)k%+N* zyR;59-~H|IF6z+E`*-7l}tkOz}3 zT?xr~L5Ntp->4B$;@Zl~2^q2u*Wb$;G9YjGUln!|GAMx%dUQaa;X{ZI2}S!jCIJI- z$7D5oZXStiWeMqfC%b=MzK;C$0PO|f`lIa3KK=hr-YF20c@xLAvT?$1yFLrgpMm3w z*?A-KhemYyf{-l0CyvS;+^4ros83#|sYhZ< zzz29~z6Gf55|@7d2#9=8&li@{$P|{0PT~h>l$oE9q=RBzodY0!T0!EC(1( zrjR`_2s{T#l%LMrrQK-nY}`}h8g^T;D7`+%#bC4;7(bmZVc+ihi`0t zcjN%|M4);?FxrCdBvrRqOcv2ZsfmgfnnEpNC3}70R4wIK_%peq|E!?LCE_GlZT*ARjvZrVTm#fux?S4+>_G>lx&4fHMGa1~54FI=`yvmYZc> zWY}o2jarkc(-<*XtXZo@M0l7!I*yhdtS_9E&^j@(bpl-?m3g@|+G>rqBqrjC^QC(9 zTRo#EUlLAiqSYo8106O)u}w7Ee2SB*hl(+w$!7NRM_4QXkz2E)lHrad(XO9Ms*-$JOh`mWh|SN+JLroJ`f6SGLP`{_M1?x>5RHRq zh6f?qmkqhEQ4XapEC@!ql=~>!Xsb|ci#E!YUFXovnsM=QaVa%xrKTi@M?{3j)QpRX z)`y2hNH_@78^U8!a5*_FBDqE_aq5DD4-TH&m1X;E^v1dK)-I&I)}~$FmwEn9{=tp& z_R#@@=Qe77a^=R0K^HCr}1ft}`jh@9s$EBEgw^CBnK2z<|zpm)wsX1@`-|N>F7HsM>pi8IB?2a7<3We+c z+=##41G;q19MHLAw&K%DINM5EK56I98O@7!ZkuK3kw2z)iymY0`zO~MZ;Rd|NA-J@Bn?Y~#L0C$m9FSck@BQ6Ng-q8#9FCrC=-n~b20mka`LbqxX^1P z5sHIQjT<6y5Xq<@P#=n0<#2UVUfoo14YyoTJ(IvUkPmXQ>l#Rb(?K%heS?A4!k`<> zG4XniDbPn~jasQR-oR)>3^S+Js->chF7A?c@Wa`=wydKIx(zNmyI_3UmEpxN#;xAb zZD$i@U{JMF`>Ri%-1xoRu6;*{r3Y?q|Dn9TaKY?CrP`uT{@(d$VcYZ@a?Y_)_P5$J zr#FLR)-9d9R!SJVrGK?SE!z$p5AjV#OK+10kTg0_j7@UN87^KzQj#B-y6UoY!<8$v z(o)o&qf`;{^u0+4G0HxnVVt9IOE5%RXw8t2RCACZgolNMm<@4)FlWfk!g6m<%4*bW zOaF2cZsrNCzo9E>r`|b4C@Ck56I((O29YRL4oVnOi4S&hDI2jy+I+F~wMODuv8g%;=~%Na)F6uS zbfB_7inf-reP|PlvhUkYUtQ`XKFZB3pu?2e6EcS@-!!7tl`k8xr?esqrRvf_;t$S4 zV@$6>VCY>mU=z9E3%8hJOb~mfWMLFNqBI?&w59SG;o%UaJbf^PUPVjwmFF~=93=)| z!{%d^C6^`vqT{(R37g!!n>bQ=UUTf^mE($WPj#W4U=$93;&G2)m8t8w=oB6&7!?cs zR%n-rx*tHF)hDZ9MU+wTVE{f1T+n$uDV1?7Q&b-$wyRdHUE;ej)vGsycA})bW3up= z>%&mo?=4u8s+(hI^6WgJckVcSB7q*tcRUsU0tW`-Y0YH6vgH{6`5A2{C+GR$;eHzD zi8v4$=lL0BldB6*dUB-e2puvCG0}o(GKM7A2njXR#F5@$3S&p9;$IK$-272|c>Cr< zDSzYU4V#4R>(_0jLNDc#@)@l|t5O|JruCI8%Gdgrl)QYQJorcXn+pH1F_Z!DLEQn^ zDIh;)g6IH`P6N(uf)E|+gk+UP7gVw!vXihiVobV}*ks{gzA}P757R|08ghuWJrMf1 z6!1`rw3U5Jm*Eu79$~^GO#ga>ySq^RvSea5kIiJ1ecca?;3t`JlR`Ct0TolL7MC)5 z1GPw{N`}xs3VUyux9Gs=!IvkW`)-Pgn3Lxx@ zk$M3LtCI0@S*ONi5PDe(WdUwkMk}UwH0jpp{Lh!K+4x1NSDx9WFZZF#Aa1?2pzi zTet!g`VK~>73kRy5~77V?p_uG7Z<$CzLK-cf(u$^xl(2a$v%32)}=sRiFG18hO;`z z&0;c$+24PkZ|@*%m~0;;lun^HGL;2%NE5N7Bvx$P9oXLnO%(ws%8@L&bomNsN(F@i z;Z&oKKpX@z{-8!r+B48V2AIJrn*teLZGlEP%nhQ!D3^8}$>n%uh>}nX>@84Bh^n#U zlOvcRqG}$)H_e5c_W8*pSD$|T@XDu8O~Xyw=C4{Sujn+snebRRGgt|0=O8zJRIVRi z^5L0}*IlUE5SW~VKKSU4kO&e(`pRO(SOyC$R6)( z+|&86J=yF6-4<+=%e#(%;_#R#A~J$!U4SknDJe!0D?%DTk*a+WTLmevl?@{cXMOto z-u7L^jCx#~6Scp?3P#VKzu;gc7I8MkZIVB#`z5jBFt|go> zk>mhpzTmnDXr}~HBv(wV#;^v93*HcZ%R6xw26TmKxa0K6NV1AA)5EqZ;KC}53-Pl* ztxB&d!cfm47ps(Jm<%pmg;j=Ha%0gJ_8RZOF4Y)~S+3k}iHZym^z@blleUlZ#fZ2K8h*{v$pGCd{NF=_yx;jbp%8V7#TG z+#eY5*Dw%*gAj%RF@&)l^N~Wlh~7(Qz#);{rWz=RTVBjGXT)O)Hxf%sYH~#q3p>nd zvBDA?(fHHBg`Z{*K0E353&o~vji6PaJ&els{Nt4luby}CBVj|&0Ywj{EqFQ^H1uPx zGD;bdEzzix^M^IP_n#m3Z2i{ZAQPZ%6QopF;~~Ei==2cBb8#ikGc9ky`FNc9L0k#S zV(|e+X+MZFq z{wjyTTS$Hq&r1yeZ;}cq_c0it9!#w>Fi#Td)C)?=V5BMHJN7zao05IPB5EyAru9*# z76QtSj=#lLpoU0LLkrngr3PQ-hp3P7(n>B@t*py}VFnnC6X+th&O}cdN=^Y6<5HCR zaCqga(u8)Q`9l3Obt+69oxeyJEqt?W*V(=^hfc2=AD5UI7hjbw9<|_P`#ufF&7V1P z)9LfOa*vJgbwH6d*Bx*VRqE+~)XgEa$lIh)uJ}$9)^YH0W58Y2YD-q_B~7Qe{ZU5C zhGeE-WFy}|?=n`c>-MeTvLqYja)QfAs|wzAAEB#_Tu10?5bUD3c;;fHHWbi5v#4hb zoEkzb(UKs9NbJDOIH95t8WK`5xrP)%nGQ$|Wh^e}ztQ#GJ*>~zu-s4Q%nAt}eLSzt zh&IW7XtR`<_;zr4{gzv^4|Gb4(A`+_c^A6|na;G<0ZA|a+-T=I8xD=kAK z=7q^^3vBXlQEKV3og&E4F{MSGlaSeRg!{ z){136pYYi&;i!Gr`uWpW4-jWhoimm3?_}toAqKS|~o;7BmRC1ivq9WSN){Aj~JGw2M*md7+WqOh8>^30PT zPJVXEOwauIVgs#w{MhF-VWa(9I$XJ_ypl_l>xU0xE5G#;1z_1tbmpv>xz!S|4} zl2P_FB|YtCMxG{EXlfDf*t>|qC8NZtC4UOrg-`5zK%4{Zw>2nOe9{*Zhg1I>`NGKx zh0M`?4Fpfkfrr9BWseoVv1b&B(@Op$Y!$ZI)7j%LpwAzGUao;&qDgnzKc=FKUc9uk zMlW)($h9-nuQ%Cv*rU<@A{)?Xs~5?~GFqw#T7qh3q!b5{#Au1jCj@brJ$0?I@@)G~ z<R#e6a!tQQan`px4hp3hI`r-V#&B{IH?_FCQ zb81);XnwYay=Qz3+rME9y}VP6o83s}B1X?y8zRQ)i_vwDC-(&zIzerwWa(L9$%%pj zv2h_rubIwfA12IW&%cJBws^h>%bz#w6{FK0$=gb%Z3_xe6?Zjp*2qW{)ywJ zwd@^!kW*G-wlfoQ%?D>QXTv@NlT?0o7L@$jI$mN0p;qglQ8sUSb!nF(b zzW~EC(PYmrx#@&J1Oz%#=?#z8p5{T%N!4Q+^(NDr!j+N(h1p;e=P2uwu^U7(-he1C zlxu9u2g3(urjOPiS8SgWuBQ#^#*c53s{0Db=vOH8Nhr3on@~z9v#G$({-Brrp&!QW zI`edvy>t%`Luurg0a=|9Oz^*T8EmJ?nFDi&$!3PeAhGmT^IEXG@6LfrL#K1R< zU?@W~1?jygC^=GCC^j1_-Fp?Sv%RuN-$JgA11B?kI~bJLOqRIMX_Jh$P^Vn=;%FCE zz{(y`a0oCrD}%V0K#gY7G^Apbgh(Kd)WE)Gu^E%}bhe^wcPMA(Qh~OkbdFf?>y?YY zJ^$j%$HL6>O7SL|M{6xTOOrQmP;Q=om2 zkrcu?ZtaQ55;@94LjjWpoq=-Wj44!ZorTAHvC zel5Q6+p{lY8yCcit&o>8sZ|prvKS*`Ak|cn;ALNE(vQtGc+j=P*sC=AOGxqZi@q88>Yn(dB>vFFO9#boSdS{8N4SRAb9J>x zUJUD{N?ebn&M-=>Ih9-M$--bCUwUD>{lO^vgK7IKRFFzuwnLkgAP}#I{=f`{Q_6d_ z?j=IKSW;6|oS3z^luSiGMk{)C6UaA^6C4UBDDehJ`(%1LF_qRIOl#LlqK5Ix>`}_W z*ow-YQOcb0bmoJbQuS9?zIiCczicNBU$EfSTmT4IQ-KKx5?HlP+tJH$@UlBxvX_mM zD_Bn`S3-JqgUNLUtS>i403}zhEbv5=h2eC?B1|v*wpdA5IxnQZE9Dl6?+V%W8us!+ zp?!+*K*01rg{MuVJ%GqHHeL{Ujg1Bo=#BxQK94EAWT78DHqZWhf&Gt#!cwtx$q4%$ zp`tj4wT~PJX&Bn~B~8?^_i9q3W)D)9CBnrCq7gb5>B+u21Ak;H^gQPBQ!L@n#L2H7 ziM>lc5$|PZ_mCbBOvlqUD(C1g`Xca7G@nXBaMY7YJOgzAABvLMy!4l=SCxabrM~n( zVOa*4_mm_#CW|^iEkfh4Ie1TAL7)ZhW70^W_eh=XpKGX1@YGiPsfetgHpP^hC-lrM z@iez#8Cp_cHqchefos?FMSs7WrGJWc+6cFV5h%zLl^cbK6~`ols!E4Ae_uSK%C zN>x;~ncX_k43TU`n8=M#&CGH!zF_7CO#t860<8P30gVEL9%#kGSC&J~0jz06z}zk~ zQcC0)k8W8I2Z1W(f;-t6;EU%$AG0aU9L~djF?v4z+B`(p=w#li+at@$&@ZOVWC z(Sa{Ti{g`itm;?$E=*7E|6azPscQ}ujF?)~l}Hc z87pE|H5j<=FNdmgUZJX$;-iufwEqJs6=IGJ4qk6W``xq5!Ugfs( zO8n~Qp?ON=rN<%CnQS>F&)CGKJ6Mdk4l{<`;TjfQ3oS+} z5sTZzq=0`x<47`K(-7#5#q|5WecP8cspngxUcW(9P!#cI-^p8KQ~!X1q0{=7RN}Ov zv=^@f<18y?vRpB~62my6vfA8&7m%DCH6Xbc6zuE^7g|ha>O>ZWl7szuFbY1A+m4jO z`86h`Jf>N|u%1(#DmA4#eQ{(pun<`aBP=y>2889Lth>YYLmr^6FyqHO&osb z=tD+h-K(q_%!o{(m2InD-TCrGX2*9|?Oi=%9ZhiPt~@(K|H{q-tx?SL6Y&zbBotBf z0PZglTgV%@L$fP50dhv?xhmQBEW#Sm2Pg~I1ha(AAF);pB9X9pck$4ni(v-0TC z;^aO#r%u`H3THon4CWV@~|Z8pCkz(Qu%dMSNH|EwW+p6S#nd z<4cNVy$`pNI2Hk$8eCzfGOWMVGxPI@(lyJJ6#B<}!7@eZrza(q$I@j=ZTmbxvIFB0 z4M@DBPZ}iJ063#hz%i=gE;uLpDd46kGFsO0IJk;U-VF`%e+x0~iY9w`pTc1Wglnq5 zJPyjU4pLvH)MY*2uxSuCf7wbiOUDcnjN(5m*a9-tBL&2R9;vTXfBzs#n%4b%B<*g< zrv~y?-mzyyeASLDtNzciROeKQ!-v42T2VM4)S0jsqW$a13g)Y zLB_R*6a~nFVOzZ;OBJFR4|&9GydczY?P)v!mNFj35z_V`Pzkg!vyq5L<{lG4;a$hv zopX~0jJY%SYvqsp^BXsu@4n^zbr*!hRWD~NU%o80`qd0-ed+u8KmS}Z7k)AH)kOy5 zN~O0Xa2U&yL2@XcSFkxPAcjRRzVo6KE_^k4>tPEqQ&aW};8yRyY@yd;P_Tu7*km)h zCyK$)|*_Vw|I^BrVM#sE~VOYrBq9U_2$284^9(WZ(L)c6FGJJsT*&b!yOXRYz}CN z7!yY3b=7e4_AvdB{83+j`f$wlrC;|>Tsv^t4z3WkE_xX!#I0bO;Oes@LP(#1&zux3 zEJ81W5To)BW`^1uWT2PuaoMFnxM0wx9We^bFa;4a`rzV*VcIM#h^snerDgO;q1V+K z<;3fTaii^}q`JFK1hS`R!sc0pr^m85O0X2H$}SSh@;FVPFE{GI{~nWLaH!mY zBsq%Lv>}Da)8I$yZADkgmHTVke6{t!?fkW4M$I2h>#c5mS3dS6 z->`AoxD_-sBey}?u=Yh;_buo(eqhJ;87(`G>Ns=L$8!db9K`x$c03hY=+a>S^pb-- z>>utpYhrE`=FF zCffP_{kK||e@AC+UohnCSzVg)q_5rDHQleTY5r{CYF`@8pj-~jUx4T^l6Ep88ZOLx znK>LV4N5Hp!X=refn*ZM^Ktwz7;{Hc)K%>WtX6Uj34-Dx^ukgp6J9_>TrDhetc$ z0$o#)nw=&SKQ;cNZvKb(4}DH6&Qm_16XqfZ^3q&7Uio0IFqwXA|HXcbUQlWY@dB2U zP!grI5^aFU2(1ECyXeGgY&dCXfN8Q?Cc&z!>PZ^FiUH&iA8&?f%gm8KX#I&wjmV5o zsv->|Jufar$)3DRocAiI_UWL0`Yt)hp9K_MfR`PB!aGW&J<&~!u1EcEqeM@H<0ZR= z1@9X=WHEXe@e`V6LpcFM{W-7nyKV{?N3s`$OVGVS`>Tk6nr@-XT z?OK!7(-+i*uq8H7BDF$OYNj%HVXy*7V{&*j;ME&^|BycW>_zFFTYvg#$2R3?ds^|n zy-AZ-H)#FVX~{o)@~!eJTlweikq0&K><{Qx=|?dXc&aUjIG-I1JQX7+&lX;63-`>0 zWqEquQY?UpFlHrJgZr-!H>jZ(HkVr~Mf!2;#COLXOs|pAFL%SVmQ%aG(>paiTPRs_ zB6WS`QA6mGV-4SHlsrBUdU%fVA*~J_^1An+S@T|8!$~C^jvI1`4KCwdmAb%6a%fB_ z^Bh>3^Pa(m!kMb~Ajq$N(q%@&P>273{CJ1I_=7HvSV)>&COU@G2fQa|5XVb|xEa%( zv18yXD@=SH44m9Dt}D)H2#i*?2!sVhLexbfo*|K@1>1dx`&?d}fB5>fPx4ou(`zA- z*~4a^GCuslOw0dV@g9va-??qPy2=$9p`-^Qt6=_SOz=H=$oKBygVzd{P8_$`m!=C-l_z_;W@iWXZ22CI$fnWfez~@H z`r^GSm3!G3|2)SJx?a+6h^kc~jbyQE0>*b6c>H`864 zcXZx4Y3#<%ul}C+plIU#qRIChFi)3ZaOFO2us1Mkt~{uGB9ZQj)=y7&D~yffa+?SNs?sLKI_+c;tjn5~U#Ki@<#^ zx_Q1*j}BIP(hW+_0;MlqgEB~|KVP^fT(z4rE~P6+X_NFz8NxG+#afr_GC(RYONLPx z*9hnc0`_86a2ad@W{I!O&(BwW7sV30cux2ecV{UksTU};7HNu{*VtywSw~}ywubP_ z+2RQ_6$_livZflv^5s{JJcC-Y7}<#3f}mM2UufYG1WQ%xryAuNuJM*Dq}FggqH-}F zBqz8oamnP$dBx;js+K$KG$DBoESvCiFW`zWmlr@lEFHxRClnFoc&S%GUbj9axAHz~ zGA;kg-gQTtu2a_R$rzc_xjPkZ-2W&4#QM#jG+e&+)UkB?fZS2d*I(>DWXiPN^rQZ> zElG0*Z8}lA&ag|us*h$5ZPT-D?*a2O`_Hvl=j5(G`QY-xk7o`~>)ARndBD79fg>_H z^ln|dY~b+DeMi*>Cg`#nWB=Rs)$r8C-?K%vdSOJLDe)z5FjHe`E&=NF4u8D)1 z%m)@~a!wVj`-6oF0%i_;5^A#BeXRS5kI@Gw0(cC=lT=~lhr0+@j#L94HIe@4T5x7d zz}&3sh!0~Fk8?(`k>b%obtGfMSgvD5wt%Q&3{oErYIXw8{z8tC)Mt}&{o_Nl%9egN zbBf02=H!)pzLCal+e)LiZc*-T-Kl)DuG10PiWbq9NA@cR&YV^b929yj-*Ejv*F87Z zFTcNGZntS0b4HD|DVO%kGk z{GbVPF!zHPvuau1njny+IL`avZSE$>LIk(={3U)GYCpn=urWGzMt;i|ED@^=R_^fJj?#TXw#y05Gv-!LFtjY7IDW|)4X z#m3@lSp6%4f5A-L3fjc+3*=uRog{7(eUQ}yibWUs0$B#EXYv%xA2u1aE#KZ+OrVo! z*&M8g%>o_%4*UfIgEdG!vO=y~zX2nqx<)1n@mq@jTAcLAHG)QuuJD=3MKw%ElyV)( z<<(rY@>V%Y-HQT+Mj4|(p~>ZWoF&=nk$@}5l}lz1FK@IZ7TcnXay=KtGLGXpFpSEg zDhjEf!6-Kg>L3+)PA3FUScEw|23jaCCZ5?tkR>r$D!H{fa!@&dtnvc~J8gxV(Uw+3 zX3X84+myRo=#{=yShQyDyS06Mvw~W6J$j)1z%Ds^gj*WXomIA70nwe^r(D{*m!`-z znzVnfa^*K=tJu6?+|8 zHW)tkzQP(^S|28N#OuN+jD#-&!U8M`z^X7lCXwiUo($n8*+7*+@$PtIH z@JRXtvM(5O5t`y~`PfhnU>*by+!nkI6PWO^-I)xsF31_oU^5AvT^Tc& zslmatZ^<$79kD@{(vlv`q6c3EvUPN=g%5?5y2H@oon#*#Syq*K5X4@PMsqwuXo3uk za3eq{mPNuN-$5{xUFT*0Am(z&Vf-4$I97_P%Pp|3i)8=@3l?Fe{WNWy(>|?B&w*=7 z=8Z~yKo1HZwxV?hwP@5Pqebq#!mP}(sb2!V=E6K-HsFgRBjhMPfI@AW(3~t!`CP*JGc)bsP z8mN1r{LJWl1CQs`MQpdf9OMz({dYK5^EE5NU}J zfIFh7#Ra$>r%fWrl&7e$ECM7f8T6WHVG*!E*AeFUR3eF2MPcfn0h`y%Fk}qvl2NX4 z_|opVZQn|*o8U76PaiL=rp3B_h$X#gO_q!CB=>4fPwI>@8L&)~7Uw*oO@f5g!m?&v z-)Ayqx*&@|T*H(`M!cUotBi>jZM~|dQE-XHqu8=}lS@o8brR`1a#>wYqIWNehYvh` z@4`iUZ3`F4xkI!24IgoCxRm?h@#AZHe)#FJwYp)`rsVe;K6S=O0xde6Y=H2wfsa>) zuoXlrX?vocC%VzPJ;;39;P{WQ9NSeig7{Da*(`j9Q8B86%KbbLOHy^Tg$2>NRs5b+ ze(-x&5@F(es3S;p$HLV$S?d24RNN-T$ay z)Y0+-Cr_L+XXKXC=XMXiFui$RQ<|n(zIcrYP+kE%7>t9nxOjbW6k-H~b;dFays}N^?m&GEo#VgQRY!zpy z1xr~B6-us{?7MzkC=L~S+gqB2HujH83!lE+Ed<8UsR|O1v+Uny**DM+#0KD=9;Cl` zM*IS@r8axR2=co*IU|i-5_#<1&zGH$sl?<1^RjitvVjL1nb+kHpCXk~{FzxcDeXbC zlGwqV5Y^Pai$_i!WKIHTEY^QACKgyysnyV~^FEP%sTY9Pcj<2JsjLZQ^%?-i~ z7Tz&|-#8~`y;gX+kXhQu4dEERvBel|W#H?BZe0GHt+dfrku@a8xz2%7cxEzEWK!dJ zb~5HGQXy$Vbw)Fr#t=-gHRCDbQCgPrCsQ-CXC6dG?Y8@i-yg7K8Z8MJE98$pe(^VP zOgsAr?|-P}EcaP=>k#d@h^5xf+5XFZ<)<~us}IG;lUe4n{@T2fn2tPk89ebZy#9AV zNr9Lz=pq}{bu32rIusC}52l)jcHFx>vL@;psMJn5uzQ$u%uAWl5!OL@7w3?q>(!%rX80dd+A-h z526%pxs`);EDc*O>q5629nRM%B8cQ(^UWubot|e9UKCLth1miu zD#`8MY62LR+dCo+&Og56!{cR|m+EjlEw8-AB%`#Rd}t9$Vpjj z{FalNt;LL{>p5wSzvV-dM|>7qJJ8e@?>}dDrfbFW+*AwHs|f{&!g@|o%VB}+yj(`D zRiAHc^{sNW3q_2t<6TE`Wwi=~f;%w54Amr86(q^nYJ=&J%%kP9)k?KE%|mA{o0^v4 z%#x7law*MB&B`zLoV)1V3CCv6%1^TBa@E7d+ox=iWcy)jJ~J20%z5OMjbZ53ARW7>2HXsLp}3NpzOu%C@kje-s%7T1&!&u^@2V!6UC*`%WCNxQ#|Wu{^eNZKiA?HNvocPA zyp7^gw~BK_ys`&eSq$YQHklyD^NlT@1uU3^^$4#b2vn(vE z%pCwOc=h42aCn*It(B62OoL(l+xG0=GkffvIl0}_diLu-Xmsn{jjzuia~ z*QE3M^E~w+Y2BrFA1|`3Dw$Dv{l(_LE+6!11F>|~R~P*U9BfqbIQpMUpuV-pLNFj@ zB^c2Hi{?kWc0tEbR7B#7rHy(>mmEwPqQ$ zW^A!sS=|E%d5C+=Q(0Zu;=V&ICdIf=*U~oC*?+D8JQH=I^x>L(?>Xl7ta*1D*8gh! z=^yRVnH5)u*PQxd#=W`?ZXN{8rQ`s!HK z6+x^#j-%$8Hxkp3XU-xxK`sZ85mlJ$$mL=&vFHliL(q>L+AeL_pe=*iyj`PulV;ZH z@92iN8#Jh0T5fJyjkn)QPIYCR%sY(3?m8-p_yWD%^ zpoX=@?)lMGqTjB~e7Lp39%-f+h868=Z;{rQ8?$rcg+021IM))qMrS`r1!tJIcmu#ga@W$EuIvBOU0cFxeV5mflHiafXqG1D-TQq*4P*o|U z1);Qn-Pea~pucPPA-_Px>%Ev?#qSHpo%AA&S8nCdFy*OeQ;I^dfPV^|g*zLPF=Cpo z3?!K^Tuv+~!7ZtHYu=2O!r7K%_>1m<+j_!cyt`^Uyz0-pTxU|wddCc4QabU=@IUvm4VbT@9JQ<*| zZ*X{paBFy@aH)q!u$PHNw+gU@bK3*HbTnfkH7}hDI3lL7JZ}^uaiw}gIfPrp>PnAW zXGUiEjTrWi^1XNhA6ovOepCI1e`Z5`ty3!z;P$4ho zmxo<9vHous_K1(bUH|P(Y2qUm>lOB7fi78&&N}3`hhg4pn(V{#9*~=Ei*RZTt{yd2 z?6o+;Yjq1xJJO6?FMmRFp_m8z|Hy#H`!qv=CWH_@GvH0(EHBK0Db|Pk_aEIkZC=>e z@qgLvLX-S_WWf*KeZ1a)6vdH;EO=%Y@Qi(N4|-(A8!STk3QvzHhSn2q4`>HGeN6*i zqYF-2e6EUF3YdNVZ-EUK{b!WNQw7y*eY_P5Jz!c5*{@>i;=Tihu%!L`ef#LH6@~wd z*3B!g=Ix^cvo`H+@Ujx%9uMG)#RzbnGgQf=S_oBgNO*=4bIT+hU+Bx;%;q9j&o{Gq zhWvQI4^ez@%SyyTBS^--qxjkbv_bQT;>!YIQy!2doR43Nrv1|fH(7z$_*i=A*`Fr%67d=?56(a?C+uT)rh*Oe5qI_sGdap? z9FD+^_I{F3*u~Bllwj|x0|(r1DX}P*Xz&yMniAy!-gvM#OZd?Bwi02l{bSeLO6bI7ojMziond?bOpW1xGbg00DSo@|$Xpq{rR0U3dues$JdH_B`^1ySA(C zV6WO{SM3Gl5^bVE;%b|{yV(s1an;V@ZAYjh;%YnW4qRCtu~z#z)Kz~zZ9^M_!}*|j z)-R>jpR6=t@4!L*c#OM&jG+%4e*s@u04lw0NWuBaD!zz=zNJCw3jAsqc)j*Wy6p|M zwLYn}Q(bM(BOkw^w$X_JwYJ_>JBQbH_Q(ZE_#K-??Ga14?#>}kR3Ue4aktK=dDuwn zoULB~7nb&@J(9F_*VZOHY_B=;VcWqbOKF->|pmuWugIukh!)rSs zchwHOgNb`ScC4o_42&{raL5?I^F>4P0%{!|4CJcC=UR7+38D#7^63kht7!i&yOcSM40$wi7EZxa05G zl2xqmRr{QC>p1(_(9K<3E3wHfECZOiwMWvTH`Gq>s{N;{?Rj`F`oG(*=2iQStM&pi7xwq-kR*E5KJBWV z!`pUZ#RYfr9a|$6E4-ijTCV!@X%Mnu-cX-~d?AT?DoxmmT-0w4n3;s?!X*@6Ny_on z!ig{NvIeDVX@y30uh$+)hrgk=M$u|*hA*}4d1TTXYFBh(K&{O%pw`aewVge3K~njS zErs{U@c{5v*F8f0*(&6Y0>=yH;b7IgCYRRY$}?9TJsBCpYv5gvnk+)#l`6W&u2$wb zlF^EDl(=+ZcC03gK8GwSt2^wfox^M6&DVIQTLSSFle*ie^&W?80h!6XZV&Cj+BCcS zEk*GW=%Dt4TybNG>l#*DlPSQGSM8BB{|&W0#tXIC2&iq(Bh%kdJH`tV2De&!0h#&+ zxIIP}ZL{%GYv=H`o#W+#yV4z`_Hhd2t4Mf1Go1bW(hUob+_Qd$IAM9c_DDL`UE8(R zM3Yx)ZPrhb3fz}o=}0xku{1r80o9%Kz#9dtHWADj|AJNUX$ zGS)NpGLAB?FrGBtGrls7G2KFD;LMO;Lf;NO9;Od#7&bHPi?E-=yM=EHe;Lsy;*?o5 z=b2AL>LY7K&W^lZ%3P{#skx;#m3mM*wsgfdS~+`p-|}(g zZYRANWO zo{Vb{w>IvR_{Q-+R5Dd+Q)ynM<&`#8I#KC%rGF~xDw`_5Q+Yt;$(7et-dFi-mF87? zR5?>Mx@ub0bqPTUo$&3Ea5~{m!XJr#iI&7ViR}}6B#ua&owyqHc8?1Y*r>%FaeiiCq}56LlP)HGpY*c2sd}aAjjMO5js;$P1O-A$$JDFSE4coDNGTsS!sOI*6Q)!M zDZbry-peTa4d2o}!*S?~f#)B*?xerEhbDe^mM_SMLTmhIkFBJWG?)z6{Y>(trzDql zC!>YAWR9?sSj0?HPMShm(HW$^(2`WAKa&r{L{c90^HF4!fhc`Z-a*-hG6|&(N)AdU z-9siIAE&-##<@JQM2aPa;s(;u(3T99VEs!!kwdx~WU{USIV8P2JmMgY=A4FeH!$(hnq6 zxg8lx; zEV+pH(q3~c7oYI`9R@R5DrJ&YQUU48?;AyOg}pcqB$>iOV#c-Q;w=(~dFn>uLy{z3 zCQ;aS5jMfAIYne_eRX58Zsio2BXz_7Iao+~=*|P@XGsD*O4dqWlPqy4nXk_z?~Aj@ zYH>3ukb00peGbm&kQ`Buv1&j%3J;Oz_Yk>sjgfCQ0+~3MNeB8D*@$uNi}T~f6=b@& z4&!-=4A%#c{`y*El(>te8(I*Pl!Rw8{C!G3mTY91{uIW3E5>CGc^7SENaM*`dX8)} zj3K#({-mckgsc+^$VjmOnV7Z6T73c;M{`MEl!mkqsVwv-{e*#}iO?SVOA*oR1Dy0B zeZ-}tAz-NoJav#3kj+wSl7v1t623<)`Fp_sJ>dVI)MK>B=t|d(SU5c}ns}`+`rx#| z=)+k+8-XYn1dBsK`9-4();F&LnqYLH6;2au+}~6f9e@Tr3q9v}0DJ%^j%z5NyT+f< zfM>zjv+>so8+&{?zZ!BC{2wCU)R$38Q{U1~nT$)$&s`!)Lumq}HPNlmCF7O~>Q?-c zWHI)2vM~1U6F)~gVwr$l3%k2{T3U0`7;$X7p1=jlGOQ5rPzoCb7H(Zc2^b9Qc8YS} z*GEEQ0{$z24$hA#N;*LlB%SLc2-uZ;^!Vs>dcC02>-Ygb^1-iw_0tmW#s|Lw4t>;p zQ70KBToOdwr8DRReylT~vMAyro+(KNg8^@1M>G5;!N*4uCB1>c!#`@nY!|IKKdg0B z5VT_knES)7xQ`@s4iQwfl*JzFGu!&1`@M+-j}8B83iyzq8wq0W~qD z@gDYJ*OED4LiCFjG7sBt)WW!9w!l3rWDOzFA!;FOZ6u+U&9`0pUP|X>9HNe?wkGBF z`ii}JCfaC1R8-S}O>DGxqD@G!(JGcio0t&Q%qGS*doMjEBWhOEtQP%eMKz1c?$h5U z#qupKWX{U4M%hS*^nv*8m~OE(&M4#B&CJNCn`o0*Gq?k_XJw#)9A^XA@>5oOqD`03 zD#|9twM%cGZYye1#@4t=Mj4AGs;TWnyL8)$CS@!c8HqN%3r4^?ZeXMets%jtuaao< zQCsMcZfjh|Mlxp2V(oQEkFnT_X3Z)y3q8<|Pk0|6qU7}xjXh5Q15FRnqIPHsn;1(O zb|S_SV*!L2O%iRs39UM$HwB0mfasTCi*K4}^G~o zjE?C@W)&X|$tYus0kBas4jF+r=Q-BPzyw?48Hb`s*Yv%WNRu*$NhR@76PypIYC|TO zO#Owb6giss{Wzd*QswfPm92_^TwX@g8s)J2u`qr>yV`tD9M!v3ExspB?%%d9-_td( ztKRal{)5ro>&CD<46b{9+P_^h*38cN*0EMBZDf0Xu6q7jdqfTlGyoiR6l9x;4wu`R z=m@!p{R}bDk#cZ3oEuz@j>KxoY`lH1H|Y%d(3T7WSDeGPH{=l^VM=cj2J6%4s6zsk zWh6wj5PwV-g-LUX5n3%wA4$UXCx}t#MnViorp7($$AC5=`6XY%-yP`O7vKR!I`>8F zF&)9`NFMt-WP`;y&+BpiJ?DN9R&?ax2sSRt2$U$y&kQ630RIS_&&1wH%)s`+y2;Ks z8iw5Hfv7bI^=cryBMIN?_@7F2Hq>Ty-TQb0vFp6xu`d$o z{mfy5Na=t7qCRVb-6>!z;Qaw{I9kl_Zc3xYP2wh6iPjZ&h=;^t@eFND6+se<1wSE7 zs3O!CdJ03tuY^g$49O^LKzSj-$&`#@w3sACh%HgNqm5Cl9o)ae<9i61#_G2iSJdxU z>fNvX;$Pzdrlx>NkIdu%L|tM@Jk}gm1`S&=y2%*L6j&CuF=q7;QEZ5;&K9I4#v%>x zQhE;~(V3)!F1x{d?*$3I7?OJ#G_$9s{s@trz4%{G`#iMu=i~ypNG>7Y!BZ>WfnK4c zw&Nz?0Y~78A$Vp4^f`kv)DZ=kjE)HW2agC6>*!3XDSrd9Fw)d<4{zvxLf%Dbfzk@4 z14<{9&W<0Ei}x7sfO|xGpv=X&CAfb%%67D|17#=5E|lFUdr(fIy;CTsQO=;8MLCCZ z9`{~AxrlNJ8s#RQcMIhkl-nqG@Z7s7lyrlQ#C|t{9@4?N6CG>8 z;k6w%NL^S_^&C%01IJzRIf{g{Hk|zhXNqyA7*s3)Go2j=aQ|77ryL@Mj!I~u4VmUZ z1jn%+_XGkPZ(%mAGi@9$ zGoxb)C}9dla|%Xt3h&cX^yw-3^b~!1iatF>pPmAO){stVDD6->IEqLY#{#tPkCuzj zauHfCLd!*Hxrkv1S40xyIEl9%KLfVE#Ze&W=q4giehGU7g=ecEVzoC84Dqi~xPH$MfF1rr|aF-rm0%`6K8EeE>0R4nO zn#aPzkzf_qL=?F;teOzmK+Tb>-vZyV&=#$cfzlq9VtLp%o$*HNuK30vKG75Z9cvc8 z@z8wBVJB^a1yc<+%-5*Pte38MLNb36`5_EoLeD#1J5wnZc z@b!UhV+AzKruKssT?6Nn@znvwnt;DHz5$p6u7jF&@x}kf#y1F=wDrN!4e&Lh9}U4B zP4NvuhHEqQzd62PyjS78R}tK5i-6tM0XbBu=&k{4W{$N|XsIS2E3Ce9jTQdiCca@Dk0vJ`83uje6IR79!&*4U zkq>Ot6r4%LH-clzmt)G0W6GanDu82(*^>=`JBF!HjwulsYJonq!dK$h(Q)kPId*jT zzuuj2z6-tv%sOQN1iESGcBE&rRVenUTBxIWRy#=!ntd;X3u0RX@__JW8sja;1x0RWi) ze2V`8ERQPP)ZWbITf6`E@qVMr>4~7q%)se87MA7P1NXmx2B4T(dzgM}0ssKpJ^*0& zSL_DE#oXA&9RLs_{q`7s;{*cmv}bN&VEnCxe{;6~@XTBVYW^*LYkl9G;2WerDj-eG zZJhs$-2nhVWxw-tbwF2}v9>e%_K7ll=h6L*9vueZzcvQ$-?@n0e8&;~2QUOMZCe8y z697OQ>6_<&`!JDp=%noJoSeV4x^E5TKi`)Pz}Vi=a=^giWgr~!P!Ja$> zLj1%JzUZ&@7il$yN7=mRozC`M8v^gi&h**K$`}@t}p0KZ)R_~kc z=u01P+<3lUW6EEUIUkq=>Brjpn^&7x(N2!tUfsO9DQ*)UC5xA@x+z&_BbzX`Jz7US z+gA3yC%&7AoxQ1kH-kMlHMgZNB;CUeB39nYTQx6FkNFRBA90o7@R=J~37->Y7~$G_49zsmHI@)|VBjHw zpW+Z0ESdDBLsMz2XI!97nl_fAX!Q^8;{(~imv(g${_eNs@qvejVCp1G_1uV1yTq>q znnSk(4G+28Gz{bRdv%%Ah73VQi@fl68S$pGRiecI3-t-54au@_^ILtz>E>a znmtpGC~ez3vu2+>!)2@G+N6gDK{hEUo&J4I?iuWJWnK9b+QHmol}D(p{K!eebA@h* zF!~cq@`?#9j|7VpN@g89;GS&ec3{IE?_<7hwPVa@iEed~XLD@bxTV8$y-mLXBUW30 z)(w$8^)uoxBbGm0ZyhRsB&{0vv02R_?}&`1zCe>&ZX zdboza@iL!;ujrn)j(Gy=rdJH zdPh7a_yg8Lx$fEz;NCmQB|`nFmzen#gZtKw^>Vwe<^&EE&i@ z5N{n!d+;fuYp!6e%rk;lQrvu4B+m8}K)SIYolm*yCLZsaR_dLRE-3Q zd~p(eA!<0>57B6k0VScR8x3ObWCW1ZC_*XmkCXwkX3T!g1j&T4LXl`8$qGI40dL9R z=N9N&yxo6bz7n{+X!~_?B6Ew36F`wR>7gV?xPl93W!GXy8RPtm8xCnsK2~CXMG^^= zxcG<$l5;)MD)dc&JBVz=Fo=*KlCU16+i@3!H9?y&h*$rvh~ONhtsl#{umHL|&gI~# zL?&$}eQ7N9Ut4HCy+6K>vXQ0LWeX?r@2|*Y#6h@D(CY%hg6B5$u1HUrGRMZ)){@IVxHw@M z4ZpOP;zE2w@IxJNr#${Tx(U@sxD=8UH(nGkM&#MKBH#eNbM~18i?&q*gv>t_wQS~g zz*`NE5Bm(#yt_|?f9VXS)z*ai85;1 z(`n9!%+BMr6YydRz(A7Z89?us4}+860!kUeOs9-M5Dk#6PWn6#kga#D?sswKi=NT> z4KVrlF?d4tZYjub(@tPW3ptra#dArWRL`t=L|eG;;MPvZ8ja0JW|1EyE+dX%-bx=w zqk_Sdp!U%Q3=&ph%F1T?aDoHJw1TsU?NEM@T-*P-N^tvvT(z$h`7ROw)BtmUCP4qY zlFA3j0c-)$fU)mcAMjrlf%>TrKn2YLAboKH;6KvJVPr^ zH`k1MT=d(EiGO1bA0YK%NEcFg`z1^_w`}1}_|Cn)!ywE;O|_smI0(NW+oU+#uulCu z=T0ZHiIteTzYL_f4kkAccc}jSb@tA#oa2R^r@P@^#3{Zf+{&m5J+OA;_+vyuvg zjNuK+H&di1Nzg86@FGFw2T`{PU;OU|f&f4P&;Zb{F94!DNRu~|0IE3ZV^&5tHn^JD1-$e{H_c;q)laLAOm*UURIljz5=|vk+ZQua z#6P0b+bCW_s+Zx= z!r+XA#sZ|EWQEX*%gac9K($vTu1N1IePT)IPHpVtsA}vSE8-byCjGD~`YUdnCkVJI zsZY@u&X1lsfu+}%MhYvc!`i~dFg9<@9L*Rt?YQvCl)MM$LLrKV<;s}fLvlaQR$y45 z%t?$CQjpiP+iz{GmdtVDQejf`XycmJh)FD$0C2D&kSF4F{sJ#1kQDWt4n#gNN@^#h zo@L?&)$8PjtZQ`E|5)&e>-F6Oc~+y&82Mh!cP-}X0Ean2xV#X}eW<`ybo4vxXx@WkNiwkZ^UiQ7uv53#nQb@n{T z0eP?N6QVfD5qy`SEWsC5n5d3GE`@$Iqqvy0ZCT*=%$;j|u6M57>~kfP*w%Q3P?5$@ zkH#iNl3e>FlGwfLBh3@kn9d z287;~q>FE6v&m;5d=#)3e*72_?(?jpNPjXA%zP~TMOM?d$8=Jom)YzdQLdJ|fp(OU zhQ>%^eWmuDk8Ahs-+1$zS|B8ol<%Ul${^ ziw>A?tw%3{%+(@6)4;eFeR2?%OM+?|)s32?m1Ov2T+YY~)bWzwf9gwCYN?qbXs+|N z>o0flZm<`MUdN8{cAG2Sg)oN9lGkiJTwNV4DD-CP;r`~e(p;1~?S_mdO9{0-ZStRYF8YfMDgK$Xx4`2Dw&B|q%9H>A%Sr1MZoDWO)B>t(Ue0^#EY5>G-?Y3dx}z+pf7N&FA*I@q8JBN#`| zh3+!C@E#g2N#PjhCQ+jW4m>@~ zia$hK#S5eS^9$~wUj`lKfVLdG)`j`Na&=mEa*##M9_bOuxS!-QTFmuGNJ}Glb@&9J z16TcQ$W$hAJqYI|(Dx))446n=@*f()>ah3<8b@KVcfzCaIeW5_GDaCaJ$gmL)0udd zO${qGA8ZeD&_dFsyL#>XEc0(Fp&?sl^~7&oaM_7`KrJvpP|<j>yknT;YYqtz|Ju9>7&!BUT|I` zBPxh}z!8%9E_?!;&S{m!l$h=;MsrcQhxBj<6dLwP;ZpFBE{rZF zG)2n=&_r$Sq@I~c4Icf8!Wtwq@^5!#<2WS-f0l7pb=;dq|H_W0ndMPY`s#y z3!QPI4ylPxsf&#vRup0sCGT6+{;NcQfOK3{JYrfyQ*9zO8#{|VPdmc1kLFAAIh%>D zZ~T{=ljTV^dAl~j>J^8^A#uZ<#C=@7&1SV!zce`-b`=-Lndo&Pw_cy^L13+3@6M`k z4oTQlaCZUWdxKC;9PH@S-+4jR))_rnZsLGs=n#KW@Nkqs(HrhEV0~B_dqFvnPh!FU zbz$!^l2z6ox-S)R(%HX2%+kO~^(&TK)(b2UZ%GM4ky?mQWGiXcC3`-Z3(8NoO`xUv^;Dg2xrQG>nq7^-!ALr3PkqY2rD?u z(gi+u^H@PbbpwBi!a^*%;1^9wjO&G-=fzO|rv}fE_Mg1|!>dzQ7Ce6v%&D%!dv)Pd zCL-3b5sGU%VVe-+)62umg~r*_q@XSKDbOUh&v5YZ{*BKL%E^9;c?Lihq^^qPML&Dn zY;ARC8VQ&DTNs?VmiqGU-I*~q_Bs$~oYU=Z_Egn86OXgK`l~e7)Qac7BPuQq>#~$u z;2o{5#!_hj(kdx1Hep@2bEwIKj7aktm_66^WSCLvLJbHoNH)t=J_jYj-6K+qt^_7M z@JE^mTjQJ^=>UAh0X_!p-b@L1J@?2WGW(N`|Kt@lfp?JbCRp?0Gs5gp|p zyX>S+CjtZ9ua~HIIZlHB$`hJU(NPA&!F1bk+?&#z$6ts332f2PU_)a|v4;|3DRWic zkg^g(3?}p$O?5R6yNu}%NCvVE;({zOgFmIYB}Ujj%tdCzElA|#yB}p7rCtKcxfTe! zn-*^!mPyXhQN8`ypYRgByp9UD%YaxNX}?UQj26LBKVJss>1;n;-1I)<$jBHnJU85l zU<~`7Df|(l$>PSaJ##%?pgs9gbK9j?{L$|TrPpI=fY6g-pMp}&#DgtkY9GI~1g@V!Wxi=0-MNQ6-pNR_OdFcfJRDFGueV<;0? zoVo?q(Fppa<;W;FVX3CS zUb~FGMo=(juv#Au)VvntWzO6reo8C3^)X0U=69Ek2X)+_AA|#^Gdr8xsYIVCupW_>mD$)2~h z=I&H;e7aD{CAa8oI!$bPipqB>pKsnW9IRuXDd~<^#lN|24{-dV76fxe!~1u&{3;QL zJ-vljUqUA)9cfzf_<1q@LPrL>zvY~Ro%Qx?)dW}FA%X&eXfd&RyMn;@n5V#384WtW zwcV4XNX9~01Pw@J5A>spe4CFFGUqYEQH5E+&?8p0Exupfo>3BKZfKWLaHW=KHgxX zZXoJc9eeB!j$w>qBe*2@M)RKIhx7(}1U*mwv^bCKn2qXydHMDr z`RJ9j%F|0lCt9>Zu-2=Z8Nl^>>!siKv}@$$^cMI6RN>2dKSlHY+ibQtpm81=@4>od@3Ro zmfd~*(=@28yjihE>6Wj^cQ7YQDJ!`T*QbB-y>+dfUNc=gE`+x|0tBy&3I0p0i~>R^x2BcdFk^`+ zh{x_})z0U&*#9KvlkBQGS0yBA@^@-z5y`;yE8)E6YN(eZX^Qd_=Xyw7=dIix!9|Cr zBycw=_h#k%p->skQN2(r0KEFOMD>ZLw!_mjDP!1g*Sl+QIjH*zZWiAU;}_5)B6zE? zl{J!2@iIr{j`$VDZp)?lPx;=wgx$ceh^7h=zRYn&)D*I_%nZumA@z1zhc^*HTy%LI zOKRS~?OLy1j6yC*pD#CGOe@uho!)cp+7u8f?@YN?fCjdxmMR*1G!s@ zwY6dk1ibE6R=HL4F8}VYpPNm`YtCbSeOvDuu1kE}TKmRs&Bg8OVfS+c=GjyA&Mv_^ z_)H8xeU!&j0^T^?ex`_EAMm`NZE&w`s7<{Atg?qs2DaJdYq#y)yR+DzIPKOWbNOg( z6kydkJ@Zr9$o~C#3y8`sr)%!ynn5)dAB)`ec4hl?iLv7K_2cYu9(h14*(G9Z!yQiB zL`9McfUNvXvkp>pOut_Tg7zqQQ&PlKMtCJRyV`bp^-NK+PO8+b1+npX(-^)%x8<#j zbJNE&^T}J6eJ~NxFwOINVnFRrXf<|gx4yMsxz9Uz0gLAq{Fp#yeSoydZRDM$sq^GK z`>z|SBDz~=;q)Ss5~39f=h!QNvdHW7KEe@G5z%W6*W3DR+`C8cT~lE3hz2UrJ2WP_ zqO9p{3xBXeC-qHsQYKiLB$}PtL1gO>2#n;)sd}!;mZ?naq5+6V@H0j=t=J{Z;O%3{ zg_)nHOWwgisNg$^$2^P~KHvKX_TD{CJ;@L)AY^6dJ4=Jz2CdGgcARs0$9>Mdb;&_u zkD$ZY#w9HJKkZHMOOaYYBaZAHRj{L}vdpB2UEp6xOl8%va?(wG6S;twRr9s(5ivq9 zHqU$Jg?4;N*ts^a(YVWm(%sk^M3xySv)Qlo7OTTZu=HW_eT(cnf5!zl)d@*N&g%#L zlLqX4U{tc;Devi_VOwSrR}6xM2}wGkxY?09D?b5kMhs7<6uBt)Yw z_*qWoz-m=4b}G_?V_S(@h}M=ie|kB1C7vwRpv#!G=v6#9s9vh)Q9eyC;pIv@rH|&V z6N~TkE&ZePhP~dZY0SUJwXW-`_SBcX#hI?Md=IcS?; zdpww1W3Ihpti73FcnQ|S0(fD8h$Py0{yx25y=k!79tQn6cY0LB$)Qld# zudCv0C$BsC2=m7b<Rozk={kEwm_U^p=eGOL#v zP=f=(dl+~p%*ZUDbBbReVkZ^89TUNo%8G~O%5A7VwHQyDcQa|%=A)cwwu*)>(fG~{ zVm~c8K$okuU{A><|1p&Wo={rol_s;pOt<@JlhqkLqCCCdee5OvY~TPfpXj4+%jFj?jHmFv27(hZMZ5T%Qx9XU8a5Oa{IZrD(i_RKw!q(@jl$ z1GU0lfIzy1v=c;|Unhh=DZB4Y&zS^BpB~ zM;9>av9|8;Edvm^AoE~PP4ihZT_;iL2M)2~lD`z1C+BqiXkgeWdq%K`=HAb-VtP}Q6mW5o$@UqeMC@MBRNwh1_xC;7^iW__4f2xjoPNm?;79rxx;VOE-- zPT5+%^4#yj-SDQ8Y6{p=%|YI&YM~;?J!U3J#i{UH?$nvuK(!0-F=7zaEa-cTc$vES z{vqU#aHx(JS|XT_Okk!3v=ayX<#O=)ZEC!7qLuf4@~6jeYQ(bpigtQbEbV?UwnWpu zdV^jkDRS(oH+mvIaOUF&^y@-BxA^EU@b&Q5Ife%rg*vWSAQkQH9CISry^J9ip$QOa zyv^E77mQ+}&niEA#bP@7n!|TbZWD9*1m$#_m*7P<*L~Y4TKw~18VbQVo8NIKb*ua= zsyxPT_TBaRpt)DKLD#*nEnBXlYp7j2VuVI8rOG~7RNe%YQhd?_>pic&E7aZo*Ch9% z6$PFw49ii20;CpJaVUIOB++=^iTu~;qLopDnB~a3`^DAsC5`R_hFfFo!Nc9$+Ps3D60836m ztiDjAXGlr5BUEtH_V>4PMiTwUMKlL1J=)~l&xI++=i1hd?psDGzLe|EM_7S5aKQCyWNANu7ESMa) z29m^SP%<08upwWJ<1#t(+o;pfDo9>b&1b6&OCx~wDx2lMTbb+>DoAXS%>+NYcG)x= zmeil4BU^{z?J!Y;`uvPksg=oOf%K9}iQE`*vU?GqbBSN2&*H;ZQ1uZ}ewpm)U4z@XAeUK1R(74!;d zyptvXMReZBy$4*bNQ!&OLA1TlX_K7G13^B9Xl&i8ZbJFa89xIXcjiwktVzKwv)DyV zYKmy-1Ht1kM$PN<{Tu9&Ne8vn%U>`+rF@YKDBqm=((7xx)oFY~>J`~bUrC6mX3P)m z`lJP72-H*iskErm;MWuQ$WiuM4HWxvsS0?h;_H6_0_%Qyu%ntjlU7g4rs?9WpKuF6 zuAk)Jzy6#e)kyfPy_bH%lS_f%3X0?0;~+a7oCu?o zO}-(?;kmztkQYk=G%0J?K&s=<+R*`lI)J4g0uc997t1FohxMtmKsu;7xw3Us1dT#+ zV#OF(#tA)}p}^%9HQRKHLG5+uk{AV#%FQsSR%XYQW^ZgLd-yDShXEC>K`h;a`5ZQs%ykzu<4slCy}o_wuW9Yy$NnuFVVex zUr?tN`&D#Vy=UDY-7#kNG0pTxlG|O-x@s&qYr5{fkMA#>(le_?ku!JD5>m(vW%WPc zFl31eBB9HpX;X^Jqieq=>yZ+Si0&rT%NL~Uk(5BAxX}0dk$PO-O-)yzFWa*6HtjDo zIlX-z+G4P1T<^@ytIr#b&MLbXR4OFeZp{Daum0l$!=KzD3DMr`u7JCa=y&A7kRgd# z^+ZgOdG5t^dcN7Z*{mAmYEG-e*4@SC>t)mAUPyQu6n7iB*8UWhih&nayVye@@*9uB z#BI#<2#i9EGcfupK-~NplQyUO42+)G(5uZo1tM!R{xX3Z?NIFai%fOMVrETMM&}Nc z`8&pntg&z38|5N2*4h!FQKMh*nJe$TwgI)6Zbs+h#WHANXt>NFYd?HOtUavstF&U^ zL64O)G({j0bEf8iOl0K;hpfhU33h2hzuhl*Qp*BoE8))Te~3Cx)|h$i46v-~tB;}X zd+cGhlT#5@2^D6ZMF;bEPX7>T&)6-@(_(qG+{Q1M%+A9+z88DVd>WG9W4Gr?gRovB zd;`#3rse7yGFhGvLGe8THFd@Zf4K1^@AZ*m#7u2rsdFL|_`+TTV1wbxH>$PlTHtL; z>s_YsJzks0HC}D}Cs(S%Rsn+p9?yFKV^igt;%t6l*)V*raMVG4^gl`a79MO zr-x(3D!5ZDIykU}jlm>!YnhJXulgs#8P9-V^w@f*6(5(MetS}>GoJ$QQF0)Gn1F`7 zg~AZet1i`PMwJTT5Ed0-V@wIifH{Jb9BZoXUKUy}91T_HNIvCQ3D&#?VOG#$bXyn7 z*F5NWK{5Y>9QqAL(7({}k^ul421p_zv;ykXEY5{-m>q=mZYi<5$4 zhk2@nD#5`$?~DaafJkwe<-543{Ego}zb@0~{saG@-y8{Qvw$aoY%YCH(#*7YQt{LA zzQu{~DnSj+NwhM?s3A%brM9JTwzgbmMDp@kJupH{REsXK_mONqpMIsDl4?arSZk!d ztb7->LQY|}$e{_YNL);&FqzE;QA6QC?Yekdz~;%I$rl~T8H%uz63sH1^7#v&>=oWm zy9ZM|GKl1tBib;$xvJxJA;+7KpX zD^qH;yklLjPWYOXoI;r_m)#pQA7@~UiAYs@k#W|xPyRUMU+ zV9Y$>>dP`K896DVr$wJs#L~ue0%T~17atnm$Gt|$=F8Ld^*RyWb$Fp|dnP;mD*~%^ zmUXY!y?6zstf%k(pGz+56^ujJr*N3S@-6Jm>&Ii!nNQEM_INP|DVig_`N$Urlo47x z*(ut3xlr8$PvKqN&tz2;SkI+XP6nTUQ!C7#?9!5F387JGK8Z~gnnw~%7b5#|vKL8A z0O8!GAIs?Ly~(`(4XNs6)TZsJ>S_hF;UI40RS_l#v_XH^h0>VCXYlLPo%NVG8cbzV z`3c9UZ^_+Q8IeH74G$%(EFKRGl(LYT4S$N_p=oIt?40Yvv78a3%^_8HK?j2ni}gr| zKtwc+ZJlzC?7u6HCfL#Ax%_@n)cO%Ig~NLd`;pU$j`}LSBx~HP-CNq*)&hqmI0q%* zo@L65%<@<{P@%etRB6z{APcB%QUWQiloD&X84If2y`?io^Y{!Y6z!oBz>^|Y%8#YW z?zUCjR2R}g1$yXfIz*;=?zP^~52rx=p@Gn!-4Eln!=-9V?)Ls}LCP(M$|d?}sa4a= zwA)_EQP9VZe7}p6elw%n>=ou0YT+9!6z-bxUtO7N5U;+`eWMrO+-fO356#Bn z?l`g&_G-C2YwM{i4;+! zDP{zUPGD=#fxCbr6sdC{{m!m0kpd^gPhH?r0C5mGZ`W$<6ScyPvzTz7On@d!fHsZ4 zOqwa~E}NX6DiN4@GZqg+vPliEm+0-2sQX*Vmx;C__6=?M$Ej+xpX@YE&R=QjYCPAl zcu8xVk{_gCbOjumGz1!L*+V}*8kn~(^}NaU7mt|nFdprAwhW7!eD!7>20I?ao;$T> z@$#(KU7Kzv;PtXkcCiz4*Blquwn)lm|3>j)vd|Z*ZrxPpEqNK;b9Oxjc@(Wb*yJ%8 z@9qfxBeC{4&Eo6z@x2Xm8Xh!a# zpSYF>S+c#}sLS9nBR05jh*8s_tL}Hht%5h4INctrkq4*Ibms0AFOqv)4b5AYnvrS< zsXBS+l2_1dY{Rmzb=J;GpF5ZNZAoCZ01gaKrusu|lQef``bVV!+%bn42M(33$YDY>f_`%>&>94o%&OSO z)y~zA>+cbhFy~iwe;F1Ae7FRoN1V(_=A$ioZlt3$73Yhb+WxgUwoRwA`R4)CGRP5l zZUj{#TqY+K_QSq6C99Wr$!gmzOLc3V=W8=VE7U~JUg{Vja?Dpir1=R$BIIo*U$;zN zdSf;_+11+#!57&C*%=&IBN^qQ=Ao93!nnwZ>>)*( zcxN8l+w%6?VeudP?D<^%YW!2n?39MK9NbooNonYFrP7P50fNY%G55H9tY%(VA@%g}k{h9GzUP|4r=Nf=|5QM;5L ze>oEH5Y)7O#+4RQ4+{7zQ-{evTNY9)Kwt{|Aqqgn?VYu zIHWZXDYT>0Es=*#itj254L*DyE(>tY>Nij!+6-mFbM$K6Rw$iA&xaw^Q@YZmG~7|; z3YjoFYnsYu&o?QKOdO&6EbZl1Z(lAHo^xXY`Wa-IZg`^uG^O#rU$M>d2^6*(uz=4h+)C3G19cU}m%#%x?;Z z%h08aJms!eF00wSV9XZKY2Q7^6N#oh@6A^V)#&wE_W%b0H>h3x1epvQWi$1>54D;h zqmI`6qUjf-iWmCaVS=Y94;Ov5Z_^~ zNh&|Biyhy5L(tLdB4j>gqwcF(&wm}9mJW z>R9Q8_O|)_UXJYQbh%iqHrhxoIB#&oX!Y^>_gbOU0*A9+;+0psjm)*L3XjujtHVz= znxI*0r|>{l!I>1sa`or28e%FEnthIwj~(xa+yz@Q)CUoqxppuX7lzCOe>hO+cX|KY zQY0lyzq|32dSH}X^%i@As-P|ecn*jJcr9`SN<>^OHnUg7 z2yQ@`_On?&ZfaQvyt~=!T~@}}`3&6!<721Cc1qVtpCySso2B?bKNzv--gvmO{}*}- zl3@EmlXI+zG>;ZEcHFF%)w1V?sSyoiiK{sg;91ZL`EPh3_MpmQS&B5edViu^6>Y@L zGPPx+2~k9ftii%I-^R-9$^-6lx0!^}zq_r|%WauTf@?-BB$By+$gL@3J0F;%2c>HV-xpX6!c)iyW=*abW@zZ-H=RjU>&URxADPYd4B@n)rx|iFunMxyMuz)S}=b^M0Z3C`o3}Lxbsy zLCy+qo(;X0to$x{?m7k2_;7vOjDz%OM!N=V9hlx5h2JT4n4 z-L1Auir&B6dsDwtvFH>WEe@jk0r{}|DJx>>B-pY%m#hufdX&Z=y);Acn(@0CtLSf0 zx|;T|Nzd~WB6Zgs)9X78^!$wx?C}eBv zy%G7(MM@>orx$dVBQ}jWUJg|**P|J!fNxz1(RX_nml>5*QYfXFER-jDX`)Z1n^)EF zk)y9EM1^d}db&!kAKT|2o%6lehm266mFAA|-6av?m5pAvqhE*#c0wHCsm;9%t7;;K zhdmai)QUk^iYVVzXSSn#uug?Us-O-xn#OdJS9N%D26H3b3?BI_ydMAZjW-I&OsA%e z!-T$b^X{@*9!=4Lbo*>OZq@2URgQ_)-LxK9z$bXjWjWpS12-5;Q*)iE&SNT3s`j*i zJtC#&Q>XE^mk_%07b`NIu}pKUlFp+&wE}?ZNc*nJ<%b*Kk_w_cYm>@uJ4-iK$J^kb z3caZD1*SC4oe>8|o=-@Wzh@AAzeNH-brl#1e|m0u)zn(cF}ImeHb%vg)%rtrHrw@@)c@3AZooX5&aR>m#su_M{4!2?G74mO4{i}4q@<|qD2UB;tr!U*tp{y+dnrm zT{+@*+2X!Q6tbJS57PZZA1XMxm~X@Ke-1y!b4mVLUt@gyyQ;?~V=#-O$P_D;<2N5z z%K~M3MU>cXH{S$VFnV365ca{q^S1kw4~(mYgMB$Wp1N9uda#Y$qkw}y;ZOYiZYcie z46JJ_XhJc)g)3OW;*92%(ZUc|%iMr8F*sWn30EtjpRi&X5;EaGSA^&2iQ|* zD^2aywj8Y;%PPxYXjPa(;9yAy>OD>)Onn1X%r$9r`<_!2)HafRVJ`3Mbn*GGdl!Zmc+8wTQ-Yo zUHADbBTm)6IzQ`M++CYx&9pw-9iPQxBud%}8@GgiWTJjyzr5p)QYwMxpu3|D5UQXB zb|C!w621)BMQeuY(4w$4=EB{tS>%$@^;Gcr7`s~l+Z0<}(dqh`w2J?}XtiTx8sj!6 z+osSf6e4$1MdLhx*VH6h6Z0;6JifZ1WzZge@C}Lli|mgPFy-zpr)D;z4z{8FF?lIC2Q$ENGl*r5B%fGbI1|L~(jCyP!n) zJ5vQi%truxDY&Cfc!_-3X%=S~y}<^r`JjqIf3kZ}npKL6-uB?qdeomNgv9i!uNYeG zkcMVbO$;M)`G7>ww|Y5B4Qtx^Q_p_ww2pnZ!{9YVPS^2I zx#}Jca)Xh^HTHA%4zY8$PlxRFuG<5P(VVH^dCTu~wMa$9O;9 zT@1LgV(*b7X1ay?tV=5M(v3&W#4pBXpBt-hrp^ZueWcTyVo?x^{F<8kVL|&x9B|ub zx?m*9+Yp8A-7;(nr>k@YK z^mNQ=-D;xfSyQ9BH>~8lUK^gHH+s?NXgw%E$WJ?L0UJyj$?N*( zE9pw(kr2*BHH4=xRhb!87XTo$T_XOp&BFOH^J<4%FP)&R!YRHd~MeB zkGHIdV*G5Q0m^|#YAm2IXiTZ-2m08^US~{U$^p;l_@mfoS`hEXqEEP~&g= z>)z5#j-rF*@vn+!;9dUbWu>bO)?5NF1>PNy(c$jeg~6hqE7nqfM9Nq+V(b$D0hdyf z|EGXMZbER4JbC)+95HJ?Y2mF;>;crBbmE$Mk$YYPl|~0E6ts9dLTQ3kl6lUVB`t;^ znqoY2LZB~cb6hV4HHx-TYk#qNv=MQWaf_`_+9AM{V)7H@Mv+0qKhnD*A9OI;T*S0E zmk9ePYAce9)^?xzSNPAO?_Gc64H5b2qRQ3gAbe1$(|b5Ahr<9_-j8Vm)2#LgjgzA6 z3^+wHOH+I=Obr%^6bXYJf6@jnyVtU?21PqQBS}kXpPFp!v@=%Md#6*gJD3l|5IzEq zK`Y~t3W7QG3dHrm%TOG7;%!(_MhUI<;}zX8#NjX#^{=)?E1L5!wyroHLXg@IMQo40 zI^8aMG=|#wwQ^Qr0C>O5JV{%kmyVhKa0max9`wT*x(nxfl@evyr=KQ>U2$U%y;>j6 z)bC%>FQ42{i1^#QPJ(^Gl3#7wZS8}CRXgGrA8q~dA{C@Ts{Lup;t4)Y;^<>YvV#4! zH4yu^{*~TzzXP?CXI1J$PapIc^))9+5mVI8wLB2rwax1ii%Y;lqm4!1V!@#1a+f)0 z8(Cn54m*6-1KPEo*gSzL20noDcyQHcrmT`ZAw9vMCH1`5No(q{I51!6b#-a(7zry8#-0cZftpUnx@lJwL2*KeAZ)`EHNo0ZhzWrr7V@qR-Jn2N>Fs z`)a{Ar}VWUH$fktUjol3C+9@oeRKY{Kf*KoysDE13^jD$E}KF9P(!W5#n3T(_eiX_ z)*}fFifkE)RX?F|F0$ zuqC|GFD=(H4B`imP#Qh0%C*egF=|HT%Q=8LMN2dE*0N_1k-HBY6-8*tHKxH7KqJNrzyP7_Ig&Jg@L~o{ZoRL?e>tSR0|4?(}xnTU()N7XY zTAk2zf||nCYEpG@A@PQO>#y?V4%<3rcb_^BPw&ObtUd@mraJ#m0JH~7_}uxPspxj3 zeMlLyT}1fsZ>TAFLt!T=&cHA^Usq{N)LKEiPS*?Be1pzYbc(bO>kPU;(HBU2s9jB$ zhCwGBQS^eVcGf%Yx62!9dGw3VFuxP%UfK=7zLH76!h96}wV}J{9so;QA1K9-I`9-n z{Yx3$MP~sr8e1nwd#Gywm+=iGI=`%ET#c72zZI&0qy3R6J0AD{IXI^iqoM9RMPDH8VYaL3k}&8fW(B)Qu<~hgoOj|{=rj8D zWV)^wvSqQRUK2;rDbhY{HDqTg`T}VWwX5ldVNfJ0$G!%vWtOa^H-K^jQ7xn|NSy$0 z6lK$IcryDRh!0U60C)jS$A{;E#&R{FCo4+})ms*;zVe5a zFZ&LJJOteU000310006202(7ZIbRPv^#B=2B000000C)joU}Rum&-us0z`$w#OW~g@rxZ{G72E{?Z2<)x0C)jy(gTnr zOBe*;tg63zo^iHq+qP{CVh3m2wr$(CZHCXbLW^9pBfhq(GR-tN5w)nVQEp(dZh)Dx z5iO-B`dV)gkoWMb4j8DXW13!ytj2|mG7k0CBvjD#P*lCaY*P@Kc>f^ULqXJys?#PK zLk-DGF0}(A)l5{7)I1l!e94JnW(`_68lks@@;$F`$SQ`hRz)0==`@PRgD~6Lj6*sr z?urMst-pA_G!EJCd2I)IFPgVJ^3k-Bj5AD2pIbdo;sOE$FA8&Fw#ao>q$>MG`|yP=EByNLZQ zj?`EnE-aIwXczI^0QmK89{&xOo`cl9w#Yn2F8eoBHqTMSTt^meTkCbGq0V6sx4&CM zFq`|+q&)`89CWlUBfx(zppIdsJcQfy#!TAVM+~#QJnx0q*vzUTTIlC! zK(%!h43mCX!|ya#zp$2>cH{XGW(g*mRm}4m`r3cNX_vwPvkh$=b@9IxLC1*sJAs3; z3k&UY%zh(tnT9%iS6dl@mFf~UIR?Y;aH5mxg;jbe`kSHfTBWekE`Z_6k8V^+bwyt7 zM0Xv88oDX>7hsO=3O{u<3s8ywQl9hFTxMatG(Zt)kIMQPMoQqeNO^2yrRI>zR(^|6hx zO|c!dy&?QW4>C?RA6N{(eUHQH$nO~DIPG}mtm9nj{O)SxI_NgJ z+qw68te)(i5uS@)x3|1^ly{-`zAx#k@7v~2`iJ>n1gOB8!2RIh;I9xFN`)?kUW7ro zZFpxykCckciX4l)it5oC(Yeu;(ZkWZ(eJSau@iA3J}`bYkw5V}*)@3}l`l0XwLM)h z{YVz&a`I?-s=PqnE8md6DHcUkiYP6V0m@uugK|VIq1ICmYcZ{YHdp8LYX8>L59v4c z4}bzukPB1-^*~oJ0?Y^7!8!00{DE!=VKG=2c7em;e7Fssg-_rgW~z~?{a^0?iZB2G00031007|n8DZy3vP8lsWk#~9rgc?A zCNwqe(N?d{fGKs^7hwXp@DL>>|FLDT0-@s~#CQQ?U}gY=|5*$v3|IgFDjxyS0C)l0 zz@xo^L7QO{BR7*a<0c+PAi15#%0N?2h=D_!VLM}Pq^prEkhz_yEB@{{JIH88Fjsp!@Wh#E2(QAQP5F|n}7FfzXWGHL|UT2ytCp4oc>PzUmn&=@3( zs82mQU`c4VL7+9gFVMIMBO;AT)`~O(rKgpx99m%QaX*vZj6s|^wkn?n2XJIs0RI%U zqm%TV$haMVZ3@~;l})#{>a!LOqY@(l!5|HkFd7i6F=H5*IWty9t@?|ya=Ax1Br{*Q z47yr$^3--mZ3rOVZ6^HSpn+q?U;1`e=nPor;ll3ldd6d~-01q%sZ+0169dk7XtTG9&G z@|_8T%t54b5PmuS|KH!r_TORtx|FQ5;-_afQWI^86xDz4Vc&octYDjASYu>oKCHoP zPJq~-iLo(L{y3|{nn*g6E?rWl%}G_H?L@1bK;PQ4d<=qhQryt2QN(h*YFP~FF#b># z1TD=NP5*yY(-oj}cP@>zlWeP)^kK_18h}Kc2vUwnx{*hhTJb^Ug#hLEM9HPq?QV3o zysVSqzq$b)!&3_CXDiesy5Y^zeZe~mD6o7OOMM>1r0WSm>k?&12|-kX)Vbrzw*T+{ zWm|97Rl>Di2nSLdi~1|j?Fs@=6Gw_V?1=C<7+yN3BoF3SmSp9^@wzl=0en#aD3xvr zjXu$5P|R0x?d2r}FsxkQkG*PU02tJ255yYJ>4D8ScZsdoESqN@$kx1^ea)}^4k|wn zwb(4I!#k!$QQnODSWw((lGJ|~F=?FkrJJE(r}%TTLm*$}0nxQJ`~1-K{y15;fS{T zLp{(7eb5gB+QIJ(!7z-#C|rZEkCbvS#_<<%dl_-iYB2y@FaX7jevkQ zXuxY;YvkBtY_`AS!JrM=p#wT~h1j^%jbY?`;$H{`gg_X?%)Uz z8=^1_BQUC~PW&6e5CUNk4@+SXhF};*U^F+TP}-6>O2xw#`y1B?T!$NQ6K?5JxF_Jl zTG)Wofj965-oP7pAN!uVaI{E3lzQwj63>uI-L;0j4!8j~;TBJfxigtOF6sAD-^HXk ze*XB2i?uLA=?B$@6bj`GVumxN`H3T6o09 zYlt;jh)|jseSm_ocKT^M`XKj|7x#X@y8^%TIGZ5lknIb;j{g4s`>)*HzeO6pAB?;U4`6g=RzJB@3 zw;S6CeduQq*uU-JJ{TGuTkv{$*vRl-e@3Pf4KMfu_rC<{uJX3iFFl*;(m%olN_)Ak zxaW!HP%ahtVF%s``_{~GSk#&c$eejk*q)Z{?j%z!TcSu8`lI@#n()E!tU+u7n!_mgZQoas9)W+ zdkelgW95PK6~C=MnXh88AIKDhKDUIsfBZqM_!`<^`(vx>H`I2QHj(OPh4|ug=6;u4 z!{;}lpW`5BZB~22&hYNW#I2&GGm1z;!Kr0UwnbY41^HJ3a{fti!)w=#!{+@ zDW);C=pPHKZD47iQMRtSCGI%=pKr~acn2FQgOxwENwb*bdk!{Z2;e36&f;1$JMQ_Yi`lY z*f5CmGM$p}XoNXD@GjYFj)^p!j729u&EZ1jaEor1P(=-OG~lC&U^3|nK?$RwG6M^C zv&2J6qAHT3l_j*%L%X>eAjc9pmToC4ts?x6I3#=FeP?{lVe{-2??Qx=H#n%FIhglR zRK{QttZ25|?$Ls%eMM6&5{z8GG{m8XoOXH)4gOV(`5~Hd-PJj1(5hzB1u$Hp04Zjp zQA#NXA*x@RvIE0pV{<<2_|(QU&xMOjC{X5rZ%D&JqW-E z0P%^DV)%jb*M#3>&zk}?@+<((ua0gD3#y?bc>zTj_AemAtCPeGZ|^Vh&H_OBCie(PpiR3Dow_udt6Ps=efkZUXa058q8C``wma^+=e|WAe6QD* ze5r3t-@vc2#NX(<2%zlq0LZ~BfW<&g0dgu}2{6`@!LSS%Uk`@m!1z`N zD}df~#LWP#1bV9xw*jyk=QSj4rMO)|_RyqHXX?O> zRQ#F30$>1u=vb&mu_I)ec%qz(j-4uV`lbjXA~JVPhM!RcLj+>23Ya2F%elw|PL;DwE)x*T_iD~KR`8SX7JWZfLZ!%{W5Cj?n=+9i*zuv-|GMWQrBobj>t})EUCWr^7Xrz4krGo- zsI@k<(VHK}(s7TTpcumsC0}ejsT~-twIvra=9v*FIu+4HsEXQSHU+5ZY9d$|MyZ2k z(=vWbO7zIaLqlb*}ycWXA#ae@V!BKX~HECma8mVpjGu*?@) zijXy7AqJ6;n+*Z^2s}mOXN0Z<^930D5w=ekn{b{XE_>6Zri>a(F2kFCRVFq+WxAw% zFbBSx!X81C?U3Yqwf(AUQScF0RTaYGDh_V4*s~I|u_R(jP;3WF7?U9>K922|F?h?$ zEro{j9&bLlfRlBi$fHxJF$B4~SsWWL8{^ulF+|z9PfkJ9dT>Up&DLRZBAOJeu0zx( zmFvQ3qfni=r6!x)m~5-+wJTA3<8f1_n0#{aP-n7mndz|GA3b_m`q&_Tiq3T@4qAj* zYc$qjbHvi=D1%>_1g_OOsQb;SF{0KhW0J?#EnaEsYOVM_2~y$#D{N(Rw3tE`{%^~8 zri7Dwt}PL{EuNm^jy86ieGW0J^b79c8L3iwBPhZs!m~iOqFzS=L?(8yT?@9POA?li zASe*f5~ctN{@aozAOXcos+1sQ%$73*T8t?Pb>kMo)wbDMLtvoK_(v zLZQw>pi!+CC^WN&y+@pBmq_z7pNB3W!!4o6`dg!N-n1)7?6s1myNMHXC3WR*g>9{k zHifcV8G+2*Be-5lmCP`{Kx0rHt6pyd4t>`T^g;Z?3Ui!SSAdF@8T1MUT0-oroK_{y6I5|c_*a|6+S0R7IXGV;1Ug|(llmT%+odd*r|Vroop zZgJf1-%GqrLFPvr++CR22O_{pd7H%3k<#By(EopWu4LE24aMzOoaCi zZUaFqKgTsKaci56aX{U7Hp_qDO~in_))B?ZOC+$R6Z1_ZCk9g`M}V-ds3jG5oO^}Z zq}6UGSX;m`Yzcr=M;v9+r!DF~c~>zxwY!<}Qc7jv5)04)N_td2ueD-ZlsBo4f^?Rz zCBLd_atJ}~%x|b6xV$OBi-yhh;Bn(}f>m3;Hp6o+v&qXCWog8E2M$7F59C3s^fr&p}a zy+h2KIG}uA{Gf7DimNi0MXjf}Bv(eQ7R3$$dNnxJN8d&HD9B~p)#{VCPnYUCHE_&j zV~ktfrCY7%t!5KkV43e-$F#1W&e)h8nKpC;w?r3;$1?JekSrz@4VNW?L=*vB%PBJT ztG=-MSC2Bq55awk6!}2%(nu0PGM-Tva}m>GDq(7w7>t-gd?R>MnRrvU?iZpRACtaL ztkeJn4RGS?hoF9gN@{bl99kPyEu~Si2oj;>E;%4qQ73qWJeI3zAp~Hi;Q)yG*aOKWjqQAMf z$(8;?buLH^MszGvO@a7+$qc2Ej5pCXl4KXrr3Kx-dCeMqDaOQAr*@Xm$`R*WeB3T$t}@wg zMmWt`U7V=Y%bgT+Sk#5qMf(XE#ahjLW~OsBnabJ3kQ6J4rZgr*Vxwiz-Rvb>upnEt zSi6Hj4+oPnXXBIshoZy-?6Q`F&4nUn+~Y6W9B!Mu?lBO?%Ct&JIbY3z9XJFoI@ zF=Xl+(3Yz6VIKbm0RoCZYdEiak8FX$hij9fz+0oYrh7bC_JCV4!I|X&V5#uxjl$ob zE7QrEzDHz+oOPK$p)@Gy^kbiIF|DTZUCTn~lmESrN0i2L_2>X}I-RZkB#1p$ zTs1x0bap6v_QCm%SJM%tl|5+;W)6vvndBAD47SceRL?(bKidWye0b*G(@8=Jn^nbV z&nNJ#Z-^^z{7!dRib)K!kwmPjqx$f8!XsRqpadT?&j5m>10n({Gj3B~-td1@J=LTR zrg(FCoj^G^?q}u$4|R472=o8;%3Mh?6jz?nftL-gI3uj9?F!j#g|wz}QbrB6jF`US zmeq&;UUOjTc?LPt+G^1Szx?@ndmw3`B&=b`z0uOZIB#obb-XMuzJtjr6h$S~#QFb; z&NsIXLb&m2iDuVq^=`#>z`pr9Ph9bet&z^qGFehA zw(NuR1c>+js$jz|#tM!28r4coPdZ-mj;X&j-EjNsMz-9rLl+C^X1}lqx(T(2;>03& zLk%dRP)pp7RGjvP{jhDErfAqzZaTs}7P&;xLwkx>8 zL}Dar+4!mL{MALI5NRHpJdh5~`}V%?{oBXt3~QFtGp~EM50#mg<=j7;{?$}g{UHC2 z|F(~JXL&UcUxQ8&04#cO7Uq5T1&_-a9-my~4DVi7s^xzbMs{a^UIY;}GmndZxVOTF zQ$B9*%$@xcVW4)I6i{etOL3r=mgdmgtCI;>Y~KuwICZ!+fJ|WF6_TYE_r&ynel{Ps z9T46}BG5)#3yPbW`B{C1T?ESA*o{NjA%=iyF_f41-5_W3#L(}yyV;|c#*^DR%Y`%Z9G3Vnf+(eRS4t!|reF?q!SwnO4lAmr(ko0jbS-Qqt6F#Ww zd;2~%zCB2eET2D2>Hl+gW$pK!0aE5DMLtL_x*f}Yu@UoXi`yhOWwiBHdz0{)>aybg zDvk^za&v7`N_}~JOnq@`a$`x%y+12;rVhf#4Z7C!ZY+gQ+$&h%g|> znv1DDAz_R##E>aA+UfbSmBBu0t!v%!T4Ho7RI9ZSeWgki1+0bF(ht<vi=AX8 z-YR4M5&aurZqaNOQVFD1`TjhVg!7Grf!u>ehv=yvc_Ug);eXp0Ay#;KOI_9b{H4~> zF2sTloKgN7NP+j7{pxtE$d@e?&4qg&Z3-@`+$CvN6y)aS$BLJ+!tjxaQBDV%3K?8B?g6kAt*<_I z3}B;b10^U|i$o>UYF4d&<+3StTV=aN9zTebhvHYeJh^zQxDBOD}Z)eO>u| zXR<8XE{r8B{BEj!b?&Fm!^;0~u&Gxvtd`%;6}mgedxTqc``$|V9ao!}N?r5DOaB{R z)hFm;vU}mBjy+fHFP_aVjD5z=HrSs>P)|}#M4pn`@1Rv#Usq3T@AD+&>AQRNt(04I zQUqWPP5jN73h3-na`58V=RG$VkY6cVtgf4XE5oYnb`8)^6ZdCFRxm8UB~E3*M>{-0Yhy zCy>pvR0~)_SaeiNlD)`giLK=}I?283uKFncRIwM-bg>C#Gog6ILB7bH9d~v}Zu{ys zbayw((t0d)hN?uG8~)wTyPG#nS0%e_0XrAVFuE$v^M0_pH2lF@V*}?$+lyCT%Bu&d z+S>K8-9J3zc{RN7`{9S;oUo4mhJyUQ_9kGJm33U|a@Otn)_f;%7P5e7U8h=(<}^k0 zRP{MxT_doWt};*oXnlEz`m4j`*K&nho^@XF?5RgDxt|Qvt2R<)a|6%DE0;`17WY4( z7mYWxx%=t>vm+bmojwnS1cDY~{KOXaVe zc*G^oyIgOBkUOr1H#QBgg6I8JxH&+j)m)sDr3m}PD=Py5*tHg##{#})Y05PzLnom_ zcd7hlirl7D;hrcAD}GC_UWGmj*%w}MQ!K=lp=~$j8d5USlE~ya{rV9xl#!51u8MYx z0MvaPc)(un4uXEnYT&m-l(M*$y16M!P3P#OSID{dpvN;Q(L9wHgCpqdWu4 z+8f!CWR-Jl?tYPvFT={9QiP1XwEJEDGmo*~ zQ?5SAuY2RG4WjNO6F;q2*h2Vmi$R$@IrGM!OQd!6%MPC`BMnP)_4pw{!SDG!lb}7R zXQ|C~<9?rRcldS0*Veb?8GgVCy)bX9@R+e@I?UvuH4TY4G#0* zA+8c;02viDS`6@5CBJl@unM5orX*o2Vx+522;c~TBTr_lW(FI9iY*9sfGB3J(fd^T z_G#Pi23rX~?gojH~-=Zp<}Z?2RJ8WE{xj&5pD$=jBWhrphWh_*Z5sesM%GH|Hvo9YXzbBUJ? z!M>NFV4^znJ8z1JuYiFjTmW?EDpnYA_RzNy)CtZO^mm(`6BIz;plYxj@;*-D6ayth zkxo+^6cd+{rJEx>&EeBQQ1`OfYtR2FPnzgc&_wzT*I;KUK4`hXnLiEzw#0fWUooDS zIzOI${<-Y9NBG*fH>MA-ik}g_FMCpSzW)mMW@$Z>Y_b#hgygUuN)FlZhjT~Jk_cxsL9*4n);zq`D^e{VZ5x+2XziCh^R7>o>8 z+pAzzs+o1v*NGjgRXyHbqioEoYmz!yrWDsQ+Xpe9iZPp_C(`U>hl~00)TH?$+a)(; zHxll1Q11B#kMTovm!|;51(Ei#^GrM1y1F z2-i9T6|cayE6g)*G0k=^QddoKoa(4mGiF&!u&Qsjuqu>{JDTd-M}Cd+#ZSrUCLGzN zQRGCrj`;Gu-~wL%B!TR;EQq<8TfZCI4&h+rhw9?s5|7ba1u>dYNcyJDJ&8dYgffJ|)D6n9K;cx`n5a zNQK;LcquV1wvrMMsEx37bn&pzXDph9g4kbHo(RvnA(#WM>?HT3CKTeX;W-H45S~Kc zmW>`~62EFYVlo@}^75YH!`5jV{J)>?0k{qI16AUy= zw)UElm~Klq><1j25*&{cvhL}yeBfQev=!X!vgeSKO6FOHlTWHgJ1p4Q)7r+#Gh-y9 z%xP^63xWozyKOc0CHO$g5GmX2ZpUmlYuW4fvT1?!0Xc6HI{^B>beY_93S=5yg~ts; zxoX{3@LY>blm7QXphKZUms7UTSA}w5`Wg%~K@nQ^AJb#xa+omDTM7hSFS9Y_irmsvX%%HDXZ9LN))W>}WqN7fe^8 zdy$t)8gXUgp*e&Obc-;)Bd!PG~A{HKu&yMzTenA54PJ;&K`!V^ z!#|4m&_)TWrkws4FG<_Cc%v)YS9${=?Mx^vt@ZmgFa3jrlh6}wF^}*+UrV3a4qCff z*{zK8SF$Se@}KiG33!<;wk7h{y<~c@yR3D&m*1?vamd?(2$b=lq2?urE9Ua<6((1G z^Hh!=``slcVFNMe3Ty0x>*Cxl_L&KuR|ZhoLGTD|czS8M)Zv#)F7?AmnY81v4%aam zfbjDdDoQ@DPCi5SgAXMN{=c>)u>&ObMOcJqa%`9?UrNNE{ZyuzIK0b?$9JARIkV1F zv6S%ZZZehegsRo3QMHjtnLPe}&*%5JGn1b-t>VJf>=IJHEO?fFU#=PZI5lmH4>Ihf z$=mN5pj<^W3~ghL~>B82y3XY^1Thr-@zW{1GJR2gLykR!hG$7pIZy!k!sZ|L+xc#v&3?{}e!C%My7;DDC8q<+H zQa$1}a&Fwj9~q4|RP)f{Ayb=gj;h?Ms;knp>st-r27*VoJN-J*E&W4HNoimKJn}Z> z8_EBZ{_D2kXk9T$t&EXAN>rx64D8bLAHN|@K5}L*!B?)*;h2x znp@of6|4QUYqe(bt?}J!VY`9xP_XfUu?I7~ETHK&FKSrU+6|Yv*nfqQ7EoDY)-G?8 zn_mwLfObxMI=*SF$^t0K1q{pDKEq{B(-Mu1VZhj9SSG@7+3=zz8b{xXM#m^RrDhci z3o|ThpA45#_Fv&wixMSf(IWuwo2cjklSqf~Lre^TvQ%N9tOqR-7b775AFLB>yWZpbG&LooB|;2( zT8NV$>vAcW7z?G0F;LD21La&FQDPR7X}T*417!smC>Mg3h*M$rMd?IxJpMGTkyk^} zhKwQ)4&wN!R{PpS<;HvYsTq-Ma%<8rw<^_?{;43kVBOh|$b_e0cIIFD8QbGXEli6JxIPnEkSg23n^|AF`I@R}ch^XMkN#lX~X|@CHK;3G-Xdl|7qlTsnYo6_B zhi?wh2kMpCO6GW<{rx{ef2Qx}_o_~=rY!?@QF6WV3fcbI1N8LsHCNlc7+18=ghL$;$0`zAFT6!7wRTx(oG50?mCMNO+ zY`hR{G(w{n>J=b=7{sqe?JY_fEc#VIbu7s((cf-*aN9 ztLhnCp37Yn=K9wAZ~O!*DAzXvK$u+Pkph5HhsDEuJ|tUek)G)RR(UJW(6b3#sn5Ww zBo0C$KU_SjDEkmg)eEehJSR%!l;TSVs?}J68Ww*05C%IXynsp71kXC2gJ=0bJ~5ZDgB{NO+ZbVJO1&x?#kvDENCV%d zdFh%qz!!#+>v(^=7r`Ags>Jy<1kp@DVJqew+Pt=-FAKNTbN*9;u zM11Yh1Ujl^k-W>rn{IMZ7$3MI05uq+8VIZCn$p-NX&P{j^#l)V>1m2$G31GRl2IB1 z4U46aiv`^bWd2E1wmE1W#(->=u$eX(EO^|&Y#Mim?Rc11@Q=X7u6PZkkj03_4l=Z@ z_Zn?qoc(wvjd2o8;{1{NSO#?!9#dlHSriZoFcy}`ZKbqL$Qkv5Shg`=%zlRW8bi1mwDAw;m`tZZ* zsDtS=#U6XwrWUZJ_a`E0HqZ;?XUf-*aJ6S+plTqxn7Q;pNJ@d+UNbmaag>0!cBtHh zkcxQyHez#&;x&vM!3IK59p3sLVTE+}xOype%AI84h;TVwGW=3xUz)PdWhAXT>u&b0 zSqsox8}916jeCn~t7SBlQY3#4iV@ZoD z%_-CP6fM!Ih9+LD`G#~pXQz_@Aj*_Ynk0F$I${cF{+2#=(bFgyOQ!ZQ0uzl)lm&i( z!#1?HT+t%u&Re@3R-4KJp1T69jkL)bN4sP8oB|CZ*HlYwiERJT4NYdZIzo8?Z8=;=~-a=5Yg`$FO|BVNqbtm70l$a)1M4?G5D(skG^*b^wZSdCQ! z0FJ2><3Q#OLwa%-+FBi_9oA5cZBE;W6)0Bbq#l8G@SPwiv@vg?ZsDkg%s^_$&8pzySA%x4AAL<239DIRI9(9PAjE z4RdG&(hCX&FA-8FqG)f(c#vA26hW7VRD(^T$Q$0P6e?S&LZHNO2RtJl>uKi>xU#KR zimQV?^H8S-2=51#?o4!y@+S#-t_%79K60f}#5$0>&Pb=uc0|b-I=5{@35eqnf48&( z=QkkoRp+8mfo2LR+&SSV#wpHB5dAj`lE?w<=5A?(MgVa$u`$KMIU{CUBwYR#9Dg4D zuVMDALAKR9Ew;n0119@*9Nb9H3?4%NJlmp=qC4mWWb8<-6;7H&(M& z0*e9JW3i-BQT)^K+iJ-t!60ihjf5vn3kW6Qy9??INT?n2S*2MyhEIxe6O^?+ zi%3zkUO>?GQ^yR(%LmlV!oXphjMLdCTuoPa3`XxAyI7H{%%s2Knb41z`jD^@C}50D zDOy6)7|=O?nt0rWJ+M+Pp9+`9wHAe+;b|!KIm8EJ>xxNNHQ}ehwF)|Y7<3BeZ^#WJ zLdB$Nn(il@tGkPxQutJ9Y{k{@5eHed>?mHUu*O`?!6T!kieh$vzVl7*PA#>V3yq_< z5#^wy#_fn2aw)(xd7JXJCY9LeD8H?f^stGD5D zPY9I*N#B)3v1LVB7_|+3S!7Y`WL;a!Xhbu+-RWVoH$#`fa zG7N_stdU7Zh{!*;tk0%w*aSrukSJA-@vMUwkxgB^p22lw%doFXoeJd8E}jacPY$h% zA4Cc@AA&rZc178gFqK*}hx_Hk=$Kg$^*EA9{80|&-cEui=D@YNo;AuzUweJKsEnVI zNTYe~Ph55iu_uTwZa)F@5GzKJw7xI-I%4>7)QCMiUu?hJ!?hRA{_h>yb`pC352;gTOE?DsU}Z0Z)tAH;PCWJ= z4pT?y=Gu#B4k(emw6jOSOuV8~g5>T@woxsyP2VBAw}z2hQ}a%>{@3}4M&8UX=a2Kx z`LBFxT*;xqjNRSb#0exem#B!dkybfhKcAql5h`nRm77=w2T=7a8BhKtag2|lF__=F zGXd?B@vi;usCzr_n10>q;c%q zAt(`0mWhQM^yM_;kIXV26HVAFPjB*s#8R`5Og)Q!?NG5Xl1wM4cLx=Tz7) zngwj#^%8AX4#nl2=qRA(yUTN%YbqNT`IPcI$$^;B9w2_*%&sqE+&bsu2DM&L9)$tn+%PQ2663MFH= zIbvScBEiA$O2Mv@x`&iWdvc^D!B`_#jX8B)Ix0wSwZuSHqr)auitWVYGXk81_5#N3 z#-c(S?az0+tdp@M?NU$q&PSPeDqH_2t zaa}-s&)?)bUFh3#49>r6!i4{YN9paC9U1sc$so+sq7W`EXUfoc4DPaE=^}TMZf>*| z&<2A%UL;XcP)OZRvLxv=hjL}w`vbc=?SKFK?!@a6Pz>TXQzhlPl;$NgXpA{W)}<0p)xv2M`R`? z=C<)mIejdm=QOuQ0$LXab(+ycR7V8rLfRi zj3riun(JMAd4AK8rI9f`j^B}(NDv+oEMpG$w!c_SI3o>Dp^C!ybcEXe75{tz4MRx~ zy|i0j2O@-^v82!6QnboHDWJDKrTk0i9p#>~uK@!Cvb_areL|5JZiToARRR8OppT&o z^i)$X{l;9e3?)A8>?h#(H`>yT10y_s=!;6Ld*Mgj=n@d{1>ga2jk^AwrYBcnQLU5Y3@wV2@O9iiw`Z;^ssR8dh;m2Ov`;$pF=tZ9ygFk`RyfC8A9F(L-@ zO_P=oE7_T-t17_-F`)C9&7VHz{Xe!|fNOjH612r)FMkv9@AR)5s)mbFfa-snpNW9V zbxRFEb)}`n@4(dmhWv~NxkP4b9QjA?%};HNaLa42_$pM|-^j1`^4b*TvDA{-%qX*r zt43jM0q+Rq(B4>?HpaWMGC&K=f^_hQeNYdRL86w`j;LwNd6%A^J>S|gQ<+WT<_N{5 z459u?Yj@PpeYDn6O4a7jWmfk6TEob-$|3F=Cd$n*y+_M_q*$V=KGa)xP8T{^7bI0b z=l-Xr`e?!|;!`iU)e!v}l+xa5P7C&=5in0PIi*M(EvJxcW)<386HKcTd1Wjm_Lx*f zP0g9Mv|(%8wNa4o$bbiCJ?knfRB|ak;o0)ym@3zl6|3l(vv0^d%qNaX`J8=@qU#Y8 zW0!!|qb01`@3FE`Us9>cYn7>eP=4HND{AL$uUoRS*zze$ZZ5Jlcazstm6ODjO+u1v z%gaYxJQprw#o?#2q?*Qvjcs4N*#2<|UEAv1WPa{Y+DDX58ZswWv-6OoIRvll$HTeX z+igyl!uqL4eC@TimIyAX^pgFQ-FTjCyk-V3V)ymGn^ldPcOBL~C zCp6_ATWOjnO@@WdQo@BwmLAShptNF3@72PE@E0gTEJT~pP5d6iCUU^?Auz_BP55@>vMNt%H@$QAMPaVJtKqU& zPk$G$IX&{-Y2}??o+hx*egiF{4{zVlMG~#s#k-1t8mI z^PSmPp>toZ`sJnipSx~TlEkpe1$_yYR|xhBWXqq+t5Iu;#EIO}tnJbS70st0x$io@ zoT5^1H1qv8fdzsp8DR1kc5X?-rg2nMAs)Je@E_49H-E?qECv4*CDtnr78re1&VZ_|h*D#J zivrtZ?nFyuH^mJm6+LU+QWE3S=IQv!zdp<%QAh&rBLyGkGhu1LIXS>2_Se7C9vVhQ zs0UVpk&QVq%i^cx1?-`}m?Z5l3a93;mPX?h$y1xy>^>Vb|6@uiM8hrE`%|A}2e)!W zWp*?xRS<0-qinXhZHqRq9wP)QXvv`Qrnr|`4S();=;12w{wd2KuC#A}5-H0|RW2%? z1NJ^?Aj$B?CqZbTqU>sd%^YWFL+(}k9(00kKj3ame~Uf;5c1`in)dwa!;NgsT`I_) zKl;0s#OZ2EEm{gX;%fd(FJlj#$4w{lV^|OmLzuT;iEC9Tcg0(wA`mH;ZEZ$PJApbtgf_)eK^0em1E8vdzoNChCWCRMB?*A}PTPNw5*_O({mgIt%j*!-hJpXQ?=PSn4L&=gc`v15?K z_&Zu)J@6dJ1B3>w1*&l}0vMq(azMU?A?fJ15L5&f^^&Yjz0G-4JwngXV*Hz!S1+$w zvae!oah)(O2e0Fz7OK!JF!uAiu)?^7hnl`7R41M<((oVDTYW+eR!x!G1mDUGdvJtv zMlQ3}cc_Poo`O1H@O^Vd!fa-(*RGA1u9^z5;Az*~0Yab(s9uL&BAPq}sdl;B2aKdt z3x^6T>dhDuB&iBg$Zk9t^&lKU$7qle`X88kPZBTj?sQHJTVB^pPH9X~4HbJVbo>*s zIF`-=0Be8qj#yr%H#)`022c%^4|9ME6msT`=tMigER`G5e`~Dfl%VC5gkeBhlk>h( zhH<|5;rEAe8Tqk=3pF0JV5h(DX**-M9bqV`q;b(Gqb$D>y}S~%*yYBuaeSzA51aOP zpU9)~=e`$VqL9TiR;NnOV|Y_a=8{sIoiC%fcVv)haTYxIEFQY0sV{rIz7|$5XR>N3 zne%dq_h66bj(_u{o0jWNFtae+lholz3AiemB9&^G-b8q%(L82LoIb!^1F+bIC&{6MSZ`wh@!pIO;Cjd0z)m zj+5;bgzSqQHO0UH`H0Z#RejiU4}qNVi?#@tARi2|C;tM)N?an|fFu4Aljy#qAbDd0*)W< zgVS{%KaicXDDLO29n(n7etCa$-ov)2Ye{*=P&2RGjo*%1UWUyrn!Jz+2EjC58Dz_| z4`7@8X)_7dtEXNjDY`t;aj7DHO2_nF>bKtf%`FkY!&v$IIbJCE+LvL~FYLE&79ME! zSPe~y()r<@GBEL(dMoju*yrpaGa1kL<{@@+Kg*!xZ*A^h^|83vy~&Sc3pA#5*maqT z-22@2$6{ExD`b!A21!xIT%EW4p^Uj9G?lMQrS{+3M2lV_$A1m@>y3%X>7q&<3-B5K zBpVyJdlkcuh>7hyB-bZ>SZ)2;+iCM|bHCuDfw;;u* zIVSr#;e$LI6$IQ3U#FWe!WCB|;?LGt(%&i_;O+kEPL7Lwj>bdTbgIc#DyVYDw*zNb zezdm#Dt9|n`WI8j>fyB5J$sYEr6}K++|PoqBQDj8dE;YLw2Ys8z=R|i*-9u!{#a^A zW66eV-wo=6*XxM-v(aTF8Mg6{u6i9C%OWZHQ{T`!Ilg-dGZ|s}S*y9M$HE?1&3~Mb zUN;`%R*rHS#do7~W`+r8#1qBWd@%Imo5}d7(Z>gxCiI@f!Ejtqut4vGTab?2p!QnM z!ez4AIIW^t4$DfyF?G?-M|DY<(a*#J6qdO)1(wAzY=_m^ClojoW3SPsQJYe6&dB_K zZku#MuJUiM947$rLeK0^2o522WxndZDk+f7!Jwj=h%OYo%M+;$G7%Xz;3IV#@ZypM z*z(56c~y2BQ8C;kGN99t)=E{{AWx!=LZm~I2Tt`pD>E8VRW zU!=!-t|4qqih@@2jG2EfLV{qYwy&8oVcRp(8CXoqZxXgSWnBFv#}}7HIAu-WH5Qp8 zc8nGp_Y52aN8I#3tGrgJj31aFt=IZ{nL0 z)(Os$BXG6M7dhaX0H-P;1;Me;K8d{T(Y9W}=s&O@o9i^qNXI1JuC?|(n=B$UwM)V1 z`@h||O30P%Ny;JQq$@3B9>m4F-I~UT@aM-@!W0w6{4AF@xKr?#*owS!^{Ob2R}%9t zhH-}x)J~F-El5qG-Z_DEDbztEOWSZ&annlRhk3HdN^4%YZZY!xMA$!#tsvLzf0aj3 zsCIc7X@Xv%?{_8&H+>F7eF~p5WqC}KxrJ9dsf`Y2y~VHfvt)^K=Z6CPKMB5@doMPj zdrZG8y2K-g<%680-D+;mR>KfWLH$%AWb2{;pD{YmM40}N2yWHy=Rd!wt9^2@Dx7b4vOrp!}03#!{lqdwk{CF0Ks6 z+3i44XJmEAUdORE(=G>_rNxZhf*-=j-Tkl|=zaQwnnZZ8>J78bwMMbKM%7A_$rq}6 z^;rAVFSi4?@PX^n#@9Z8ImP}*p=}ba4=a?Xy*0c@BJ~`pn_=+N>wZB|HF7hj^o-w0exd=8GuIs+Z1!q0wP8ytI zmezY}Go~HqO7YePnITk|;{!+&H_$a2H@QZR95lCNmXdnwgp~(+3gtfQ9Lz+XM8Np! zp^K%_C6XEPAuWi6LCck%7l$OkvjhwCU5PH8Xb2K;sSXdA6Pxt4311;vqP%KQx*L(A zEmu!_qW8z5)7OJHzbpRR##xMgi=^?Qq-C}(;{84z%Z3KnDN=;1C5+febZnxe!0rdKEdTwC`4r)}4=ERdulEsohvAjTVqdsFwUW&O&6*epH`fAZ}#_km8qb zVP9tZ8k-yC(;peJ#{`milB)INc;6@oF!@WAS<|Eovs5Qlu*u0H595xzqJER?H079F zJBHnQ3cp_lN2u11pcjXK6@owil(LL8Q*;plpm~#RHIh@Xrs08u}6N zxh0D?UFsuha*(wXZLBdw?BMypIqN3y4J9vE66vRu;i-cb2scKVPr63#jExshL>l2W zUoYR;UmKWYyES_5t%O))LTyEy?aQA$jQjXS{3|*7u$Hi_D^hGi@R*x|ol)|SNUmME zWBXkfOPuCwNQ;j)WWlZ{g8U~o!QCE%t&C4q3Mcn~W2ybFGuL~JMm7s!AUci@m02qJ zT<%<|?6*fEn7Hq0(QdBs6JwL`6_K)>50&1!X(&^9w0hbb*{K;iH6wY!t(;NnL>v7( zINuWe`DEu`$RMS1RHNj5ZRJ###;Mw)2QnC79^KxgM5@HyI&9%DP?iA6_RLCS6w((u zzNsv9K1?2OSyN41!?ZnaCRs2s%%(|_1f=Pqj}f1gOru$eXltSelRjb)w^fx- zQ^f)Md-3pT$2kgf!~YmUakdly;;sF%T0ma+yZ#VI_Q+tj|3YI?=TDia$NW0Y4${foV}wJV_i zN*^bpT}HeRs?_oJe5ou(rcLWM61yI3VuxXXQrOsKlgW`D94U=H$|Me~=YNx3bQU|3br=uK-p;8e9rU5B zCf3I28Mrfgk33V1d^a&Af2GDXioPnThh=5Z)Xu$F=6L$sQc#mYJUUB11%+*(QN)Y2AdGIJO@FTuF`DSYNM*Ep!IT4PcZoNo`QqMzxnHIYm>*y@iH9k z3QapFb)O0WzqOBJcFnIfrfBJLGYymZn1(e0Y1Y!_ms&pJb9cRWy}^ib?hLu0WXfYGV-F zjQxmiH!~NfuVFgBH|D7+@PgkxePYp0nAzq$Ta`jK=ApuZHF+M%esRGy{u2P4>06=G zREAPwSnE2U6m?>@C~+y}S4%E)yoOIqGwqAfq%S9aKQHDBzCJr9cbL~I%wxxeO5@>O z*qHV{gnx1`FjXv}Ij0e~Zec#}BE{RRRt@wu*%d%~N9^l^v*=2Pmp-zBgkQ@Oq@2r- z7|%w^t&d$!ntZgL=ya;qO6=y}bDip%HslL5aNDo`m8%>#&FCdFG0oF|S=N*K-PIQS z)kRsUwSwi?_}%S!PW~|)H5y*i=Gc(suhwhoTW)7JO!n2iA|{VkIfv^PVG}d7QgAZp z`N-WPE~FW;ytiwxE{>gaF{P4Pnm z`pT`c=Y{IGW4Vk_d121&T%IBeJyOv15 zqUwU`tzaN{*7_)6_PF5)le)_6)hB^f8mbLkKk!EwLm~fjb7WN;g$*8?amuj7k$)ozB|53|r`Huly`dH(zTCi~@X_uw%sKpb9!; zZ{BQ^cr`FGIw;gld8u(gZ-k{yZa-7Uplf!gw)0&lC*MJnUqB;@;l|$Iv|P_n(S+`? z>P$@OB1W`Z=3Dxr?~sdAt>t~uZ2x{Tz1Q)=BkrT=Lx^vd6C<_IHF=M#)%}<<^Rxu_ zKe}1IOok-RybdkIa>fzGTdgbo`+dNkcm~`I%cNdq?;D3q8kD+!G(fe-M2q^ROo2 z7t|#5l;f-^dTn6YrX)oA4(gewI%n>fAYJ0~0r8mWI8*lCs9@My`g}I=R$RH>+K%r# zOPpGECLln!jH zU!a;{_ZOE%UwWq!5V4@Mb*!Uq)*4tmvc7fK&sf?2u+6mZMdpKJ^fpH|pe5FM7W=7S zgyw2Iv9EwHG)p~2#Om!~)nN4Rt=0^VL<6E5GO@|Y0eR-!GfH7y3secX09=;JEwMl1 z{!pl4P)1Va6DNp~dYkByZ-Xz5El(7@X)RvU&EJ_%Yo4P7=jpfKa#TYIQ*UCSB@E|D zxZ58`F-Rvaj%7cL*D{CvqH%)edDkDd<(dOb>~y?I^%Vf6nzSO+p9&?GsU)j-7E4d!f*)p)U%}o>hfTqen)+scbIW_&q9%bZ46(ZkAquPdmof2h)-ZTGaZ$ z z9yKhy{`e;ZonluNbAwbp6xU5mFFc|#7J8pEBuEnz7oxW)4TnlFA=ohf^6+Z={ zYSpF4)_}g9rxY(_r9^9Q(iR^2q9oEXCn&|89beHp7rksXCwp0pS(X`ItZOLGG&KpZSI zcsj#@*(L&GB+FxA>a~sJMP_vlSCw>v+BKemF(O9J-RJ=#C?#2VE@==_9-O~>#}t#u zfy1a$`el1X=5mcDF2zn9|KKLBpg!QT!bil{aqO&)&BaLq<7}eJG~_P zI3o&2sczop1@8+{ADI*$GJdDitB4Y~iAwTU{GQ6v(=oh`d17Ev&>fJEK{82LXg#4W z>eUk0A;8!+e&i0$+Px6NyK=rg5E~M`(cthWNYJhC{3;yFqU8XIeT6X z3UU4U#{4ZlsG*)dZ3L4y2;*VVQNb5=u~%) zPLcdzM1zs1Q#MbWBU`B!G&YN+X|JJ%5UZF-e^0!UCu~sqsVo!Sj2N1cNDmh=l$>P2 zL0K+SpODI-Rr zO)<0WFwWl2xvZIdCH2G^^{HgE9Z0EimEpS!Vak;-uBm|xWhL|i-+n~ylRM=~;|GBp z%CC$$^uCm@34HaZ!Pu}M5gk;mwJBcO2tkH;NV)H6pcs1Xyid*1nFCsip{pTLe+-~_ zdnqu(7Raw>P&wvl5XgOT>>Tb;XvtVsPt<2C8CfF&xd?X5T1;H!2&bRo+1mWyd)fq2 znd&Cp3U=@+Fo6gx4Gu<+-$UPy+ZlkW-_mQx*++l0a|r&mBOc&$9FscCL9N z!Uz2Tqak7FOZME??x7#>FPmFkzbw!8EJc?$gKuxs*s<7*P(5QA zx?mxZ#P5MN7_OI`SeJv<(tG*Bs`hy7aEQK8Zv?S+jb_OXNQ-;#0P>`)0TE9CG~eLh zF(?=_02FHFN}80grQc<^`OR>=Bky<}JFrRqU4}s28$DL|?-;}WVenT3Hr8A|5?d*| zb9E~*qWP2FPoU`rk$w(hmq7~|fqzO3J z(QXIxek$f+NRDR^+B{@aU)J|M)}&cQ*J5He0c^6Q9^djFDJsugMa#tu^~uPYc~oZ2 zB0?7}$;b4%8cIhT zBReb$SDlNyHsWn(B!ylK1(Z(LdpO0^19Rkj^y)X6V4d}I#st>Hm2@Cu3-W0=h=MLk ztWlJ3|7HO0O)HF}aM7Gg;fIZ`j%X$;9ncHHRlKB-9@^Zs*IzW*Q}7_30q8s9VbKcg zWW7}jcbb!7A*8D&c4?09XVaGvJEEsDqNu>7Djn-^5Sk1zi5HDR)N zqbU-Oo`JcTLup_F_{)V1yS$NMr%Ccy_scBS3_NE0%^V4ia&^(Mf)h=574Qtm-jYPk zkPi0romxgU@)J3fC0Os6l7*{}90F^w?P17{Pv3#@1?TqoMqFs8yiR1| zmmp7wqpgIOl7_j!B37qCRLCgFyQ^?N+X79&&3pzWQ3UjMb3QuJHc5~~E(ZQPYkWD9 zkYR~GV}10MNb;A4FM%nL=8H#HH887BRU-RDy)>>gr8(@FQ!x#ArAaQm0`87NFd8wl ztgOXWwDH!z^rBUZUE`qq;L*+AoP*k~F<&KrtTXD8TB-mTLFdjSZ`_BivD9`|hT?W7 zyB6f0(s5+O>l!LX-(=Yip{wY$RA>k{ij{}U?DN|Hu8a^zmpcSoV&>fL)09sScMH(O zT4|SFe!TLgm!Mam8kzWqzZ?rAmKsvoZb& zrXA$iKaY|i{35ZlRTL3D*3_k)n^sj9R0K5SNUEwuNs(x;h5zZNvAS4+VvVYSav3ZY zh&i4g5fFYy=*4>!@l4g}zlLsrN5V{3T*J4r3_t#&e|~~F+a50A7_?cB0GsAU@Z@aX zVBBpN+o@{@D+KXQr%~CMj}JcWxkkFg9Y0xCozDmm{st%EH36pyIOc^<0fDnP^c_O- z^esQ%U8W@|WX7LDn!Ejto~8KRHvwa?tlr3V4)WQ)I%&XCFG#0)gZzH3L*N5-C zn=Rp+Mm%>a!_N(K>+QKeyw3P=-@>Q3g#Qvpeobed5&PIS+5HJD+4gIUmaKytzeREH z%!cq7hR>q;rD!%a7BQN2d%(vfq6N9Xv5HPro~y%}nURHM|++u{3j-z=N2AcSk-XxY6Hs?$L_UV5yWZ8HIq1yAr|FUqr(k|qXc_aBJ)pA9THoR zad9$j?8Ad-eJirz)VU4AQHj(qP8gC0SvN*z6<|!g)bfYB%GF8U;|FO2zsD*&12~?H zB1f0K@=tcH+8l5^F0eHNJIeYoQ}zCu-^m1NQqB5Q!hjE)DIInpKMwviurW8k5fY-O zky^D;Q@@F~3w=v7nFWuFknQTV!VY&f^Pt6o;1`fxM-b;S?)Xox4M7r_tURs^u6mhA zGy^Al4?;cHvBt6d&EDi;gajL4&e5ZzJdIIcyvVK?4)c?1a;4a8hSw%9@m7U`N+QC{ zxUVdoRma+Co@$b@>?=@saXKcZ+?GX6xg_&p0}%nU4!NiZP7k zL5g*~aa3S|L6upALOm`|G*EsLGvF;e_0Qvkn1_VZ`_ij*Nu$K+Q;a^kx8j6)v@ zuEc%}q$m#9&B{!k{M@c@Aq@&$DLn3J2mJ;Ghc6FMWit5luaHSlab!BE+Qf>t0$^=P z!p>@LUMJls^ni{cj-AifqU@48Xj+JNs@7l4?p_pp^Qc$ewDQ&a*Uw0KYi++a%HgkW z4PemOBDo@FM1j*UT>fLK+sd!2+&6Y;{QI*9@SW0Ucq4AF5ogRJ8^zv-Nd;dK6CW81 zcda+k+Q1pMh#GM!ykYeTMkf^A{{{TxkQZNVJ8M#->(P>XI+utudCN?;Cg)>%ip3)yBxPAvQiq&cinQ zIB?q4+nP&rG0@2NJj=&yqS*{$Hj!!mG&fppOnPh z1Mw&Nlez!9iPaH$mer*JyR%gAFANwJjY&_JaQ~999==a5e%7U#xj{30T0%*>>TCE$ z`1M!wDcbg^+uX@8US5!Cpn_r-`DbQ|Lkh7ia&;#oikseKD-gGZpsZgRjKGf3O{QVK zjpy5-^@bG#=8;GF&)CaPi=Ruz6^F^qw8x*~26E)b!&2Wjc`u`)mJI_QMH$(7Ftllp zGfgCr0M1exu9O5`sAjA@8!t);BP;>NnJIAK1bVX^mN$c`pDO&Zvp%Uk@_8<1A&er2F>V? z&DkgM+RH?pvjm$Q4~m2+*wtW$9$PsHclbzn<7Y)yrGI8oof>97(@96ke*`G~^A?ns zz!yeK$?aK8?darMJY;u->RJkD(=A_#T%s^#QpF5ztD?h;=tv8bO45kwq=fy?2=3T1 zdGrAk#R7hjF}~}5nQ(!qWVMV<7by|yvUlQt6f$7xm=JC5KV{oMPEM{(HOrrug5?As z?9YmhgnIiX_Q{fyl;De@;mT~dD1QBqc8>FIOwwi{G%M;}Un!wlT*PFL)0#d;%ZKNU zU7Dzu{1{iO#p^y;W!?alLIq3B zu1p4oPB$j+oqE@nvOg0%dbDX*#LIRmvwC{`efeMhJUb=3s>mscM5toHAOpn2gNeZwebAb!E3 zuj5X2A47z(<|f;rqajU_AN8+QJzxr7)VvO6sfqg;!GcHuMdRe8rc@LoQT6u~b-&RS zT2Xzznd%+p+m6N;=n6XjA{Ym?w`%0{!cL)#omT@rc4no7aOWu~VZ>Ik=OXEH!}^j+ zIn?Se0*|LKsX~gS%3}?_gbGJ95moB%1=_talb#*|U|P!g-i<(j z(D=&K_nrKp>@bist7VMWgVpPn!r|-UPW!Z^I%{t(a@Iv;k-Ls)zux{AT&NNx#^G$smiz)?T(uxIH$@j#wSmF{uUAWFy9>ZPKw!a+;Y;vk#Z$hr_s%l z%2@5Re=qLSCMts%7VC~rnrX<$%RweY0)`K>N-!(!y7}Ov7kd(_kZE+;h$DAf1oOkU zRpp8BYHsixip+Q2Wh{3Y>R>u0!ed2A&39ECp-N!-5Y#v?(kEnL+xbxqlar!M!8aVG zoFoxrIC&C5AQvr*=#TBsk`?>wCSwHfz>WaFpgp))(^82Ayz=d>vNsaVA&9HVS>epJ z0&4EV;ynogO&9g-skW_Dp6jgF815JaV8M#rbW4H)4-rBh7s}KRmyRZ5@nR6kLDDMa z++QMyHoS5vx1jdgy{I9~f>8O{Br6Bx6w|+%SRudP)8yexsI!UblH_$_P@tJo8-5rA zJVl?oj~CTSD;)FeuEkq&AUi%Q$`7M!J1#POpj9PXcp^ud9~C(jr+_}96zxB|OHdgJ zXD@Hw!$Qp!K87fb>>QHr&VS#QJ*Q2_PiK8RN4tttv7?x8Z{mh~l*?}cWQ0#ZQW57J zQTzaJITduuaXSD3`hCMwEdjTQW=yN_u#70djfQ4xuNI%t)#hECs&tM?TY#@Zo76Dz z6Y-D4Trc(s`RC|6VKs<+Hwi-{C}^ft-^-J^)!bg#E5c5L=C&3pV*2Z~iJ?%UaYZ#v zmx$XMA`G_n;Am*7iPiuV;$2tyVnSc~Q)`%myaj}Pf>;`k_6Jvg5D@7y1yFi~kGv4W_S z@3e8eH5SEak2*3DwxS_<3*NtVW-l6Wha?CT~eP+sT>Z1UrI!;8kamtbGU zFHW(F@BzhD?(dr1n=6~VY*Se4if#J64e1tR)5LM&C^4uv`&ta9!#o%&FktMWVByEO zqT0$8iul-gsuSe(Fu`Et=hPEz1C>UhBK*qJ4~di@4^s>9yiTwI-4xj>Z&h3|UI6ur zHkKRcJ?6Fgp&#y7}<`ja(S;>JF zxI=AY#Nqp1LF+buUq*APn)Ohb^D$)`qds5uZ=q20(l}LnuSa-9ka5!kTd8GohCP0LaXYc&CFFUr4Nyin@k@kujT=HZD5{b2{WbutkTUUWkrR zAA>=7o|08*Kji8!VZ2x|wcVLpva~_Fo4bz$yDzx2*e@f9N`bXtkh2@vvY4L{+o=3*n;m@DQb(aJkh|#c&6&VLgA|?IwC`&dVjDG0 zv)!YqZ1c@Pk(tzep|r2VsdrgkWtl~1%fr%F@R~?o3o(6TSOvAo-!1t|{s+!qeu>CLP9{}}{J9g+QU1CO|#^RG_?TMvWeYw&;B0Z7#`?`HSV5ZdmN zumeLa=vo#I$Ygg~dfxo;^X~LXRy!XE$4;5wPl_F}UW5*+BE=u7o`1(sYwW~*>dwLS z4CQi`-^FtVVIuE--NfkQSHH;wmd5R;wU8k3RhZQe>WxT7J*MYSg#D5_^eOX?YJFVs zbCj~#V|k}n>vCr}<&o?JZl#{N+M>i~lE`}-gICx=>mA9+?bm_Np57dY9P$V_?dQrn9%!o2(>BT{v2keZ>PuMMuo zK3{-iTb{y)`fJBp8$xe%CX|20GtKX`FHET+DNIu z#~taSg-`~tuTH+lRj?76ejVsMO`(ATxHe5%Zf`pvlQ>eYYM-3w6o#eNfArh{Em3VD z^a`PKwO1UTwoKMi0(jOvQ|b*C1I#?`_1Gx>?B`iIPV$+cL1r%9PtKJ>ilLnIYL2BL zgn>)kf*P600!t_|_*JVIQ5IY#q{FW}IL^u&U@vvtdMY>EYHbWd#;NdRwvGsqr`j|M zjoU2L_P1y|l1h_jEGC!_rO*9;1^Aii~~CRy3|l$~gYNKr&C*=aWuOx#uWKBV6WdySI=CVY7|}J9*B_3m@A+Mw4V8R5 z;f;HWT$ODSMC(Hb)BUoL-$uAGpr|-wEwp7TXxx>(K=2~_D$rTo2K}ye`6vnz$AkF9 z=-!*z;Xn4omL^d~ZWQtqMY~b0=Ed}obxI=#r2&(MvS*%>}zJnyO4 zDrGT8pvvHxha5#?E>`^AOFXug6yNZP@1**?lA%zn1`O#f&D+Q4Z+$z@wFu_0T{djI zoQt8$(xq^CtWs)WivVK$Jx;>%YuG*ctCA_lMDN`k1Yj_YtRZmxt%T4~`|Il96-9f= z|EjzrK7kF93Pj3|vM$~uO*o4`ig8zH5~oEk)sG@Cq)=KVXvs`r*H?V)?UEAMhK#NHU#*60#~?{SLsXtu{`t#`GOxE zxnh23551j*`r0q`ELQSYQT6gE_}svU76?C-z67m?RO|pdc9)(FEx@oMmuFD_NTv?5 zp}#Fui<@+T1O8Q*CpVwb`+Za~-yl&b^f$g*G>b{7P#~Mfu6ezq{o%yVtHA7QAX{6q zOna_Cy*P|d-!`6vR8x>?tx*P?MIK67(xSSn*@9Ro;<__K8Gn}%GO#{&(9OWbw(e55o@ino`o+!-Q_O!GW)dL-xPucdxaOB5G@P3Flh530uI9y;uTc@BqRg zcW#;3O+kavH-07x)3C_^fS^EdJQEd$!+YET{)9Di3MiEj`tGIaS@l;fNm#&$k5+ZX zc#8J0vz+sEB)(uYuv)^-(_D3mp888iA^asCJvLa_SwJY6ed{~Hii5}!Iwrvez2OAB zJfj`~3NRoOA9ae=vDWt+R;BvL$3DK`!Tsnhwn2Or->+P5^$aYF;}R25OE1aPw<)G9 zZr;ln>PPKgTTH^cz!r8O=q5ob-~*aF{N?Pwm#4|FFfKj67*IQ78Ent1;(UK|<$oqN zfS$KcOMcxc!`1Tmp{0D7N2AIBED8ZLv8qSVM*o#$dZ8)IU%1`*N4o(eioI+qXTLwASQ%sVbqeze6cQ@*k`UfTJN% zWx+2Qv?#@N=KA-3gG=zT0G}uUTj;ZPRmGh2^{#-Ikj5Jwm_uLG&pK9o%k$pd&2;gK zaJ>dUrhyvP4k9Bsivbj)3(vrrB{J|vC6nUXt@2GX-LG|`YSi48dDJ&b8))aV`a=uxlyn&6RdOKzy>RCION`Q=O5zsrL_VG#xw29%&tA{{fe}+6KFsRm zqX63OgaqNl&^7TRI6ajTBw;x9g}ENe)>EQk0UiRyLQuSt$hUP9-AShwoxMt}Jd^V0 z6^It@-nqNsz1I(%#+1tcOcI$R^!F_Oy$r>ko6!_8cnEI)=cHBo5cAuXaJz5O|g`8y-e%`%X!WNU#YwsgQF$qqrTB2_vSm7=y$}LpXr3CX6~-S^T>^_Yd7StW<+U z6*|!zWeR(%KGAM)`L+4dMU1}gk~ipjqDnY#)O1aKs2cl*Pd1>Wr62g$0?6I04hhb? zymcVkAzqEf*f=iM7r?z@mq9#Xp$y{t;eqWuhk$W(l;1vTnNh0#Mge3Rs9>H~c69&l zHzE1{1To|0g08njaDh?`TqL%dNWJgMznkkK?07<-9uYg59CsS(dnBjf}y@6bvCRNqK z;Sp?#q=+=F)MCr}xMfk-YdLi8 z3j>D%2LUx}MZsVHW&ru&R4zs+G(Ww~&S4SL}WN zlpN1ms*+m4*I)H-V}2uxLUfl+r8Mu0$=yKsK{H_6OquZTmI9yxqKsjRXryl;inz?j zFHEM^t~_*nWn9kRwb5d!KJ9usa+_8)F=m%pb)aQNk`N5f{RLv-DkhR{p!t@cQ85F7 z^kZ~de2hR3VlQUk-KGQ}mua-|tfbaWifmqHLJS@scR^8Oj)mp(3=aIY znz;4Ks2$6~p6}SOf)I~PR-BT*iG(4Au|;9Z`BzQUYDL&mhJK?Z{K@bdAM3HT=k$&P zM5%yLB`CT~h0?PLAI(9aRmZ))ID+#_**Qfgah_s?Oi(qvn?lsaiJJq=(oRYAalono zeJ(JeFxiJ$;lbbOlAiqD>S2q`Ou{ssm0@@uIX^TaO+PJ-Prch1tO)wxwM-Z23lTWu1^ue2Kwy{E4Nn~hEK;?OthVH6rs zY(}khk(W~Alfbv=DF6U1tX(=&OjAs6C?qA5rYA)IQ~dB}BIN?7IUO$0=gD|46_xoq zdq}KHVN7SG$*eqysh~D@HP5DbJnD0$D>H*){l%zboEk)q5pKF{2`)f3!dn1=h%>e( zR6G61kz6b)14BxO@!48>R4kN>KmZdR*(qiZ&sHx1?^eB>X@<3Rsy@+`q=!lrnCH)Nja6xPlWK~`7j?EI3s-wV&;kMT`@|i{xMSujzw7M8iAr` zXFGpsg|ti&GnI8YVPO>I?=)ZBA71t#6VlgKwX#}bvy$|ck@n9-bH?Gg#QD)3SNuJX z*pDisp*#5?QmgS%M&#yA!~%krf4aJWwl9wqtUA~5(Tu}ElLOu8xaCn6w`y4_pH#qe zZjxHZMKM)vuWx*kbWaecvBK@`-Kug$6?okt&lZVmY`3};$I)*3!yZq|JbS_Gl#Gca z9@jXn9DgB(4~tKOGFOjv$daBdS^hFtktb=lMyEqFC@EZ4-fNkJ0CV5XC?x{OA%Yzh N69Ue10BL+3|3BR=Qi%Wn diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.svg deleted file mode 100644 index fc8d42f9..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.svg +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.ttf b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.ttf deleted file mode 100644 index 19090afb10e101b0524a4dbe1f5af074dcd2a1d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32500 zcmb`wcVHC7`#(Ojy-5=g1f(M%h{uYe zSO7&p6pe^tK|mBlKoRVa+xxv{_Vx(;gB`3K*BOGrgcLIS(A>)E^I+N3Q#2$@xe_lvvsOwZi@*`b|; zj2@2r!NbN4DZe()+K-Si2M7@x4x3VGk-F6Wl8_0l@xJBA@=@b@-tD`ekg^{Lp>K^E zGO3*SkWkcj67K^>l}#UceemYac$Y%RkolvBkDC@?BzI6gdw+BEh#|xOe&xl7gbZJW z``poZ;GbmJhxg5KUwibp%4uspY$4(O8Pq?eY{IZ1-H$i?l#rol4}E9ckZI*&knkh! zZOCsKKV;m9kl2)u0N-M~k1n4usnRiy3U_-(k~L1gw$tRvfq zNDRc61dw3Tjo3(=BAbvNb4ZA6TFh?O-?I z%|1{VxL6oSh(KmKex=7agh8Z{A_bcOfK4*lXq5)22-rj&P(R%GaX<}z^^2@u#{7;3 zRM|*+Mgy84TE)zW@GwI{d{TBUUH5A|&E8m8TwK_`xR@Rj?>(&O)2d~kKJ)vsTAPdC z2we?~ihN0uBKi3{YxO~`V!9&uiR^)pZZlTdM3c>@3KfV6<}8{0p?-CCoTY7&cYGjE zQAY@gOW7Y@Dhk|;w#1M)vRR3)-H zmIN^&G$F^zQJ*%9c|G1l6RlpWGh-} zWvvvfehg23CR<>YV)o-m^D`-7)YV|Yq(r;#tR`FSDy5G0mDQxwcfCTxveTrT?A*MZ ztni44aBFr_LcAe7ELH+p7{e2Cl9F<)VG&uGxne~BueVe*`|_1-ht8;1hV|^xujuZ^ z(uNm~Zaw!MwN{iCjij@C4C&E*%!;A=z6|-|s~Ug2H*IQ3k4^&y_a3{X|BDwwPoIkT z>)h1YB^YCa9CzeZ^7|x^M3Xusn=~Zzl)U@`)}}n(P3Qw$SgUO5po5%rTV6WvW-rQ4 z1U3>G0f5^4s%(Dgidk^AUojEw;)Qn{G=qDJky9u_h(cb(hf~G&?s7!$BJl zIgw!znYlSR8b0Wwud*`PD_}}arjdgVE?;@@;PMqOA8%9MvSmSDYx=kC=@l;@Sh?!p z@%Fh-v@UOLSC+vizCeYqP9+hziTKyR zF!@H{QzazYmz`?42tcuDFY54<&DW%)x!!S<t8Lu*kgJT#l)B73*7cxcJ)6Pi^H78~r)&YxVVx+dutMt){m|m#E)`7f&!3b#9c} zp`d9;x_HEaF@2xw`QqpAu0FV+yLzeeY4r!2y-(@)asllW+-X$bapL5T6SI=q5AVYaO{Dk5kKpWHzp5s`hZ?Ujiv9<_#9fFo|*VuBlWC09HN+#7@@Ja23#?SSTr^up-&~=!BsWD zyQ6HrIQynYq0xzXvX~_%M#`Z^QB0=2)l-dVUf9Vnn%+n~etzp~hqsFF7Qgx=Em1em zI8v*t3RvH(oz~K zrmGLt(R2fq=^~Vtpst}$kv}0FVijL59S9qf^1sARXmTFoHb#Tt==$2Ngx@J0udeCZ z;)&^3&rG<+;2KXK3fqMrK>ua}fuc|sL=2o9tFYaEPRODUe?s0_jz8%8v@Y5ZuZRJG zynmUn<|Bf!O3_t+MuR*j9W!}1tE6qak^$}84Or2pPoFled-q1oj^7;fglk-~h63*z z&(XzxMuW%%nsxS~5OwiMLn@P9;9^o9MrQ!<*H#f@YNB?=j7*Okm7I04Q3({ATn$2Y zCDL_==9z?qctJFqLM$PniF`yE&7A$_NqG7{BB{CCXAA>xp+r2_?_pL$+B zP77!v4WJEZWA(K9P4ug~pWmZyQC@msKX9}M8jV#}pwBpkiVSL!b#~#_WQfcfAf+p! z3nE1j*+Z_f$T^8wqE)@3?h*RON&Uv&{t{)kh5RlA4r-8M#T*^u!oL|+nEzEplt;lN z3Yitr%+x2F*`)Zo-vtmedl$jqvAT0;ZmyFPTeEXHmxgqrR;jQ$nqC}IGPM8D3ia~r zn`^%Nr+l&csxa{s{j+pSyCD-6jbCu-$uHk8ySh%@322+6$Fcxz9kNI<)~)A)HW<(b z>(IvFCWes?4QB1J(e%St=v^w59G*>AQlaAT1Uegcii6S$uwupN2Hem2g-Jd0^39lkd;#WwBTTQ}bBF?w9TuNl4O zp|1vky8Xac3N^msB{(>f;SKkdw1z8!3sj~&QIpNTO7Sr;)lUiJnOF;B z9-8ixN*LF4ZDA%`bQSxX7@~finJYz=mXyv^|5gjs zKWC098T0q&7yeQ0<4XpNFB?2?Y;3I) zd_$0LrY!>2jmOXoF)5+0ma$g5)jPBkq%NR^pqhw~$Z!*pjX8O>#Z1Uxy?LUsV*QDm zPhNd`)zz6)eO5i(t~s5)qwR?3@_~KJ#|dpGP~Y!X-d(Uty?=15x>g+=MDM|NJ=Q*J z>Y5!}r%ip%;UG^!4xf|;kR%e~Ak>Jz4lxT9WDAC-h4=Z;4qn0gWW4!B%%TQjiXiO0 zi1(nmT(U%5BXz}-2oIVI1(^v|&;ig4*$maoOpAqr>YZYVQ2K#-la9MX$Ei2j2wY6_ zC4=|{Xv_#*8Qj4p!VFDUh#N0PlOnn9P#~z(%qZ1RJy)E?l5p#eeHdI3luRRw#Vb-5 zH#A%cV9>}_Hkm<_Xr|%REWB-hQyf+OoG|V~8lkSatv*8|88oSm-$ezz8-?B-s2H{0 zHJWTSoxRIhn@-;@t1iZ+s%RFvB5EuFOu$pd1aXH$IDZF7vYVoJVY3;nF2QIt7>%%4 zxM?4sMEkdXwejW-#e#ZS`0f0KTb%}V@8mD3-}hh9zxWy0`A@&FeMG~3{kt9e^4y!f z*AM7iIJAj+u2tW@%=AZFI;xEfSLMYdhqNG1C@d0uAFn$1p`QIhJctOBSixnqLc{25cQ2~t>hk$Z`gEsX1)c<6jfBVpz-5h)$89y5cWe2&yNThI zsj~(k*}yn}uf+TtP;WgbTk+!$8A-#R#1Bz?-F|<#dP0b$5rS1cVZThvj?fhK0-Q?S zgg7RJMKTwB{w+WdgfSOO)+kYN7FKqYiH$k@H9LFQODen6#Yn=`8e1f^qsY6FOgoBP z87WjKaglVQ;)tXbhl3;I@Zj)-$k}+UtYpuFT?0_@365mnLkN1P!w~hJyerFWwYU`` zBQ>LobFz~Yv$)Jom`hdaOGCyFEuW+Q{t3`QnW8 zUkbt#>eLa%XT%HAp<#V7zWYF4Kg9T~N!nM`_=ouFQ0w!+W0$P&t3p3VSV%s`p6%W!l}JKwmX=T6ySynSPgXD zWi$XDF&N<45G12$W`lNFZ(St+LMZ*`TM;%`-z0qG{W;ye&d9Yo{tRP~8_vh6o@x3m6S)bC50|BsQP_zGNa^%@*-jCz=~Y>Y5vmDS1WQ!j{z z?bA?OPy0)(GUg;E1L1WMKphq`S_!bmqe)t&UcN}3NEDM8z#1LkC4)gFZugrK7r=cK zaTqFbcjGV?2F1}5FU2m=z|?&qnW=MG7Rif(@^T=hWTCtI<>9y0?>7l+X!ubo(%LcV zrLZN_p4&zb?%mg3y(=_%eaP6|wBW+9uW7S=f8BYq^2YZi*Kf6d$UO?^K{j^mE_4=zn4T>)vidcsSecJW3}ibpqdCEsO23Fm0a zjH}Ckgl|2q-;h2dWm~mr+2@tFFOD5KWgM%EVJH!G1&~e(31qtXV@Qn)JDu*mJkXqj zFb+*PGgb^bPd0M=x-U(+hk>KD$S@06L8MqK#|v#O1f12ELNTRu{tf537m&lCCh_ubcOKp z!}p}d_8#g)9XdH4SH8eEb^41~gbs5$Jd?o zSYLdn8Wv}DbMZL1D)_&gh7oRp+-s{yn%u(-N|;mPd5v@zZZO0>JnY~rF`k?Zywx>? zEnv1z?~P`c<;iIq)ayrHRe#t_H_;ecMq@UqRl7E<-$i$AT)%?~M=q*w*$&cH=i6VT z?OuLaed7yy{g>O{x4ZJ^&)+kRl5yZ~fh~U$Mmj70;mo9EQx<_vh&eiR65$ep^;v+( zWpscSLk4ehTMJ-_3|*Pr60#<8`3k$39#k&~4R`&sQ2j==tN+k|sZY+Dp#CgSyF<23 z`*!&kfBjZIdhC1wko8ilWoF5QLDy}o_-MK=6uLMkWL}dtF48iY6t^>o>5XyTxHLu@ z6QS!lS>j{xnKFO!{bTCcoc#ZR(~s28`oFX9AK(86UVjB%gGeM9qR3G-7+z(jsQ!GL{n*KxK(%lBnZ#n1-@%hfkw@lM;oc{ zsN{ad%*oU53E}qJvhBwCb*CHIUkVa^CXE<11tYr+^p_pLc`_NMgw(0);#FRJJQe`P zG62O`Hd~|w`^B=xVV=laopHMxlmwpBhIx@h&+f=hs-4Ux0hkHto+65fl$>rVHbn%= z5hqVm&-DL$!9SZe|Gr4QFl*xYCsr<_CUPx z)eCBSX@~Uo!&cJUzp+v)fwL-K?tmsiQit?b+eW8sGs-&tDoun*{I(@8e(SB$5p?VI_Jgw zTr7@IraypuH055{OgqpnstixBk#?qIq;?Owp#E0W&|l487ULWrH?^7VTvAjQG5+d0%+*rVwOqT zWz1Kg7SUJKozT2*sylI2M2p3v^iO-5J)WwnAY2yCGpGd6+g(8ALmE5=DqgqFS#_wK zfM|7s6j0$bnoirR@#-gPJS`M0!m8@Q_Fn~)xD7QFqJ}M~!I!kwYVaylr)UpyRwTmh zJoqeR*GN=+Wg~AWllBN3$gzggX)+ZpU+tSK=md1Hm?^x804qvHcUjjTfnRo_xuuEvZyvE%bXBMZEClbD-B!z z4!&Z@VkM;rUx~d?vwUT82Dv3rc30Civ)6-cWrs_XzW5W;uO(`fQ0g zA~HOYnSBZIMq^lna4pPt%-*e^I_@p#+_SK!dZqHh{4=*{J^Rni%c9G^3Zk8o3nst* z^nurD(~kYxHW|3B{|B$B^*44ke~_PX^jULmTeNio+S(NO2}bP3a3!>6E!G#IY=%Ia zOw@Hpz3n~a7f!hZbpZzIaBBLLrQZYFwdk6N0Yv+U`Va3NH!R=-^|$w2I1O;*2E|CV>HuTXnWT-p+S+!FT1 zpXjfeq@xm1i-||A)A)Rl4!Ewfcnl#$^kI`ZN@y_S<7^VhQ_3?$TY~^B^9T^gOs6>q z`#VBt&~3OtgXxrWGjFQDQ@@)Z{voLMgyB6#j2iiQQQ`O_BWN;}LLbn2KOXNjX3g%{ zJ(juDr*M=Px zbbke)ZV#wqf!%OeeUp@k*f@qO__$fb5E~5~u{y}Qa<4@D@L>?0emE{VJsJ+BmC-Pk z2Sw8gCBQ}O5aS+hBPE1z8ysq+XFtgC1VI|iR~TXr=Tkk*Jt#6)DZ*NWA-|}f&-!ug zWrw|M(DJf916Q=TytmKTVET+OJdD=#WjmqBnirj$N4ed~Zx;oCmMHrWE4nD+vXk3}80D6p$2FeNwT1cF1!20mG93g9O<={N+4||dE?9q_3!5AkdQm8=Z zMXQO;F2*d{lR@nmK z>~Kv5IGrMT`(;%y;MM>TJ-AGqGhjMsMoPw?MM%x-T+9gLPd;Z z9R@;kS+=|?yNpp04Qk8Oa!+XJOTpm%^1*&M^H zA35ZPSr|#R$W%q*984SQUL%NWb2?JJFswI#wkUld4xb6wk<0uSf;cm+#(v?qhpr zK^f3{roD!6Xkf3Ac2O!|?Ha>I3fg5RJ(U1w^b+IAUhVQ~imrq6rf>ntbQjn)8ijdy zpPevAFcIQ{bGmQkdk6LkY}7o_ghBV@>a!o%+X#mT^c-!M0hA`?S^=g&XlbpS(Ikir z;Zn|}J?UuHF{_weW0hIkZex})9%iwU$jC6ba?PC8IAbkZ&irZPH#FQNsJGM<^(Shr zEE_Xr%GlCMA$fcCQuX&69sW^2qbXGI*|>B2q4h8926PkD!BP`I7YyjeE1^8rh3Pv? z1~cfmnAM^4B5BTGG0b>2j$np4*@tPbiXT7yKQx~(rui^|%;>;V^O2f-e`41Nkbi*R zn0;q1t5?R3T%47&_!A-Yf%@4*Rgk|fouwlD&ai&hXtm8)#+h289cHv62<;fFL~8AT zF2VG+e^G#!Y~YR3+u_zK3{3Vae%i?`8<=?W?u`)8aUP~3%#8KBwF*Pa?@t{Z6{@P2 zhwnIXgIdQ8TacGKfB1MI*+J_psCbY>?G-fT!KNLh^w`K9+L#nR<8%VwT@X{mG{`wg zJhlg1{2m&!+kLJ0`fI^WRA=pcs0p7mO5K$OoSJ?5Zp^4B*7uoUZ!8teSr>@98$x3| zkGc~P=Mj^X?5f+V!(C%rh~XNSzYh;2f`kut%X{$p@G2!vdxfZ=1lKE!pX{V$7L~vT zy&jPp5fSMO)rPwzA_6j0cwRs5a|Cb%Es~;@>Y#I%bN{f5;ruB20 zM0Njb)rogEHSOLqE2B~Um|mZ(Ju+n9(9S)Yp)G!nJHm3gHT0Ms3h~fmIG@t-s7psi z>J%~2_y@ZVQ|T^nZGoP1Iv9iqfI}0^Oi$tBJseZABGY2b^n*9vNNbUi*t?%vW!SPs zZms@#!Tv+zY~wf4G)riAfpRawXy}c>;0Px0CS8g%%Jd>e4wnw3m(bwK78_wCklWCY z$aCgaM8`oLVOlN5lsCDC-JP6ib$Im@;LU`ZaX5UCbeRv9Z3WV5r2zVar zxzR!3B&OfE207u;slW#FmcU$;KA>sp8ubpMA=2m&;j4$IP%ef2LF5y-daU0@FVu^~ zyl7poj*nlCCEk30&R}Hi+jO5u*G9kbGH`W?p%6dKYonbW_1XY6nkNbP@qdlxs2|Z5 z>e&;=)emq!M{|Y0Xe;|K_AhBK^?*=E2m!uCwWCA)KHS4ZV=`gn!pN7 zQ9`*DNFaAGA{7H-CZXvW5OC`nm`W%QlSTt;!w^l#$;7NLkC4F3v=MRc5s^X%b%SzH zI()ccr!K-PugL4w4I^mT>CZknec_ECvbNV;Hsk!Y{sX?ha4VbD{t~9CS;PYO2K_5K z7QXE)Isj7__YLo`-0^_560k-BR?V+YFf)vJ0mZEOGR)~ph#OWpgvER!$d=7b=OyLj zFhc=ei-@dn*gS$9zd<^3MB32smBUmzsQ9ScPUYUYaIL85$4`IC-=6vX>laUd^66LV zj$x>|luni27aPIugg-ARof%RgoDj$)0YH}kg+?;;$%)_7BCCni~+Qdc4dsx$BtKpH3p z?tirzpz~jHInVTA>!IK?u1XP76q<#B5N2R2aWW%byk`aJHyZHt0I1c%>}r#o*s4#T zg$T$&`-VCEr6@UxSQ+1rPjFE`kDAkoj}J?*0h_VPgZ|i(5ya^r)XvQRVtot3;ymZE zxbp%*hHUAFz|3cDVTi|!w9tdOFigUUO=sS`aQ^KxJKqr0Uxne_M~QsXkzq#WIYsnHGNh5#zq)*lw1x}W zhNi;uhu;opFYnlB{Ogko_to$Ec5m6&m*xn~m(3`=cQ0i7<~!e?z4hJk-u;FS{{9a7 zyu0JN+)BC!OS?YFSA>*QHVPryEzqVsElX#1K~t0zrfyL$cBvnMt$UoFg-^5NvkA5NM2L1iVMmk2|T zRAE#{kV%>v#n+GMUE$@Rcjl5m+cDnOwnJHiQl% z>I*#uM_G{ju^$_65R33WvxCWE7V4101m#3nbA{@XTj~kgOhrV1YNOqdBy}L=8tJ|mQ+-`L zBmBuq7@#)BTC|ghOwA{AmDqwttS@6twtVy@0t#7id`^uOmu=*eY1y80sfrMq%|3w* z7vvHzihn4JB~a30xuKM1QtG+i)ktG8=-%^fN_;&QKFnAVqW}rvY&l$6W)x7Hg{d+! zVbN_m>4rr}5fO=OAx>l@%akl_-mysi`M&BzV``aQ{Y$EAh^B1>yk z0<(Gb=&zi_Y@v1n;uB3FlBIS?BI0}4WVSO{Kq`4zJ^uEwEjwS@JfLX62s&~=aX^V#Ooj$F;aP}j0_o*|qAEWRk!Yg7R@E8O8Wt8QxZt)s!4vW+#CJZ28VSt~p^UNvp_P#W-vPI!bFE3uSIa=LTr&mmAr#`}o zn7Tb?j2S;YYj##f(C9g<7N{qObf248V=-;qpok#GxHEZD+$L^@&vWB<1an^-=}_*& znMJ3FC&WZdJz|{`X2ZC^WzGV(DTpq_)I27DPMonX5L+RNMcR**t~%WXK|{|ZjmUD1 z%(%X-lbP;_VD@gPtHo??CfaqU#B%K$>_f4LeBrDGv}Z9{KzmuS7KZAqbfuO%e^RY1 z_7Kb`wdzoPoh&UTrI9NS8&F=v^a!Py(I6H9j39R~hVTS1jiiKRrp zWM@xYPiw3{Ska_`(Qi{=%g$RCcNo;JWV!IwBZT$gBZSvqeOc_WWLA08xCy&jN1Ecd zb!xS+d3M`Im`4Z1b(XkI*a&L%gN2&@ z2-W>xA8y zB7WVj9->__Wm3IO94sEZr>>=C_h{b-)whA4JYkdYs{AIj=3>Q%N26#B_gbOE{c^z= zrV+08D?$V_02DEp+W`=?KJIsD3VRpE-*G(i^;B#WCg_~lXtWBi+Sk&!h7AT~Hu`w~ zqP5%Gm#w9PgiT8+ZO|*SSJU*$Epw)}t?WCA^<##x5^x?RwaF?aHZcjsYjAQr=|h9h zeKI&{BwLv`6MAlxQiXZc*S1j`Jx;}n*P7FAbTBTIRd{?j1N=^y$dGApL+=~NgP5r4 zP=d~rLlXFss+a^mDT%f?bVcauga?Qcf20M_>RX{^BdG_bZ+0g z)%zDcdt~j310T1}Zk+SP0I9qvpJgX|9>KlH zOZdt}HW943M3i8{L?2(~-`wgi#)$RBMq)>?zc^N$Auba)iTlMj#Sg`A#M|OS(Nyw( z$W!ru$TN}kCMKfmA!z9KZ39uy0?K9Z@O6Pz8bZ1$fuU^8jMg{*cIWEG0(Y6{o;{t^ zJyuI7{zle;s7&+dFcpf;4KgUV?I z6MWP!K6gCm#^~^AA&!0~_JRc-r5K%2gqWc>dQ4ux4eV4qo*uBGWMJF&{e?HM=5uLp z770F7&7?m-Rs_O^mYu#tHlqqgZ9v}|Ooy1h$|3|5>{9`t02_lII=eN^JuaE zvqxSqmbdB{XDo<$X8cooy4Q=7SE7bR!t;Vjei`1Q=7?Be?b2G#jU2C*vymdX7h$?c z+O-H1GRlZWn1bn}x9OBnlv}&*mg$UVO%W8aJ~$;?iJGMq&z%n_Uh$3LUN8jinp`D9 z!SPrg&$*?=bKyG%iM~2$$}yUI{H^D=yz_ENw=Vr@N!KnV(vWTMz57D@t?!-ODGwcA zHl*8-@#989{`Mv_#Y5sI$lpyelfRqj3Pg}N$Ow41#>+1vT5X5pvakW?%`}eqP$Stb z9E5~6c_W0c7s6zg{66RfdC4D$%wgZ26IevcPSM0m9f(+`0B}lH+Hsy^w+J&FId+jW zVH2>@Mx71sOcz)KR?u&#Pzj4-{1l@hEJzH88xhm}d_f^pbF72Ub6N4i#->~IYi;b@AI?SL{`t@EJU1jW zS)jF@X8pVcyVkbvkn()L?#C~F_}13vN>Yaw(@fpYXR(#USO^>hVk#9;sxqp!PW8^BuC~>tL;?^H#Vkm_Jjz&^yq_hRiQqR3eGiZYs z;Umd<5fN8abTZAS`Fr6q%-f5wxYK*#zk^jMk`l*uIY<5l^3;Nu9B0&-S4gT0anUC3 zrA*)_TY||JQ)Ppl?p}{#i)PzsFvZb(9U%++O*SUvCGpjme3HW$f%&FLHm_hX%Gt@3 ziJd$-hs6Nzn%DcSmG2`6__ddpb$D~(E7e5}=&{1Fhy)gwPx)dS&w5+2yiL{ew<8xA5%mvicov0@O}ZPEHdT4}?emj3E*|P^3iFV@otWhWw+G zu$-Lrxl+YnW}7y6_;HlDQ0^3h8_2!Lnor#7sthxPof6*}Yyfzn{xZ!MbNF$sIbqYp*svo*iG@daEpTzVyrK{bdI`CwA?!aP6V@Em7CA3!A0& zZ8`1P!LN30+w*fqRfxwiESI{WJ=vr&`AQL*G-Y^)-zOCTVkTQdC-%L9zxb?>E^&2H z#~bVNcL_0E#02mYJiE%u04);CJtwS$2JmRH8d}zTEo(lq=0kys%TLco$jqR8M9ajv z987SJDG6>amPB|Y4iM;eMX(9TH1`Lfpd1W4IX>CR*xVsyiOly9nHz~^)LKvtcPYDV zxCqJvY_gN2%YQ9ve(uSmU;O>s-tL`y3<90VRi9PPI&H~FJhXd*_>t}zr_($sBX+y;m6Nj`Z_mRd<);fh7s6)8q7$_{OV4T8U+PCDbl-V8D35#d7+JsiGcYyY_^)P4n`^xw+`5}Al7)}Z@d#`&Uf|Ups)2;A|>uEi{mHe+JQ6% z!*wsFV$13+%w6xbje<7SkJ)7~-Z0{1$JEJzbq364{YUg}yM5Fd_13LH-P>;;^$E4s zrBdzsrIqwpqJzZN88d}P0MuIf**f(oVgRDoUU-HU%!MsZ%@0Q&3`r$v3XPLa7BRQxn?_^$g&@{Yb5%a~G5i@r!th8COrn!d_k7~!#vh+v zc=3xr?GsJ&M)h9Uqif;UQ-6ATshY<27O5yJomg2qW}>*i^H39=P=W#SaM`-`f~wxx zQt_lU_0577>(*fdBhhEm&h5%`yLRoGI5v97P|(>7>5@1Vqr``;T!kw!Sb{LaEPxS? zSYwEdEA$$PMGMv;?L{0l~M!R7{BTPhK3xH-Ks)ZhjrM&!=?i|v50(pF!FSeD} z)VU=C<~=oN$gD{P!wVV>Z6v4mnL4?scjc6xDb1Rtq%~{C#?EBvsyI@1U<_a-s+exW z+>=lGYr#HoKIuLprat&Q6s9>@tcQE11B4sqzQbHdB%AtRK8Z9$_Bf{+V+CkdIpWCq zgOVDJPK!xsuy@{|*qmu;H4?Jq-z%OoHw?^7^P8|axFDcG8my`fLN95T*c@xex85Y3 z&NXM2);OV;d|rDtmy8_QoIyNVilQ$V;?WCM#mAQ^)gGE5L?R}Pxxv7a2sUKf$(Ng_{&LP(UPpAtXIAtNw++SjEsI!Z^h`&%eO#P(mthKMcQ2a4#U%3<| z%4kaxS>wYjy)|?Yw*}ja_k?SJEs3lRV$au7FgnmjOZ83RE7+L`DJF4>ACGfmQ=l?t zWKkz#Eir$BWMv<~B8*Vq?7DF4m#2q(Q`mLwGZ#M`{58Yx zBKo^9RQv%Nc!c8T^dN}ohnSyMTUelND;Mc>K`oj;x@?XxuXM};K^;A7=7{>Eo}7ue zEK17AlR{H?udy=*!GKT%BUf|z-WQ<>*!v=jcKP)vHob^CDg>w%bYUoEj2ydD&J+@0 zb@T7ww-C9T0<;MV!z5Zls7U>3lzQ{cUw;)hsZWHePhb}#EQX+1r7%vMDAxx^^94y@ zsRlmD!*+K2*+Ng26p7uycufhYsi}Y(h7lZ_bFne2VckHpQ48DwZf) zL*Z{TxxbC@oW^FsO0}5vhE<46yu{_Sn~B72U=*MYF&Y^BA8!cSJnSXV0esls+-g zb8=$Z#2{Ya|6l(-{o=p;_X7Hy2*<^6c%i*_K+_xV@&!@%4ruQFM;HT!4BG+CpU04S z?tq4H8SH?TMYD2@!sw!+bLtBLbi~K%>K#F}?Vhb$7typ-eoJ#tSb1@7Fg z`EY}l+wn4T@At^P!jbLH?JC>HnHx)1g}p`wuLen}qpJolR*(ic{}s9c9MVGu(&j{ z5NGL+=AKLsBDbdVh5kpL6=ct2O4RYJmB`@L>MtelA~z@uT4aq&oY4SE0W^M>L&<_= zjfBy-i!-7U+k_rxP)4TP>itKa$rO^;nJ4A3c?@Jl2GQ~Ea>u55 z=9N`vod&Wh-{CAR$1BGLSB_FlWTKsbDf1F{k)oX%8qi@;>LvYa}Zi@sBB4=M5W?`&s#Y7aXOICdiE*@Zt?)Kxx6eAMrmI z0Eer(^L~VVUdxF?wt}`5$8t}tJ!F%HL&%-z|Hw0$c5~&a`Pe+bGf?Qnv&-G1_ZzR1 zL&fR@R6RIUs4>yAG~N?hj#B*R185s^#9xB@n)AKUY&8Ujyx0l(dO+o@)3x$UAM20i zo=n-Cs53X`X{_J$QSY4_t-;WHv}AqE^Sm5Z28V%^4(6~zrnpBukIUzJfAz=uU7-@W9}M!T*@* znTDDcnzoqUGu<*v=2-Ju^PeFdLUxCmLx+Z54oe6d6!v1+?QmoGr0};R0wT&IK8*~H zoE&)~$~USYYDv`j8WAwYYejdDemN#GW?Iap7<U+ddiKgAki zUygl0j>I*KTVn~b46*FDT(taUtz+$Hecrmy`kwWI^?H1p_Nc)hRCjXS#dSB=t649z z-sXCD>qplgSO1rk3>*zpHl)0qaw6r+lv^qGR8wlr)U4DFsY6mLQI@WH?e2B=)|K&=Q`R z8YEu|A-U38vRH~I)5M1))mWEwl!p?d97E>HjY%Ili_DdtLK=$uNo1hBhs+gvlXcQG zQb!KM^WJ2x5j#1_FCZ;M{<{3!i+wNMCT*nOkgqkVlp7JF!9fya*wXl)S_I7h6bkvM zb1>SQPXfi+Bt?9NP+>RrsOUgiOLNEsDTTC@<|6eZ?S;#vmb4n>JwZkbaqtO-Ikrn} z$pl=_GW?9ZGtkC`$jiQ4Kw1j7ajr!g3W$bf-$?!>Q2vh8M0>*}iHJCN5OyKr%RpYj zIbO~nrNGHk(nc~&IzfiXOG$U>20=(Gc}g~t0peSv#L$-X5tn06S43q>V^A;dC4sCJ zW5_J26DbxRBGT<4%G`sPs-MX+@iyrwj6pO{Z88+k7m0hx6nxuTeus>}ym2qXR5B1a zZ)3!sh*ERXLY{}{*u zlBwcXWU?GYHW*^aIC_PQre8pZttKtSW~5wfL)we^z{OR>>&zl$LMiDct|qa7B?mN6 zEKMY9P+yqzBdH}kK%NJH{{i5CKynxzGP;txBTAXk!{ZX@gVP414`&j3JB~8?!1-mQ z11`E?wBeZ;O?V_u6Rh7Kmlz#@20W9{z_FL%1Lx=51pwPkK+)4)Fxe0@-w!3cOH6bfiq!3JEgQk*|tIxE5bV~?Cae99np{m@2+ah7W0 zFKaV9`=R-RiA15OVW(sZB9kL<6^K>s+sFa(5;;arkx$4Ca+f&pUjXzJP6=NNmn>nH zXiKam-cn#`ZK<>zh{vAH_=G**d9Pc_FI8LCqZX#Vn>gOo1pRvDcKYVr8)frcxxH|RfkgG*k>t4BkdHKJnqz>wa z?FRqg|NiYGFOvPdT?fe=vX{J0-XKTGo8&F>HZ0+Jt}I}*AjUS=X|6BJl}{jXq_d* z{}D^2mdNus1NSVEEri5}Xo+mKk(7=$-)=>RC|yzfI(00t&98OHR~$4j)kae+mNsKr z+vwm_n~-9o^{lBjF~!o>CMLG+QIt?@S!!8YIDDz4t!4C(;WjCepYdYE(&BWBjr1%U zgTK9sthVOGF|NxI#l;1wHi;F3FOYj_F$ySk7JxH|lc z&0818Sgn>ew&UH3Y{y&2Sc{8OZ3Y*Nfc42SQ5v+y6q})5s?A3$p=Xh;d5nz|FI~#Y z>sgdwwLP_TY0OfzK)*lkeg8Tok3MMb`2ZMb^E!R18;Zgy!5YIJBv=!yfUvlAs?9g0 zW6z>C0MQB%{ZedkZBlLiDK-mE0V#))>0-;$o<(mo#|Rnrx(`|0tLP09C*CYCjG zSj*zqO~9M;8Ea)=immzL*Da)9(IE?I9rFgUh&K@-YzwGw!|FMO`U&-+%{QnM7ZF5! z>K_qW7o=E1*p=vdCas=2pdf)glcx;sm|Kfo84}~7%>L}k*fO_XEdRo%AU!@Rm_75& zO>tiN_3v0vuLhnG#oy0}IyF=)8G&??VhhHfZo#xtd5Zlh52llq;7B~15J@M4+Uk*? z5Lc?gA{mU)Z~&wG0-1^DVd`LLKAX@KEAf{KpdlfB$pGgy+ifh&dCj=Iel3#}z@X)4d*t_VUI&q0m^thLt}_&=5~(Fp z88l_jXBOAfK8VJhh?Rb0kZU}6TqgEd%)rqAM-I-7_%n8&?NvgmtAx?0rIM7B0<6hM zM_ej9(%`u+M;eA5ct+rE0_qrrw`Hhj7@mwrjU$lKNhkOmTEWB91+kcI;P2Dw*CZYg z;wW|N_&U<~neEc&18=zlesYQ@414S+KsF|lrg+wd48-5*I7CQ|Ik=vOgGIY6#NQ=2 z5E+jZJe12m0dnPAT(h$LfWt~6wQk#~7l|G=ePS6&8Z~jmSdv*bq;fpUW)gsTVOd`H zHTJ`GJr_K#MIwzIF>ySJ{`X(xXJxQ21zuK=kS30npv!}+v(lQ-%{THRJ_OFkqYk#k;B`V#MnP=^m-=;OG7zx|ttyIX+`G;)?xU%>S;!-wr5=?VQQz!$6Y22bz+>+y@|G(UA?9z6d6e4v*>WS1FsTgqf zgN|2%v>f;A@a+bqefa)Gr2R+-kX}MMi1Z%HI*If?(kZ0VNN12fz_(|SK1BKm=^WB$ zNEeVkNBRQkBGQ+r?<=IQk-kB?gnGY4lF_0oqyU;{Bg~UEaePbOMUwFJV?6yCPpa^w z3V29E59A}ggLDk(IMN9uPt27;uQ&{S>?+4x2htV2-Jc9XFPl*UBB7Dmq1N_Dg-9Kd zdLu1IT7!3tCZ0uFkMseaokjW(=_90bNdD~q>tnm#;p;p2`VPLngRk!(_Z{TEgWPwJ z`wnv7L5)2@C7&T(K>8f%3#5xk5-~aEFbC>-5XH%2GqR)b#Fl38&LNK)LM>O%Ta4NYAr{t<=FhJ z8)_!>l>*qM> z$Z#A4+$KP>hy6vr9V5XQyZEW9V-GNQSpC)UtE0$Khdpy#cYNvij$P?L$4~kd-txK~ z1KdyWY=PsrBa>lN{Yky*$a36w>;zx?kDuc=NXLKu99$_| z>)t)g`xK?KpC@eE6Fj@8U*Xz=7Tiz&`^xdhf4^gISlOO={!N{pwQFU0V&8H9f0zI0 zTZiq@C*JptUmt1jUhnsK>(P7c-6QaM(VnB&4Xd8daf$b;UMw3iuAif)dwhWh@*k++ zfBeAx9{I5r{P*wQZyme!+^j6eH`<*xesTXk(k}K4(&jNgRpVBVdBYzG7^emt1aiS2 z632u?K>I_WJtRWAk|4=hoI*p$^AKpS?MMx1SB2ocop98Gj@1hhdVO%jL(A%inCk)1 zaBIVhu@w5*8nOX8+FocK{tphmf z;$W6VD!xm@;RlT`ofx@Az;?sV#Pcj1A|TaZZHUtIari;YU^_xJ!V!cuFpZ&yG{F&w z)-(kdYJ+TwtO!eQoZ3*~JK4S@V9!4ZKL4+LIV zn?tys8IAu-WF6K*Fnu!`IM{&ey*NbpR9;5AY|uAlNcqHn`6+IW6+ml(1iSEOLhmJ_EDewKVYx~i zcaa=Z67ZjcCwVx+(YFmzH^Y~K<4flF3gGw(;`s9Mz*hwDRET;y;xKa@899!y!UcyB z>nnTXd0!l%q!@=k$Ct?Q6~gf)a(ro)j|4Bx(|}|-4l_J3&j5a=srzyaGEHVZt{DbR z_#Z;|;O##6umYWUWVn+!?hG7vJ{)%uz}z{M#;|7OSQFqo`Ua3N+=-xd&7Mjj?Fr@9 zlMmWYd-d*N0p@fYN;|`%D;qNkIywK#{F%%q((EHDCdNdIC0y%YN*r}(2S0sz0> z003Co`L}~DF-2uT004aU$D{Rw&_uFq1vy1}CIA3}=7%f)Kre5huE5Y*-|j~X{E06D z06^IH0|+$?U7QF20I2_bKREz`pt2;ZCU&OQKiZEMi1!Dbir1fvgY_& zi9%U*W5%ut`J%~cqV1f`Nh)*+ozp%SV0T&-t_%3G0n$S`eEp7N)xb)uLJA+y0z zi|fY|U5__Xn2uJ1g5qG=zf60L)_9J~Ox|jK(N^ZswEegK$DrR40*Amob<=AH*ds*4n5s-W1bhZJ zupHx6fFh+-pXHi2nVxg_B4tivB{E}0xTC=wu_0x_A|)MEC3$5f8CE4tWL6197UhXX zE$T*vibf5~MwRnM9qdN=jV2+kCaDf*esU*;5+@CGC;1d7byX+j7AMW zQdBhbb)X(SZ)y@=ad|{g8zdQ`R*+Upi2|&z{UpDjJHCjS65}KBt*gq{H1Dp%y{^)B zc*}UvQY2TgFX%%rV}AdkES3B9YhB$o3F)PLl~viWh^R$(;8G5mCuZaN`01Txi!MC; zBGo$86>mgKuq^GHw51U6ncs8L|NWxt6~YRzq2S-v+q!ebU%@o$Nc%32r-pHY(&*4tBS5oa)g+46K zp=QV~1CD=z9ZYnBC$MZkB|9wo9+FltwH<1;{59vMUxr;odkZ0D&q=kzD)CXH>bP}_ zGhkC~M$bFyC=-s~Z+_PQq89wApLZ4hi+)9txluyQNe=E9iK@clp}CrjGSIPBK~TON zEnxo-64iiNYN#!ew11f$&ITkqWXUc|A<27ExPUzcWRgA$P6)Ccl5C$j#2*pQ+z2~J zx&hQyD4Sm!1VQ~qsbC+xO!WhJtI+Rye1Qs%>HiBtt;(WmP-*%$V>!2H2O{4?$qbGd z)cQMN_pACZwK)eB^=X_h$%5)zOrg@#*z~H@hMDbUW>c+xn5UC@D1LH-iY!0O~)Cgb#Tp6h9RQ& z(p-#6nfKv~HvWGjX4)GxMm-y(gq9ThB)XKH20#TOup@JxDrej4r!$+Cg23ukP6$ zLc&rM#CkLXzq@w6s*p(Eabmu`4>3G3c!)egKA-RtDc0KEKCX#W8;$3PbcWq~a>cvP zHd!Szw-ics#qA1T!k;(|zI$7A6mjZR89#vehOV22zIN&}x<46qJTTB8*D!|&W`u@F zQ~Dpi$^J9FDZB%#)el{*Ee*3BVlo5JRMB zF@%x5rYs3#3|V-L_iFqBBJ(C?PHICM?UgD1R>=ZZ##{kwqyy}ekim}W@R3Kt;*trOERaPaG_=9t0}QvAba=!heP+YEOe*z}2`C4oQ=nw~OcLB=hAoounDNHN zhpD6@CQ{iP3c2J!_asK$gEX+}ej`HJu}5VnZo`&>+v0K&)3d^HSqLj-LgJ6_(5)R7~4LWs?caAq!Nw5(B!7QrvHY#GFU$NPH+GX(>~$M?kWO^iQbls6i3>;yYL$%w&FyT1Ss zL>i#B2JYu2`ct#_1W2TfDj;a?v7mV?yB*eYXl$_Z5~Jzo4&rK_(zEg;E3ewf$RzUO zQeT@3(K_Vkz`SiCcMS3>29!YDJq^oV-DV4lXgFclURg@~dzoBYySi|4VY|S5f(H*7 z=*P?>*hGPX-{6txmHqqNStDMj!UJagLUuVFuDwcpfek0!vG9Fu6rU5XtVw=3W-Ea` zW@5qNEblO!)8(u3sov%`v!4~=O0(VWcC`O1Vua4?_je-76PPs++Y=e<7#3YF5O zXJ)Znu|}YP4BqWe16tL3qvz-Vr_S6%Dx4P2(JjEh8?ZOT+qxMZW}%i20tViagIL3LFo`E*)5=$ zA;e_T5C~o$(ek9%;}Fqm*YaTxd#>OGjZYtg?*N@USofBk>^9{Dk|dvlX+$iW#8KtU zid&?a>kek^bhN?9lz0a5N&GVG81lXNX(S>LL=pS|wO>DO1+t`Mx)(d}@2F;A29Yf? z6!Ep)>Q$WUH`t0@x$sXv0jL0{fI`3*Ko+0}#0aPa3;`AaUOzg@mmUBGIOAvJLkNHd zhnXKsINv^sjq*fGNReRapwZ ze|fOaw@Bxv2%&b-m&3kF3&4Bi{PX-1bd=`)&}G+pq;^sUOkh5a8qrKLkT1Ct3N6`% ze$p`UlF7tljH>1g#lFdiIt}{viq3yMkzOgaxje77sFcn)Yp;;NJ~uB->F=L`N!wj_ zx0=N^%6OxqH(E8Ds3uJ;-<4g#W7xWNUgSBm7{%LGlaa{Hf^v;T1L~Auvw}18#GKp= zJG07cB2&uZum4p<>1-)%5{0psy7Ehu|KzrSv;%R z%8n?KzzfpkH}!qMDv;aCjDj)nupf)E{l!CcR>7ZW1IN;F$TnG41ma3QQxhtV>?Y#)h7Zxj{WW8k5q=0{W z>F8=9ir2Y530c+jv2~DI^TC)dvx_upAQ*art54AluoByJF^58k+@kV{Tk=1D#{+TP1)y?EoogzkU@K zp8gR$q^Xg^{{BGkGv&ZgFC5H8FDvf$bU^q;F3||nVn{8ybX^b`Xhp7XaGjPBH0!F9 z!MV24z3d+zE%dHeJ1^`%M)wS>z(d+5qQn8TYMGGKNQ2=_BBYu_W(Z2{KL+J8ZCcv+W77pCPC8pc*~rFOmIedHO`r}WWe{%wAIYvZF0R|OyNI`(Q$>- z4M_ok*+n&@W$mbcU`5Mrmyj{wcGJ6=600tH$LmN`==*fRGHl~49_l&a7Wut`kr_)- zwZ&8dXxqiBXncm?7GF$LFbpJ?jt&bG7Y_#s8aPJNQLs_VprK$AFf~sC^5YE+6RQ0G z4Qf!vbG(N*yTf*S`VMR>J~({K;(9vy)^fJE-1a>lSLd_Rx4aW%Zr9n4zzLy0ZhUF? zw(O|B+}}g~;=t8>zF06`{kXs#Do!Au^v$78%?5#bpzErjk&h0bR|*`D1#QwVPESvs z&XYo2Kv5g)QH!vGjD(Lzwkm_1add&<3e{iS-TbFKNKu3phD_@t+teCu@Pf16kF<*3 zRDSN1Do`b&mB>I^M8afmH!4(5I;%xZ%CRN@zo@ehx|gzwN(x8Y^-QDHX*$y{a*b=w z)^30Buvq*Oa~UOaeW}rDG!qw@C?O;EyJ;cl@KDhGD6>iv&18~x^DemB#$@7+_Plx0 zO6l%#lQsk0baL(P%8R4va&y_4nHl?IO#^QMi^Qz&L`j_kEQtWjq8DSS$Angv*f$z( zN5x(;jGQ>g6jOWhqW2?H4}*J33-OoI!(qp)DNL>?JDn05S4N3IRWw$7ArqXP9)9Uc zhC)0ttVaZE^c*2)u?p20W=(1lzm$b!c&<`JCu)?2&SuZ6<;F>g^H=&S$Y<@+a7|AE zshg)bTo+a%>-cJyOqK=h!g))-JBTanWpnvLG;|K_7IO#4C*?QnTg22h>vMa2bk(OO z{1uxZ){2F+fz_~I@+DB7{{v5Y;8$H~=?O+HTvq}6W3=K{F69G%9n)Vpa(k`n;#rn@ zF)BS=WUjpsjqHSN%BHg-OBaw!_ke}PpG zfIY6jl{lZi+P$&L;CGedksaLSyd+RJkUu-~t_i&x!H@{!ry%J`vcdr9Nt3S3M|W~@2^M~sF{ zUSksK=%vT~0(Q$%r;om{Q1oAt<-lx7cgwpZX^RkE6%uyZdq8 zR2^S>2&diU&Y$K@6;E^_W8js-{H7R(?i$>dEa*c2V$JK#`2>lm`nhu0)Ypg)u88`C z=Z)=OzJz41+$n-q7}WHyK#F!4-JqUcw=Y2xav?F!7qLs ziIgTw7W4fi#e!=4R?&UM`nV5ZBn*F<%J8f8@pLOv?8{?uBHm9}gyN*Hu#sETV4*^) z*OxnaZKS?eo%uGO%(Fv7y1@m9^p?@nw7LA_d=u>sHp}%QXh8Cp4rhWEa`F-=jEZZ+ zjE_xN{~$BE#LZAyy9FT7l93}xq6EG`*HIa&Y*6%geDsejm3Daq(4d4Be^j=E*bIL@ zQJ4`6s4!@%L7?zyl;CIac$pmD7Jb~si(=T|!}Y9ycTx9%gD2vAKz4~31FqpLxTS%% zNBo!CZ2;}HRnht4*7X%=U=<)V!AGYk#wjmtV)7%T4J$4d77py6#f0*!^BmJ7`;qS)5Td&!SNjYXe#oH>Qy_M zx7ZXe$9qZH4lcgW5p6pr0#-eyl+mn8a9jCT64gxZqbcAmMF6`WPLRFvWahR`zrTCp z1t2lqecFm4vE41to`qXh6zVPwS>b`ct23>OvBlaLmSTAZ?jfEskK8Z(Kz-mqZi;eI#M;489K_?19DkKOahf1T^>5Yu;nR~_FT zGkLX5&*eA?9^mt3)!S^LY>mv@;eG#Sgpk?G*s z6;r9){8t4ejY zE{@dCCT@S8$YSxZ8<0GNzMCNSU`m?Tgr=9nds<7p@Q2pTV4^M}D!Bjz%W)ksq!L2a zD@!@SfDiBA83X~iL(nmloCcsX-P$NYqyMCGwSbD8I(eW&=}F5%g~}$SCPP3u6i57bo7z0DlEgPT)ptMu{UMi!HD zfM1)HQBWa?dhnX~KBVfz$&5&+0fx1x=BklArY`JMpOF$E3$E7MX}n`uG}_n3(WZF9 z$CCBMYHT(=>r037EpTCLNY-27N6W;DXRg zsrLkfFc-x^xT?(p0#iQbJXj0oJd$t=DdA!^1(1pbLh*L6XdI-Gbink8=d~T0(^RbK ztUDY>DYRYirp4MHl$ioo!P%VlJ? zu-D5xZ8JKHvEw!~4ABpTBa>?=bj)gzCSIpreVnkZV5x~klmb!?Vlru?7%q3@@k`CmMGuR%Z{fnS0DtkUhdQSO%?tF2ViynJSqQSS)2Ix)*m>Ay3UWF;7%zCl;9E6ynFYQ8rQ^8at0SOBU&I3tO{|!5_f>_8 zQI&`?TUF4jJ|RraBv96I=VI=ofvNs>m(F-le(UWsYU z{Jm!9Lw@-2#&fTrxjtNaP$+QYt9E@eg^Qw*ZgCz`QiI zQ~7sN93Mc%yg{;(ghF+7+F8al^!!fzS5Nuf~v`pl>{uD+UW^)%-cE zJ%`W-vqlGGbo2xYE0;x>!jmu{;`b<@sIOc2PiV%LU22c(`NulNY3k;NkzniSsz$@R z*K3G0VQ4UutoZPwuFno2K~h|BqTFuHJEO4H`o{7m8v_}52 z{>3(&cGjyKh8p1+J#GEAEF{Nl*~||~DKPhiB>S~saNSnZ^NFV3>Cxv!-)SGhI~vz$liEx-bmaYB^FWS{RC;%DEqYKRqGCb=u%q_Vz>(RBP@?$jptFwh*)F@ zvxxP2$>qhurfDnLS+v8KC}d454djC`t)Jz>ab$_sj*RYjCy}-L6Ii*IyJ%!mgfj2% z({hc_)g4STkQ+du?*#ElY4;VVjBPj5e2Mu0RQ9aDqp!)()%p#;s`tL*TJmqFGu!dN zWq2W{Pe6cFa#GLo62_uF5-WLrx~c@7-CSyOx4GRIJdr}fijO~{j%v&(XYPqKe5yLW z+3yAofQM@Dd?Mv=8a=Wn{{=Bb=0H>ATI9Q?3c?&5*@OYm@YSfm_HJ63{1A{#Qu2Hc&5mk}Aq%~a4z0<}55ds{@ zq~dJMsZL*-5UwIjZQhnl{2O}2Ap4UNvd~g|m~A~|&in=3ZH>3?FdrF-BU>P!|0uyez~4*zqYU$G(K8mhiUcTbtI(c3d=NfNU5F)0T!vHvK#a zdE>+KU6{&OC@?Tx5skVZ3_`a&5hkC{$>E6G=|cRl)ik!Gn4jHejgl#njUPjDTO6*7 z+`ls4szOWi0b%Yx1*(E9d!Y7VcA$#Qj1pI({AJzo+w3<$pT@M+eF!+wgqCLVd*i4< zYONkaWF+8p^Kw?6wPUZ55v%)M&nIF#`%&+%)h(?bD_!TijUar`udsn^<*u>n6dK9j zE6ZMugz0C*d9yNDK@|2fN5ERK70C>>%NY8)>ROSWW{hRpFV{G4#7zsnb0vCbjq(q8 z0zbg3&+s(z%p~96B=LvnoObZQF|I1 zXS8n^TN5Yh&daSMA*X4FjVZGa&~GwNB^%$5AM{S%6h?!<-pZt{z#%$&(PzGnV_s|i zH4Ff_l*wHCvCbebJ2J)&;$db|*%YvVO5?E{io0nL(d$1X7$57>l|p<)H|)0Ktzj|Z zv7gZf9qwOM3Co=;6YB0jB6cG?Y-oe;k3Ra?Y}iUPHWjyaS-`F(nG@BGp=O0^6va~*()h7X|< zVcCI@83IJ-Ys^SYBoU1yB=Fyb3}V>;f@IkGS+&kGeUGy#YEH^v`=gkp;pc@V`NsiJ zmN}F6=mKtmS|05QC~KDEGWb08W8FR1NUzZC8A{7lAUwjr0c*wd*N9RYMTw(b;0o?@ zMC*9g<9og{+RJ?VGyd~w^PBY^5E6DN=ubk#$HVONAwDImU!TD{*HW$rgp4+kt@y}R zgSa5r7FqVl=qtj8iS+Ac??VyJ=U=xyl~RXt<&xbgoY3ZB3*r$I)2L;o$Cabt@;Fmq zsiE?2Ml&*zd@;Ab4`o=Av>JPWA=I$QXn_EbRDQt=&%hx6I%0D$XrKy88VgC}G`wV# z^5PGfNz_Mt4Z*UZp2a2+$0(kX^x#UcH6-qMJkZZaO&NkT6N;rrPSmz3V08SsN5s+C z;)e>2a~$GW;%GCYx@dPJv(Y>o@@T-G%{Y2Dh%Ul9@($z76GJkXuf$_+tV|5rEW+lj zAj9|c@#UPr)5n_lXYw|deYM}rTryl$6d^N%)S#WICk_SD z^vZPMF|uZ;b)LMTP;|Q35etsEGt9f9dk7~{+=7yE=enHc*k@8wvz&VOVHFQ|v3)h< zr1WkD76^=UNN@L>b)2=ne9>Rh-||qZhjVm>I<_znQR-f|=ovMVvy!YK!RF@zWKlEu zsB&WiIRVyp&j^ohRY}Kz&2NZe9(Wk9S$kRt4QYiY??9lR_8)DOEhqRV&gU07fxJW@ zoNzeYCxXwDao}JEIOE0SYDX)?Ss`>ANX?Hj1URy5r64x}djE>lsFa+R(GQ9A3Z3Fs z9u(kp;YmdE+*8v0fL41>o;FTO1371seV1fii(aD#FXgOLQwwY-)<_ zem)H{@1g5avamgFv3pt8iNMlcUv^IA>y`imHF&sAVk4&03odZ-x~f24dB&lU8O66b zWk!kB2RV$Vg8)u@E<(?4#pXrbT-!R_ZdJllly!MfXFO^Yy zu!8&h*RAVvAqux$5nnJP!TJTIuho-!+E zHB*UfW8XhTP^?|8dNmh>Nw~kPnFkXbV&vgXU^#lU$E7CreQ1^PQZO|q$E%b}n6V?n zMd5DT>WQR@rkzEWF4v9gJK)YWTRtVb8gCT?sxjWqKQkx%Jm-&Hb@S62SV{uMZ-Xd_ zfb4A@Cm*A0mFBR7`}zA?ld$9Zs?S@aZ(IO`5WvV6*AIwEnZ6{(RD9OxM%!lDF`64; zXs)otqpczJ$; ziqq9*vDMKOpwJ%I+^=n=h0nl@C630(6CY}&Eo454n4>HAJV|KV4P_)MTVn6wEd5M& z-%MU`SWaX0@$ji4ldx~1(cZNs(|hOC_f8)5n;U)fm(3r-NZ?q{6F-3^7%gH|yA_q< z6mn&590}AIbQ0y896~QN3qu5xg|ODFD-Fc0~e)uCB3H4-7a0^+%g2Pi(@MYsTSS zz-t>7_XHgzB@s~EDJa1yh@54-KxDK!NAhzoyL2Fwx!_&949^!0$R-U#G8T6EreDV$ z&4_fY31{{v#dJK5>)VkR=WFJn+Hnh6D%FqyW9U@;$fm!;rYI^iBh1GYRah->G^=nA zrs36S{Cnf?1((=8X|d#9tsi4Bj0hgssw91dEWd8@4o2W7rpWEFrF2SsH?3ajKfx-9 zZq>Tn54KUSZT7z4E{RtRXJ465M9ay*oydT)q|_~7YDN3rlHt!#;KjIyT)vm?ArG_R zP2Ht9X2hypKh5^|hrf7rgj#aih3Vn3S?C$vw^aup0)3c+k&Z$(%@dn;PE}Cg@}`1; zN|*))MsIEm-Cz`Hf#I*D+V(A-G?zdOT6f!eC&lRP!voJ_ob=$Rz1u zSDhZnG{hcqveKC>d&QAd!;?&pdBQ|I@l?F)O%&H@)5 zj~}{PJQ)QaA6%Yj63bi&EeX%|y*{d#pC#6^;?Gti)#vqhVmhJ5$T|O0}fYPA@mD z8j0;dy_%WvW{H{<$kCdxM-`u+<730%X>=8N` z#B$yj;`D9$;NQ9YTz9epK7J3D`c{U96^bx= zKvGXX`0*`3fSo9r46#n0{FSm~+03HVXYm??zHo;j&lBIV`#P|{-Wh4&E%Af-pH`V7d}})<}Uvgn>~I?KfP(DHu<3SPt<-QIX7vvq>fWt^m^V{4fj3% zIwxCiMx+!p7sq%o<^B{F>FoYSBTiV<0 zn6U?FE8!U&9znT=PY!89Uqj?~?|0YLv@4<{2>^k3V^ZW_q4d&=p8}+i2hE*op}xGF zV8!ep9{PLgYDa04{0X!AQP#;?uaCf@%3Ut>!U`K0QB~ujsTfkld0AlMpT6%?qHLSnVz`tM_~^BX=xFPeznaBkgjpTX8VUUSJi! z$~o`PdRvo^gp>-1Q}m_(fN0fH0f_=t1g#V+8YU#T=l0g4{Tn1eyGI~(DDv9%>#Toz zfB&;x;4uqJu5g8>d%pd-QsXPNp?3Zjf-dLt`1tIk=*vGk1pL~n1pe2JcZS{{Tmk4x zrfNMH>-Y|cuR0nNO>h7z3Y+|)#t!T706e8B^ULP`Au$7 zPaX4o<@8ll?w?A+DJd9fvBXNXqnZ#L!2|tcazK(=twR?s=8&lUdHO;qX^OCS9QOAu zDRI166LYvV!%jKjQ35*W$UJ=ifayp-LQ6Qy>8K(Gn1j<)Sxm$XK4;S_u^@gt5H1*O ze;-Xy-9yIgMo*CbAnQFm2B!Uy#YxeWHh51{U%PdgA1;4(jThWrY>A4~`3DNEO|rv3 z4OmzNMDYF_o1hvRI_@#3Yoo*pV6=^B^w+13nlvV>r0GE-g;lv?}Ct#eZwU7qZsLj(OBU0{I*20cqX~w{dy=}fcdEwlRWjiVBaF>*l2KBqI^yLb zGpbr@4;U0~v7XiW5fasHUz2OjHME&rdV}#n5z7n*-9~eF`k!btRB7xVH>GhQA@JW$ zizjj+@EN?;%ki(4F}`*7Yw<;fBec5h2A^pKmgsb(2_reUzppM{{w}<}=F=fU5S$U2 zU_e(t5~nNV7j@2n^P0%ZBXMo78&etR4Dk9YwuT+rfic$+B~&Cyk+*k0cvZZ$$$Fx4 z+#S=rPkswuihkrJMfMR)7T((~6s-EyM*}Pdo-T+Nem+v3iF>RmZew?ZY>VD!*Imak z!<~9YHUzrN3o)$7rOzYM>kcv#8V20h>ln*X>F10nh>yXZqP#}%<&jrW*C@VW_EjkWzQgr;sXlqO zRW48v4IN2I-A;IB9y+T(QRIeEIRbaX@!tN#c6eMAEWIO46i) zkXEyhtYuPK!eR-EM82k{7zepxNI}00ONVQ!O?I{+)HWfrPD+`LM|q-^H4K*olAgP) zJXUfzmn1V5XQ`q*mAod)(o#MAMN6B^)Q z^4ROTQ~dn9rUZVuT7Z~Mcww9zo_AQ~g{t}OMbTsTM&4r=dEWh~82bJ0No(~^B}dlr zo-8I~BX8%zmC?zRuuIT&j#|@IZ*ZA;_25wA?JAA_BpJD+7X0|;_0W4PWsVWlKrir& zd>`HBRWR!T+JFRl|AKY|jAP}m-(*i&QfS1)kz{|sJ~}(1wLs*Kc1n~^^nK;?dY0gf z1#%co+9^|wz%YMA0Yjc4jI@Wx>4r2WpX0`rz-ttfYtL`ntMzavp`&TSwyKW!0>T=n zOm3&c!NJoo){o%MW+OJ9<(7fSRH*w}o2jc_kI0Q)CG&trGz0xdWdKj*un&OyIpCnE zKmms0kG#@AVBgYH5#)0ax?gm5{Y-NDu3Mt(-;c=ak6fh1znryyGy~_0-Q0A8Qar7T z_Zx^=rQLR3*I0hfSqC&tRv(B%=eC8=YKw?Iz+Z?Leu)FYbAzomG;_pyMH_L6kFp7A- z5`&==8hmIn<-p8jypbw{ZQFexZ5nY{xLg%tWQREhoOneE2XTy28dB7)}5 zn~3^1tLyEnR|bC%#m4M0S+LNpEP7FLJULh*q3G8(MM(+{^H(;e198551bEAP24Rm=mEO z6RlY&1uh|TD>%;2)R|(g9}}~hIzHESBX{G|fc6FAd8wyV%4`$P3N0meva)dw?s{V? zzMq4J6uPkoJ%_6fKbS;I30L2?#dlNXYnQ07^Y$3cAlBVl&y#Ge$3XZO?;0xL4(~Mk zN2DvHc}AXkZe1j`@PkO&rr^N}k&MyH9%3Y8)v-WV{de4X<*jhieipSnauaTIxvBVC zI1q@vFOQ$d�WGVne$kU>JWmkvONb;cDU8VZCK)IMc=2@vs}4_xoZi@-YX0qw)cp zqto`in^+9S;Hd>#I_^o*k^pU)V)LuIPo($qjvruLSP!zVr+7+QAAh-G!0wid*Br|O z(3?dPu0%hB$;DB%`p|hn<{q@2LEKiaS7!<>c>kvLXy(pUadEFLg{QkH=cnqZ+<+p{3_ zobVSI85gnP#ztX{^JURgo?Bhp*IVP{jBO3H>hSgz+Ew+j3RR3@9dmgmQ@fSBz<9~k z!-?JD_JaIe^+@SFC8%k9->d(NKWEHr7ar)(ZZfd9dqK1Ov6_5^c4wIgNT&B&Iw=Si zG+HjTWl7R1ev2X5tw2TL3{BdV7`AOuM-ku@{~gZvBLWOd{AvL!6)V#EYJRg%Ne` zZ>gA7VA#VZT%|v&>#SpHYk-ePgdI+?{yLinmSW3X!owk(be?Hz_B7>IDGBv+A28w# zl+%23p#`Ms9Kn2oyn$&1)2d*&TPEHak-W$k7VH)KFz?C>c1et66e={oaGa2>$s-wb zI6uEcxRBV41=BSUUFOetiG#zTKR?SL)yNExvCeL`+S=|Kg4FX^Fy&Go9@ zm~~(`u`+|&9s}zJybM$9>wt*5svwkoF!ZnN+*~OiPKc!r54hUec-&BR-QO_MckAH& zHheQ168#>OKmM2bDwLJS7v8B4%xvH;yl<0%J z;cT;fdl{!LvqJ5Vk#m)^$>AlJk?LZ7Ota(3P4ptFU=nb)g(c_KF#~>??%EC@xRorj z$=l4{O8|A=^GsT-xSo7hqTb(F7g_&Duc}#OvI! zg(O?b2#I}~Yy*AESX>!aqN0oNy~$B*tJSHyq8@Y>?%$8QE#DvARYDojU6?r(B0Gn2 zT*@D-yuF@%t!&I4O=F#Eck)vot^L~toZ`iJ#9sCqExpE5>*d%xYeD8!9nIoQUCw5Q zW`f^ckFsBdp%x()ziFz`oFTYYDz*YqqH*QRRtUEJr&}um=4oDt>&s*R+$^jrJVc2G1Re7$a^CPO{!(r9DEEhImcU$+0`%Rp_uOIHXr`8 z^!4Vjb(^ve*{Gh>&Gy#aS~F2yFm^X2f57IJDC5tWg`{T@qwQ|AkXK zg$X~HxnD7DMky9Uw3Q}!Art%FCS)l!$0+}Y+}XmJ)7tL1!I z!`8*eeryyY%s*m;(SO8PU}g28a8^vZ2U9I^>lWQEGMyH2BF!{f7gl>jLbR6K#zuQ% z%Dn1vM^c}%L)Z|q&XKaPTE%|uOTKz3|FFSx@>^`5uVU-$Z&b~^e;u8?Yvt4xc}+@p7lTZh4H5vy;o@A z{be2wfIl|({?g+L;NE$s_^pQv0C5`__md&7z5(-7r=)bmfd#lL&D+*~XNvjeexIqL zz~x5;0~1W@XH+?OwCP|hM0n~qJ3LO?fB}0;UY~I>(=Pza(}0IWx8M-us9u(1u0(b_ z9Ys&cRjlw!w^0hfF0zxF(8{x5Q7ah&aLz>{;jllf)bslLlj@&KPqQ*6s$loD@oHoK~(2wjL@k zk*D{vQlEMT8ht4izFGC-$}5siDj$SVZ>?ErLo6#==sJ4U`Hu+`-JRa47JxbqDKG7`i?fIND3BXl%t*>k3T+%+`!oi zRhdb1vwe$uLI-G;-(bKayr^>@sU%LSrwA-P>oxB$CI^pc_j<>5W8Epp{P{ygfzr7K zL$znh$8ATu~xCaA&CRv2x*ja=XtKC zoBYp7muyn%Wp$kH$VT7X!0*ol6|%A+C|tx&T*Ijy6PS;bso&ulXjWh z<9=(EgYWm=`~rST{t4Wzr_z;)2}-G7qnhUI?2s{psXdd$YV=}hWO6mT76_NdW~}$I zTc#L%dkhm&R@mK$=A;K;!=##{p3(W4(+H9QuRiSwct8ihBjKlqI7*MAax{iel1OS0 z`;hBk<$)9a`f$YvlqZAiVocqBd)X5*hs`p|Pq1U8+v|Y|K%B=Q#Ur^n>_HJK8qPB& z_f_43_=4h;-7u<;$B}orH^cR-1XXN9Pkdoozb!FN+D^!*AGaZ)QK1e~_FH$zf6}Il zGm(QcHu?+Y@%%ew^r}4v-HF&;AjMWB%$|>)ku0?k$GHpAQ7PcO#pIcZtz{^W+oK`K zQGojVGddig^CDxCgHjvra|R)?h*xCpR8wy?HA^?AXfo$}$`Nz9(Q?gVz_SROg}FtY zu?^A3#%(EeXgo21A7UUrHcm+`HH-A+3EI`^05#%^c}l~RjP*6rk}MG;#U|M$aooW# zJk^v!2k|!-cv6W6=PLkQ6`KB<#I;*hYN1kl+omJ*s~^vi@0lS6ne|3J#yz}X7y zqvadlYE%5HoAcQ$$!Fj^r_IiP@+ce3lD+0}XvP^Y5NoGqobzW+P?QI_BM45w^k`3d zpfp<+e{-i0X$?2$&V9*MzX3>9JE$xoKm`jH=zMT1Uwg?2|WDZo8CES`KI)hBf#{-iTj)F36g$G zYRgYd?*@|IQvHEFo4V9EtWQKnc0Lw+wKX&6>TS21;&e*JXVvZe`PTO0w@kz4=zZqZ zK{)4+=r;1D4S3a!JAw}C{@!?h6&*`0sZL1)7ES?XVFD>vU#~D@$)CK-mX&bz#SRT~ zw&u`v9PhSXZJBwLjV^l_iy5i}qK z13b>6e17+EUSVli5I}+4WEp6~&){GEuPK$;OK#Rja5=RW4sCU~+RYPPp3lNQZ>2dB zOE+)cXZf;Zhn;{M`yVZscZkVl>5ymV%8m}$hcfO}lQAAIbg857rJWQYQG1h(4g0~T zrjjX|XeO;PRzg)m8MLwIE45iGOR&}~HtcOMmaZ>s{gc@b3*dW=N?hgt=qb1WcOwTA zRNw8UZIUlo3G2ejf}JC?S~%&HGgZU3gJW$bJ~Iz-gy!cioUE?zo`#!t;)6q!PZP5% z&%Qr#W*A-iP-3HMas+uqjbY2;O}}WJSC!W-e3P_hUnuLQu-{hWD6jd@0gZB`XPw?T zVi#-IL}iljS@AcKwPi)mXlD+gm(vV9an7G!`XFd94rSYGBI{_9`@aCx2P^pZW?h6g zSlgg(<sO33dS%@*=f+n%T zr<1G=c!WAli8VIuXi(9*YRVkSbDT5z#j=#jq_wkAKs{Eq2}c}jiAN->lg?0Le>PpT zCJJT`fU>~t*lu1MDX}dMbW~bjpLoN|MB&og=sf00GutjtmsTtKFAgI;YBxPD?47Iu=x0>%fwDQ`>8@9$6 zY7?flv#pMD?{E=7T#D4A*{k*rYn^)E7F_1pJM6$Mct7hXtm{D5d-lrvhBIhSc#=)0 zRWRAJZ#aqiXyhqt!x@S?xNo4GfLcjUV$;jZ@<57%NUXjvp+k?HZKdv z>JC~{Rv&xAabgYz39YLeCSbXSR?Q4dg6+m~=$u)UE_T{hoK8teY{x*olY3+5T|a!Z zgU>&a0tEd40RR910ssJ-Y*^c04?Oh%8wdaZ0002Q@DVNm0002c+fIl2F#XjDhX`{3 z0RRaA0ssI20001Z0b^ifU|`Sr$HTzD+4aldpDAZMPy`j+1ps|h1>FF60d0~~)SW#L zh4-0E-ruNg+xBPMwo%)*ZQJcl&Fk8>ZJ$nRWvyq$!>vXl37>}T-AAYfdeS(w=Dorc zMClud)ve)b^F%A!FL#GfSa$kwby#O>gaw<$bKML~s$z|3*T(kR-JD zbRR+v=tV`)g!7^yPsC6zi>~T5YW!9Oo;m@)>0;=wnfaEhwj$bcL5LcKVag6~PDgLEXTn5P487S4;q)4fgxa(O$$S?h)NOcD zI!01?B*^&?wG^G@Z?N8uWUCN@tS*R=nmhkC2*jk?n4Y8p{p_QRmVQaWscu&L?=^VKb^+tO{55(-T zys;6ni}6UjVth<|ar{9dov4ynmy9NRCvPYJq^6`!raPwZq+bvgVjXdW)RBeANtB0b zLam~%QQv5Zu1n9MSI~#(%k&eb1hay9#@1q2asloJUy`3M1cWZa7||~-5wA*Ksk+oq zYAubH)=Oulo6=J`Cg+!H%RS`b@@yrgWL0J>@6?3aL4B*?jJdVx+B)rkc3pd^{Q*9Z z0@*-W&;)b`qrgJ21DpnT!58R)EX)h5!ZxrUoCue|-S8~D55FQSiX#o>MrBYv)CCPf zGtqi<4BbSp&>!r@JkE(r<3_kA9*yVX_4wd_4cmyI000000RR91-T;pP7648F1pom6 z000004gdfG00IaA1^@wg0acANdjkL%gx}g-in(iTB~xrWQ*86^=i=n~jJpGlNVCVz z{s}vr!=m5iSkt`UtNtjHlEoFSvrcmu0>64X_R$sP}QzTONvFs zD_&e!u;C}7{5;p60PeCQ2LJ$g0b^ih0E7Qo3@Hp)001f<0nq?>0o%Z%y@5fSVG|=4 zlQzS4MnesGF+K(k?d?o1RyqnoAQm%RjAdeZjFmEo#afo&Z6*t1v8l>S2y%m1>`rD{ za$p@CR{Ba3{2&&mnGTf2742=MB?)9PY~to(2imFNTAL~1vdMs#v3S!4ejpLR&segl a0Ynt=GnQ`R7YB;vi!+u207`fxkN^PiJMWMH diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.woff2 b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-700.woff2 deleted file mode 100644 index 11cde5d04c470947b1c88e42a684fcf0d5b396b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14552 zcmV;}I48$18V4W@ zfg&3$aa9L;j{_j`-Or;D5n~(}6R`7Grq^DpD zs)0K$0bI%m4aF^?&|#6Q9HHKo9+2tww3qe?-!_9y!cL5PTXL$u9% zK#W4cXwa>hGZLdvK^qK2tN>9lB4^H=Zf0+DQP!NbHW%rpy>OL>I;$Bw4veJu0K0oY z=)Ss6vV*j{2OOA2{%3o)Xr8)n0c$2ZIU8 z2RQWW%dc(nwi8VLA(p+0bwXt&U_ZZ9{p0<=@2}I{zp*4)vLl_9IROkRO#yQOvjKAf zO93o`g=Il71uF|RxwS_R0!<_U{M~+SjSXoQs#Y>bsk$GMNFzpj4zPVX(4) zSYKX#d|Bd~k?ay}cRipmk|}j%yGuI5N6D$aqIA*0e=hB=Vs}A%Xb~KexWw^X{1755 zaX;FHn~}t)08TL#m0fiymUdAZ(sbx2Y%Gy%9B8;2jHz+Z?wIk$Rb!MV1d$LzeKXqn zcI;(rKC+EO1`OHI|35bAaoKWF3*CkZ3jJwaRsqalYF_c#&k)3%CrH9IQI2GzN=pfKzzz~@g8;&TbT+q;Ys8Fd|jV|4K^y<@Zz@Q;#opat5S6y@64HM?v zcE?@w7A#t_Y{j!y=n5U4fVgBG#69EDslEe-Mo7m06~F_LNiG@Xo`*uimYgsdF_W7< z1!;yL2*ZR3m#p%EE(sxw06Qt9@pcVdDn%t$Ln>1X!3qYA8h0Wpq3}9M(uerpQpzA& zK5)-V)q|`bjUAI5Rl%qlihIwAF%nlNPj5So8YqxBpXOqV$&WR;4yeskG zFj*tx&o>@L^Y@> zv)MGqZSHV)%Fi;pNRY9{nPO&{<2HA=J4K>q)dGtwvCPU80hMf`R8c#-#xA?;vdeB` zD#|joNRY7})NnW_#Wj+OV;0PDn>*Ys3*lH~iDg!7eIKyS0Rre=n(zQwl7JcVCHJzE z^ZAemVI_a|K)&X&>2FUq0Wu3@4f%)XEs!?=W+Ni?U%L&EB_O>3*~xaclB<6)Z$x*0 zm-Wl$$cGCj$?t43DjCRIC?K6sfLSt1IQam>kj|XX@bEGE@w6NQ$XXudwYqmJCuW0T zi2mJjG8VOL0>cmgUj0|kr?f)beznhpIs4k>Zk`QnfmXV%uOa!?om-e!5Lbv6je%6D8X`xh&#>C|`08=`5-qiw*fc^vM`A_zoE@KY-K5Dms5;YujDx7vP!`6WaAu z^E5Z|>5f}K+OlrB4ZL(15@pVk6f&_an_7+| zC-PjZh+ZpU@U&0iZw{(Z>yR#YDVw*#sRy;t!Dt$kw4^1|WgMV}95liq!yT@<;2i^_ zY(B@$O{M0cN)3$qEu4m(4I}BA55fHOEJWV|3@pgd!px0gVNsST;+D_{7=r?X3X5?{ zQ5PkFc*BxBEY35f+&vIADoLwC%Jen6v|3n3SHRKe2t#reotrZ(!qsSQ$?q${B`Wyopr<1gQ6m)J6;bXajQ7MVlz2Nz zCmv#S8zAVz*>6G!DIUbRJ9|vrcVQlRiXU6}Kx)Awfrd@r@!$jPxDy2nLOfhT zR*l{e*v+uhQ}Q{!IKZ7Oz#;&fJhit3SRj87@DDinRM!9tx*4FYyN6(5*R_vA`vML_ zV$27WeIW`Fu%_(|#Q`%))ifMBl%uBHx9)@g&`we7RDDvP^%ykKMIU1%M5Avf`u`t* zN*}B~&GZJ0nfAbjkEADM0vZjpmmFore9K$NOypO_dttksRUq^b{-61K;qUOPVGC1T z75BXS^rE;uwD=q>4OkVhr)kVE@6{Q)Tpr?m^O>@Y7&T_xglsu(nsm#QX)|)=4gFT1 zufQXZJ@M2tg`N-W9p%KoN_p9szp5Nq`2pg{=85z^#A>00#gbB%5|O;32@% zfMWp90A6$=0K5c-H32UJUIRP~cpYc{9>5!bcL9$8-UGZ3I1TUt;1j@8fKLIR0nPw? z4)_M}Jm6ch=Cc6b0e%F$3iyfa`PqP<0e=AA1pEp33vdqLZ@~Yi>;tBp2gu}4fU?RA z&Iii&i|+uq0H`m`<|3eeIGc-s`tb}d0s7e&oI`+1fqtF^=M&&^pkH9|g#@??=og*A zwLrhl;_C`<9nfz$n;U@s#M#^k^bgGDCScLow$sgy*wW@7JKm+L&n=6R0doxAv75CX zc7(&<2r#V}s-tPh97stKgF4KL9P2?I-yvAunx*erA}-mj!rwVwIwddlI*5c;AYUiq zpOLVY&?!X1R}^#)#hMNbE<^H}A1H8je8$`%L6th^ULAs92fdC~-cbXMt#uc9ZZ?iY z)X_cXayJTavv&6zbT-{@#I??^FZ{Tot4f<%G)~qE0h!;dXxh@QF^fdnhZ6tub;DAM z+l4%}$fKNLUHNj0U^kBobq0ay?k%@IFSv@aXRIJ}zSKA5d^lJ5ur1g2P<)Fq%?Mei zV=0n%onO~{PKVq1Rx0E{@zdD#6IjcGwfx?xI(=E7Ulq~Yde?=8;hVSCqEgK@2R<&> zr3?<139dB0_5?!L@_-OqQ_#aVlSP3zik$rKC3btUPtX&9RRk^peHMV918jK#$Nq^C z0XDno$m7C9CxMW6^>Z)D*-(e&gvAz%+RWYHW91Q(s|XMe_%_2NduU&oE|m=(`H*!ttuj>3h|q}G8~ z&l$b+=Yy%WXLYa&b$rbSVdl;m?uFf&sPs*zs%w>il_N#Dl#;7K=ui`#(#bOVVZ&hC zCKzJDuUd+I&3!FwxoWRLuXY?W2QS4($Tt?C(5auB9=eZIRmfW>}Y)DMw`ONFof>LVP}Et@HX6@ z+t-;Mapy2|$I(HG+hWqP@;2>?1A|B(lvp^meK2CVgsTu-0S6nY3Ux00Wc)a*&wkZI zD)R@?=Iea@Lb!qdd2aUGUH^LZRk&P{tmg8JY6(_bKuUVui5JGm^aMQ15T_rxsgNj< ze2rY{tOuZEDAjrZ_Uu)?$iG2!HJ2S9wlV0-IX;(j^2(=1@}3Vex$)Ms9->5_r594A za=xe3nURp!ht;t1R6D;S!?8Lwm;Ll*#d8T%ZhJo77HWdvRN38d zMiQ60Lo|M4^^?AdV_Ezpc6T}sj7%q$*mR;xO`yhY9&i*L^M(?oU{Xq4gQ!+ zqNSR{2xIKfdEa17qKh|q<2ZR4*_&ryPL=|m!Y217v|&@e#@LTD6m>0y$i!B0kajZD z<*GvjLgPT=C;llz9Dcdd$w-3hOs(+-cEg-#)jiuZM*!vQP$XqYX|wGS3iqg*GJ7g# zlL>mNC{MQS2%XBP)gUG|+hSVpSF1pf@UU{iPb90yLVL=(4L2lihvV1d7$q=4ym(A% z^XYUJfy@kvg{j*?Tt?9-8QDN4AO>eUEFS85ArKyeLfZ18ubx=I=kSC58t*Z|HhWqE z2u_V{;QBMgDjE=q0ETj-fG3jCLEe2L#6}wu8XaY|(F>a&Xaa^tDQ~EW00{~jB?%So zrFB(xw1|TA6x$^3tHj}sz6O2QmrJ?$h$c144_?c%BWI5>A;h2|#-qf(tu13|QxMm! zh$~dskNkCF)b?kq*IvK82m#H3eA@cK$OGL4UB8n(Ks99mZ>-j;em(S->&-LSuPmSCaH#^n)L zB9vj$lo|6Ra|4O-QXC5wR1WRYc6_J!Kq2yK`L*TYxjfCjvMVne&Im=y!D`^MY4vgg zo%S+9yJt5R6x^uNsHirFFra!Z4A`)2gyh8Lk7Ed~q}5*yLd(QvQxOLIi?P0``wIAk zo%22{)+eV7zPUS>zWv@8-+8X}IO|CP1cWjei-Ev>g4q+i*3~U-azw^Gf0V8N-9PX? zow&mWcm+oTkxcX05Bza&n&FT~zB`9IRE~UvDeY_V=k_AD=6Y<)0ZJ}{Ua?(j>A5LNU|HgoXtACi@G6Z7FC`05rSn4v3gZAY^X zat&ic=oo9)2phF_yrn;xOfa;vj}*}im94mRa8V-3el6k5JHtW)?fUYN)|<)-$D40e zglpI4>2GT!RluL3ymeMHnm-#A>S@;&vs!P!aGFP3rpqIQ=PBW%W_CU78A^;gp-UqS zYbB!@lW0HXM8ZWQ+C$z3&IP6OQVk*4qkhMkT+CW@EsKklhnBv=uC`M$Hcf!yUwr}7 zAT0E?eA6%WEp?HUVsnPGg=J1>PIPx7S#Fo&Z1M^&_t*;BERwGL(`fJgZ(Z0v0o6Zx z&wlGX|4Ct`F8H=F1HDhfI(*N0_l2-L+Myl`9F9(7?a)^gbjj;e%U`{jj5C%#K4I>@ zoZK+QoYbcq$rZ1EtlVOUzs#$&Vnn)0R?zCgn4#{pU>^oGoKD6?CJsLf$l2g}HsPPp z>5ET18b266A-%Qr1haMnM@bB#2Su~#Pd=W?(`(t+zSXXW({mQMu>bSuz60t-rZ6nI z_%`*8%AT2$PM}uwgB@tIIQGT!#G35atjuwEk~|Nc?N9S%7G)$SWO0JNUSVl#j=q<@ z344D_VlXP^?8r;u7bS^nuhL4^rH%N5-<@OGO+5o!k1Qfcy|nU(mLQMFlQD5oNbP*~(C1swJIEnBaaj#rt|ZA?bXuDnli>m38&|v!%r!Pf+US zUZD{lj8KlZM@WRXCo5F$sk2)k#nH`==IX|5qcKxdA}u&!HRBsRuS=8PzsxQwds&(! z2>L_V%tmWL3$XVw9@RWz;cs~|t|GkI(>1&yK8{`Mfke`nx-*iR4?}mcprp95?{?~L z>X{V#ud|7B;#v`*JF(xxB*f_>MP}{8O?v)1-KVW+bjV&28u_#`zqobhnzMDar@MoV zHHpthUslbG?owjdqirX-*gZojl6?Pv>o;AJ$qGcj6U`?ZzoKVF+A_g(L3F9V$+nsa zubmcEpOLi8)sJEjVl~H)-RuwM+Z6WE%haP@*k>ZY|J3w76(&#A;>8Aj1%C9K3;FNA z|7I?qFEz@D;>$A2w^4O5kCg2+S z$15^784}v!vp-xWy*p{1f8{&Gn@|9;V*TA_?!iPCUaZ2;`bD}V&sW%&uc5Ye1c9V+ zJlXBLvqqvl7yqaWN_@ui73HQDR#z@Vufujr9@m}7Pvy-vulYcYjVbqa8{Rg%-Jy59 ze+2MG-?&pgbY%@%vVC#s?O9#J)i~qaw!H^Zy7xY}xEtFUu2PMuczV)@Kj+6A8#`bx zJ9r;t4d0M$tJ8%R{GOaN#B^PSD}9sR*@sTfkBUFlxCT}|*7~=)x-Bh#i##_7rlmV>E6O2m0X{APF`>uFmi3)Y;*F@x8jgGs zfyl*~9S*SR|CqAZ&CxrAZ6A{G$4U^fg|}IbmBL()o}h4cX1Oz*_;g}n}zpJ35yI%VAxoecoiQ0Z?pBL=Z4(!r!I72*;4VbJ#0vvi=R!~jgcGp z8<#(~DBE%kjea;H2LE4Fu$?*lcxirS!e2P=tbTnkrp?k$;lhxvLe-G1jy=>SKomHN z(Hv41TDbRzDBrE;Q2{4DVFcel??dOWqQ1IyK0No_L*lP&9*fx~Zq$QWSmjcZ+?ytp zDk|Dhvg+u^7kkb_#}I<|KNI_iiaDbt0I6Q`atLtm4JmGI!-EHq#}1*vazn}evQ&_& zbiXX3rGIAq$nv~vtsT?_tEI}3Qc6y9@6eih;;UK(!O>lf4=xq;{k!xL|NxxDx0`-1l?$`0P2~1pWY|cuD%ht!Q*UBM5$+)|($y{$P13VmgAdb$q9FeKUe%yVE5rCL;?5yb-k*aQzS>8o1xZp4rZN*6Bia%yPQRlzn={X zvRXSmRofCnbkCjWinTFs@<2{hl#_T%;E9hcntW*67SXma)O+XNdBt-KODFeC)g-Wv zJL^fNx+Q4^{KXOCBq|9!$x&rD`#NW#nQORVhCRh2Q9tN6jzBdz(46#pv!L!NhF^FM zBL5V_FNz<9VY%y~TG-5(rn5CM?IEnFHZ!w%^siO?c$ zs$sPT=Bou=(_rP_4>LLNe|2eUATV2$^G_z{DgO22w2ZGE#r~{kH~ZyiF-J86vi(Dw zL-3!Eb{=a}3!B6dM7YykD(h5ETUT*Y?ETpIy>H|7I752}XR^JCx(c1J za)d1XmU_SP@5R~tdGEL`Us1RX)6tFUWautiMdZ7(ctuu!!9>O4sgo34g-gw{VX=Xa z@-38=abw`(G&FV#cdfgwLMz~(A^}B(d(S*l7GES_!cLTROvVd}ha^OZgim+6ME274 zlqed!HTck*@7o1aO?46DgIZ(MQL6TNk*JAiQDL>yO79MxP3Kh4uYyY}@Tr0O=N>-h_VDt> z+fb#hUfHOyO4Vs^upn6a*)2m?hhJCQrRlZQndwgWsm&D@=fEaX1Q z=Bqj$Y!@F2DjS=xlii-#x+=GzuqyuKA?~`utC`m=vX`GjEhxy@FVHbCpb|9Vx&q56 z>PB3JNd~0iJ*7Q{rARZPzGb%#xjOf4>;B^2t1$&<7dJ;!7awn)Rn6T9GgL@J>fG%! zDd|~7rMdZj^|$V@n@Uga6vbtAk>e9}(WMn{ii&Dh!`!$}ePIzPbRv^tL*_=J!^4tU ztHj2I%-o0y=fLm}O81}=1>-@Eo!uTZiZU87632@>3^+tN3?kxYt)kKdWe_qmh;Il< z^7!kE&9vNrtAnCbpCI|A+gRY1=9$KcvNAGBcVzot4y9MIhMO6AfmeDZAAa~Q{CXDW zn#c+Xi?bz?!^jan6QLfp4@3!`H0{WG1P79qhK*ISwUwgzyi@H!v+?!C;fR5e#fH|twyM+K?i3osKNoP4Vghm* zZf*{~?b#hwvLZdLji}ao1*bX%REM!>ca4H0s&nqDo7Gghnf^mz?#>N5>DK5tY5JO5 zx%*gMu#IDKY-S=etTVnpP(3Z$grug@Cm1}Co}X7=nxpR{<=~ZZh`O&UpJff4^;Bu0 z`XaG2h@@UKY3D~8pWP94dlUXmJfS<*P^4=5^HVt-gL^7rZAi0fRQ-69jftu4nVftp zPa_Qr3jzZa7i+EYJ?VTR!u@tAvbi}dw4rIe;dCgw^|UaLCecDugJ{jNv<@a&9zQ}I zAnlRZf7$kX_O5?LZy~&Qyp4wI*oE?dqe7K%@>1(RelNP`OkQPEdYpx2RESGOq?elr zhC_*?DHW(58IZdh*p--7-V+-Vm#bQJsFZmzwX&o)JMx~QnTm!!QHhZN7-gazKo6t2 zQy@J_2v2p0^{dhjK9Z#oqh|B(9si@&E1_# z7|w+rP8KA(izE%%T_t@o>|$C6vV-Gz#8lo2AzyM_`1GB9*AF$s#G{S5{e7B7CbUM! zJ4lV!CeAe6xY;^@@MVNL*wI6Pw}a37owK)Numjamr!sR4S{o{KEM>{~Gj+CfH^>18 zjqWYaFYU}-Z>+8LX2>4!foMvqd*gm_iY@~gf;J-^HdNL9LqB$1gnYm4?g|&MY#}#o z3Eep3Xf++x>h3(QrJ{AS`SL27$2E1Rlpd8~Tc){F+4YjW$%$ayCqJ8daj?*loOCT` z_1rBgAziOeg){Pnq#x1`Iw0|gn*G6-Hq4bhYFc)|DpfjQh=08qybnvelRJm``~mSv z0q3FriD5qvzl_OSeR~ZTIWjx!P9eRGwX%TyZ?35U2Up zM?JxwN-|O=x;UCt#Z`NU4%=JMD8xp@BF**{=6m5uBjO#~l&ec;o6mgj{RFynZ5*6! zDV`P@SkWrP^#==4p()|h(Bd9)^UP_!sKSI8+e`%)yv=oz_Og)%XHhi@?|Y-o6NFI> zbR0}o)!OLnNC9@Ltfx!BV@)xse_SBXsxMpQU3Ep-T59^M{Ee@C_wqxmRcfL+BMG(< zHQrH{6$j`q-yJ`j)x)-l=zU^FsfdWI%;3b8_y#2mH@Fhj^bqTaRs|xRO0r~7%+1^= zR@Sc6?V^MB2&os~Bx_#M95_E+Y4IpoYun2~%Ch3CyKt`@tDAYq7LGPJ8q^)BiQMP- zU${e$o&G?xPmh^({WyOW0e6$4(qm!7)XV+cSme!LR<>rqsAh2Peg94z0Vfw@3}QRb z2?OYpwS2HHgZ^q1rfMju10DUj+1+TzD7TgDE$0~|up2H&t8Tpv`ZR|+u9Z^`G$;Jp zD6HE!QJGV{3@v|!b{k5BIhn~p&N)~|yxmoj?qlP)trL|6mGhV*a4dH{r-jXmXgYT) zs+GlzXeA7_+4@8Xv%;l)7(ON1(VGJ6r^ulaih8D#ywYBhY&N%=H23fB+V14s*S*$KG%p+jpD@(Y*|+I*kU6cB z)_Av(&Y$c5{$ALlwDY(F8M)vC;X>VxK0v48-2;*jvp z-DvT$P2j+l19^GzBF^dx%x!RhXaG(kNg)AhE&)rb`x2NSm#;#<`aQJ1 zO4Lhf$%|S`jZT*Wp27{@{?JFKp+1=WJ5v_yjUt<&6#|FsOM!D9r(D*f*&o7sa z{V0L&gG;J76Z$I3%VfXG^H60m0TV6&gGK@ope|{DxrSK6kXFGmrY0>*+?ZBos%Siw z~EX?c|@;h=3wLQUpBx*x6~S}wZGGNw*gmdGB?(%Ai&B{8{{F$k6=(HPE({cpig zvoX49sJj-Gi>rI*X%_EoWbrPlWQndDy7qg27P5E;kj2}HENlX014l6oa}6xh>xMbX z+H7cy=f>#HvYY>XtcTKrrRI4VmL86pFmg~QegF(>ZKwcTU&%$9V%;)M__iLMyo$epJG@RW`H8auE=wP>PoaePAxl71ke4^on;3~{Shz`ICu(|2ivfddwl7V=4dq~vQ&HU{0H0y>|3b6Y9XG^aUBp0iUg0O*eH zdN`4<_hL816By6HbxmzMwYD)98p&?{lQ~OrxR8oSvsYKg0IYEcz3o`nFRXso=6)+4 z59s!sXd$j1=lkcBa{0f5_}xv)1lsl!U9zv>|EoZGwz#zls5g_$AiN*;P26)5l&N%! z>fYv(-A>t53rrKO^?bnKbrgj z=*RBGbOGhwy(br_7e+E?;I**s*sJy}OrXuI8=78&*%&|*A=5CpAPjegFbE&E07QU_ z?>)r)D_2c8mdJGZbOq5Zs6AN-6niJKI3}WUCpu}DV#T`=;L^6LFtjfK*jP0~nxIfe z^{18P`f=v}u`dP*#PyanH7F0Dlr%cpj|f4lkc2vK&Vbo)wL_b*FqFaqaVg%yF48Gu zCue*za#$2M0l@4Ccmzz3q4F=fX$n)2fMgp9P!AzkQ_?59l=JzPC!Ewa0&d}UR}ERy}-zFGBOGzqHG|B#Mkvdq9;?u$I^NffDNBjA^+V zkBmOBFO}?uJ^}?VTdd&1b6q1|psHKNtZ$|uP+Wz~Sp*>p$7o~-aTt{Vg+&!b4mLEv zO%z0g zV*@%JjbnM>Cb6MNpE%e3i2I)TeYd_})93iF^M_M2rOl+vYm(O8$!Pr^SWwmhkF`mu zcjh0H8Ys7b38q==x=ZP>ZZ>02g5?v+M;z5)dLDz6DuHGZk;=Y-AXI@qQ5rzV0Z!t| zI9`RRk1anZG!XHD=*-z8$a+e#r8<;2n@=u~W%V6ptbTZW2R_92Q0lU;Q-9R(eOxQN zI-(C_c)3R2doJLIUx)@BBH`cQ)N`Wy_eb^cYm~H!M;*N^o2QRewODtIftV zXiTDGwxk62n+)F>VZS)HFWQ) z0F&U11YYMFc59aA_`fR+ju}H%PeZh|OQ3C++PQ0-3$wvi&L5^8iysRdOvFpf|20vy z@v5k+hJ^2c)IrC%s4{o*vB&c$wN=g#TSUDJ%R@*U%pLW_YH&A-s&bsSYz8?JofnI* zh*ounnohMtd|AZV3cul~Ml&(6|Ke=)`6oP^=^C4)K$Zd{GDT2X9Xwz+-k>8CEu;k? z^t4sXg+UVog56>S%^A&VGv+W}Oa;ns2oof1cd!J{x2rqR8U(9N~~*0UZC#?*Tbc(hv|INHM8H5;9&6`vq^LUl8R zGpjtB#{@Dg^^(*IAf3Yu8|~KcZRG@#x63` zC)`#lv}(;+4tY52Ao=yYGz#V+czI;rxfyenWqDEK&QjzzZ@oU{BMZ_Olp6JwuA;4U z{GPKg3ZKRwJ8zYT#$1N2fQdJ(M#?p0ayd+B@aCR`C8i6Oj&U3V9(w@SW>_eMbvsFv z`boJuSbi>C0jnTOHdI5f5gY17`czrnL+C1NeKJTRV1RCT?o!ZY=#4?60W^?g%cLPBAQ=N4hU zOsvYNNV_&mJ{AKJblWDP4f&V%TJlbD#Vmnz3(E zX7XU$3C1=cat5@PPkL-Za&U3;Pt zoB>pZt=iV8aA!QfC9OP(wK*KFTa;mIVX_RHb z(gwdrU;+x$$=r6Mjxdo(sb+XY}N&?FNu_Ib;#%BbMU$o zVH};34Lt%5Q1a}w6>N3|`@sT}oh!EINFGjRC6>z&@*Zb3pvgNHn@Hmjl6kx2CQM;z zQsSE9%(jUmEX`o3M+;dN0fyNs$qpy$8B`Nez6AAFC#M^wqmV@o7Wd>?zz7JTHx(z4 zssbM`N+)BcqON8he=44oqU5)?slI&B;t?fGG3^VyE*hWilwV5}wAc#A9fkGu)#>&b znBaS#U_6IgSg&FrC%iJ+^NH3<-f0Uw; zY6>C2E(9t6uI)lx3fARwgO~0Bl+3ZX! zFW09Z#!EVOz4f@ZcNn-;I#aBFfgi{C_%J15V)=?BU#=5l+k6B>?ORucf)@VJ%yTwd zFm+X>W^=C8K$Jv-w_b(RJnD3yNXH{TD8~7^o5AegIqfZyX=x87u_8t_JT(*d5Py^Z zFckj}{(`@9@b`aXhw}bW;qO!X=b3*L>@#`~?@LiV?*=37`Oi!{|IXR(41uAb6N~a8 zYd+O(dZ#p`hW)?vddBD^TW9C&DR+e^NhjQw?tAyE`#XD@?PR}&x9e;B{%k(BpIcae z^2Oaxh9NZcF@_hkh8-JJz5;3MzLawgeG)s_&JgLqK0-y5VK7j~xOF^zDLKrM1XWcV ziQ!-nwe@1}#ii`Hiec5kAziykwNfnzgisAXryOcmm}iLtw2>ti%kwpy_1R{o4WK!! zp>(K(HO-R~S^SIbG4VOH7Lw3QVtH~M?a9s?dhFG9`3)EzGf14?dcm=A%_mJ}ap;8VxW z6iF74R%^#V6!=O;p-0u~v)!rZq(mHN%COvlU+mtn`b8zIyM{hcIu|bbF_4 z6zse9)*FR36J#Y2v-lt^eYB~mw2&%0+qPZoJ$w(|zg^~ATPOK9KaRM>IhT^QuOHpi z44UlwBUpIxbsD@@`TPI`I0#PCEQfR{o(*eI@)hT5W%|KZWX?z`0yjdLkPt_28ojHg zLiMQ@*bO0-C*mz4$w1FrK$#ddZFf<#R=KX3b8m;u*kXpGBJ6$v*<7@Y4tF7S7s=PH z1k$l?ExT6pGg#;4O7l9Nqgw%lukpHYAyEoU5tUboU2uhq2uCjc=UbckbYNyKwr$yVwbHKblYFgjr_VVogy6T2 zi?ReP2erqKz&H%nh^0q2?tn;oc5Zt|YH;#7u97OdSH5Osm@2=L(>Xo)X-FaY>#Id& zU(rAW9+4D*5I+i=Lbgd(sVm63w7X!bCacw$RPMQpTC&U*?G+KwlTqOQHKr3#!)Pp) zPJ*JKzTm6)Ro<=kQYM{C2h1ihVVFCDP@~kwYDW@EJjv~R&%6 zJ05cr)X{|#AYjFAe;aB@a1{AHYO5~`ewMyG;jK`Ii>A_dHwjfY*Mm?+DW$rk_=0l8 zFp4pc>#nEiK{Ds;ai*)5;u0Fiwq44BX;g9`D@}EEj~Ij*=?Xf*5b0R7yfPFFd9I2G zVoOJW#-Ws}C#!ke(_YOWYF&|Zl=Ie*o)<%~&Z58DfpyizAKtG~B99#RkBP~64zE`p z#z??z%H~eT{a33C8?}BGcDPmU;CL%Pfos!ne-x;iDl#D!;OGXe`c`cU9m9(>h@bGK zI^9(!YF%5Kbd+&=8rf6_U0#ig1{ojGcLId7G%O6~Ng^sMg!Wtb8n!S}P3VJFd0D2z zvNl_ZHha37UG+L0{rTfmF|CAsXP|}S!_-Rg=26p;H^Agto24toH48HJ_h_Za)>mS+uOXcqpZ{ArH2=7m+|Mdl! z962-qn0nrCm4BMNdEYC(`;$=-{{_1YA*N1UL2{QfUX#SU24ipX+Qux)no+&a-;sHT zMonazC*AUe(nwlZQ>FIbe3m6%l?oeQQ)WA>TJa8b7#`*9I>G3>J4mjqa5&+eR8?z- z`T8ug;Y86}5BK;#xUCZ--adh~$H=W~PVxrWjtGv@;72DxwVg(@LR=Zb7oO?L40nWz z)Gx@ja^@>ha4QIHOq!d8@LWng-pNf!!d$taLgl!7CyA7!Q-|@%n=XDJ*u5s(M2R&7 zfMY?cZlh9>p#MZDb}CqHDt*=QTjTt8A;+~2QxPD2a|6a)=W$qYnPLU=9~@jvlc;FA zV4!kjq%Iq7{hM~UVJfv#zXOUv(<20kt$57F>Qlf{Us*9Y^Q(8zi4(r=u+k+=QHgv##yq z0@^(W2;8p|H2PF2adr-DBW40B*c5;)3X@-vkf6pp3J3rf5)2PmOo0=JSrRdY3*M0_ zNa9@dgg9ZN2&$`D+%6tN~4?n>I3VPup1v!q587Kk5L`5Wu>DeGNW6lm0_G6~GFNHlMtW#DD zQwRRko`6o`nI@Z%{SRMSo*HbCJpYlWvrhLiCoRteFQ%{A&%~bJ_Ba#Yn;P!c!{TwD zCZ%VRx3^}8+W~cboz9@2?VLs$g{H~YpdXH}{Ojk`_hCOCsK3hp_^BMcOZX2y C(C%db diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.eot b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.eot deleted file mode 100644 index f2d020a8741fd850a1480bab13d0e11f6e914025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17534 zcmZ6w1yCGJ&?daVB8$7*;_j}CySoGycXtWyy12V*@BjgVyG!r{cb5P${`b4Ozv}Mh zsh)niXR2pvYO1TJCPWqhsFeW#;Qs><@IU(hZ*Xuhxc}j*n(wH9y-+Yf6a2r2O5gz0 z|3ewVGk^VW*Z-l=0onjJfaQPU{ht5;=m4evm<7NY-~h1t&t?PY18e}E0I&aSH-PJZ zp?Cls0IvVQ{U83P7yVzp|6zRp%_sf8;!*!U(EtEx9R!MNk zQdfRhP0O%O<*vE6VQ)A8gZ%5s(MOsoy3yC=Kg1h-*Q#C%*c;#P*z$Cqk~v7>#+%HU zXC83tha-Ov-(X^JkgoRMa9m=Lbu_;kdzA5R&?22EC#`7^)=zVFwKD%`jQw>!aJ$V^ zPhCOtoicc)8C5z@u)0R|?_R)uDq8NxJgiY5e9_LjZ9)EMXehN@FI+Cby&91RSs}6( ztw`zS)QGfaVoxVZ%g`k3SH|5WKO!H+0G__`u!uNF?mLxj#QIEc^Z;GU@Tm#ozGE+V z@P?RO^&C`|9&D7l(tEZAvvxqy#*J(#**$8gB=DHl3H-j-7~o ze))EMHnxIlqjOap@Kt^ur_2e&WOE}pLNbdjtPnq|FF6|n$FE}rp%8pZdOghY zFvl_pEGQlO;XkS0hzU3v-;WdN;FUos{9A(2)8F8PyrVV4ftb%nw4+y3QkET8z~@9U z^i{Tn07V>K1I9)k+RgHj4)gS}SaD)F?$qYlpTU*P<};kIw>h3W)EVC)qr{kRD5Kxx z;G?@}i67P&RIU`NAcTU6aq=)q-Iv(EA-yE4WY)lI@!&!3k`Pvrm-3KWU)iI{i@wvK zZ?3G1>~&M$vHL`}758y(UkHC-?ig&BTaF*^Rk;x2px%9eQ@kB5kMd0+o1Vp9s^nsc z^ZHRnbVJMFoto-nx*|L>lFU|#mJ(=#2GKso6Cd+u$(hYuVbnyi2azM@qF5%1ygip!Na(eP1BKZk!X;(iNGX$aASZ3fEORbcx zRIM|1RmBq%)8!vjr_gY;=_=LK3%~fl(~sn5jj`4%B?6=YnIIU9`{3+>@ga+GU{pI^ zIlbAq!ux^B5neLEmv9pIC)X}E6Ih37VFfsDi<1vYLyoc_E_OLmM8si%aD_R*8O}Bl zC+#N2lj9U1jpM6w<$53tTcSJ{^K}*`zUDz(U8Bz!Z=R1ZO-D>+;e#{!$fh4Yf>ZSwPP!@v50+{$Q)wz0P? zi&ATyxmhD~90hB;Ldzn7Y%zRdWtdZb7&6+qYbQI(48C%i#Y0%WyD_9u*K{r5k37rc z`4I*V_c3j%A~kr#T*W;+Irtp7O)VLSc+NLu5)%HIhN{FR-L;n>Dzh3ct(MOAWKqi8}7`>4-!U1405D&1Y^>lY~Fe6;q5ncAOxo|wJ z6*h#B5?A8hScs%P?@Q}F-DKb=E=tW6YGo}e41V^tE^U?P`S=;7TMs%r)0qf$8ya3m z5UrRDyEm7PMdjK^ltDqFvP7@XX*rVJUQN=H6=_03PSkDUg852~br)aY)NQgu7L~EL ziZG(W)=l~kE&Kf$D450tf`_b7qld2jt_ZBSqbcbtc71Pa&Wg?}FVRBT=eM%|kRUEekMAJo{d#L#Ev2|%=JR?b_kA zsv=?Me$0*#^&OF>J)8F-BwEN`FSo=b<007j;UrJ1ru}tGPWz)lrLcsc!p@rE8Ka-2 z#hl{um&9*g9B$>ywt^{qu_Pn)`AKh`5WG7IloFmZ>yJr%|0+^?MN-}dMA%(Y-bR<# zl#tAv?0j8Qb9P4<(be&U5&abkUL%Oqc)k!)HJG~aB}5MU5Ex#KTtVwCKG1Ead}i! z!l+Agw;iEAbEB!vTjHpr2mEX)}72Yi~2sRwLUD;j@_ko3)g6 z%DnYf527J>FZZP;KtOS{60b6tNbJAUQe>21!Zo4HZj2%;FL&US9akpq z<$r+FfYd!lbCQb9oP^1|z_#W#fJ4L}w5b{Jc)=d{tP}1=xOG_-$kWj_mjDhm+G=5d z@>d6H()Z3?&y$7h-#UqaAL@MA6<7!60};9NiNk3iPH>QW=KA-rAq082rVm zu8sMnn@Q$gVof~p9X=vH0u^g#JoXYpPU}T2!|ZauF1E;hxKz4rWdMNuRjq3KY)FCL zFSY;9iL=g&Aci~m+e|-c@T5x$eG-)p21W2zDfYG&IJoqOxTOQ55>~|Qg!$Y zGwh3T{Ejs7devTEHeA6$R_l#1<@N4Nm{0MqVFi=0IL^sv?{%scS#K6hxUIdjZnV6l zTokJrK_X+~=+v(wi%g~Bo^!sPewdW$#4Hl+tssf+%2Ys}ef7BC0Z=7ldDlQxVprS&zgQP$`q2rnm}<13bdel*5SPpgui3RPibVLUs8|sz9DC zhoa8jZI*4G20J0)AroV>!H{B*}(%*3n$fwEqj30<@k`TM`N6G`xy+WoLC$}i9O<=$v_>1S|A$)mhJYSli^ueFn{ILwPc2NTvlb!(}XQ6|0 zlwMMCMf#BV3hA}95K#}@v7(657B>lZde$Hwpa;{$OxD#t2{vs4Uzf%7=FDl>XhO_x zXG7J9!Rm~~ub2S$YYVhGLP1Bu0&m6;Cuz!8r1m-(L5mnW$q*KWUJ0<7O(P_r)w(ig`flU6xWSxGlt}EDO?^Z@*V#bx*lL>?ntS9h4kkNC2xSAW!E; z(M|ECEYXBnrHL~k6R1|)_=RT}@-@Zc(mTtBezNhh{6?HpG)I0yxrBI6Dl8{}$L?1K zlZv^PDMjXhEQA1f;H*d{^JJWUVQq)a9ve<d=+}pL!paD zoPR#VL}%5)kUr2{HrlyQN#5rGbPnumV%WlS@?s`dz!OE92B%Nd&qzbygtc(u6;tN; zu&jb-mKwZ77ziGD4a)^5<3JME?{$G+Q^R{!u0FK_W8TMDFcxd*1SfiGCt8#rKj1J0 zJs$EgL6XQ;3uej&;(&JvN&wq?7T*vQ9Huh{GPl_pq=f3J;8Lf0ay1{uDR z)sL}`X0E~|_NWu7X&*_I0Z@l(F-#*_VW+vt2j*JEoo4Zp-=`pTTQjMTm-O@nV|LNK(xgcy|vYRIp zxYS;N<+7NcNNm*JH2`p!F6_L!*ZVpXof^rN6&*0+bl4HZLp$MZ|{MOC{ zhsszX^k;DdGZe|$C&SriVys~nE$X#D=)QI`QvYj6ni3Vyl+ZVr|8jJ=2g7O?94E1F z#olvqeI2R9=u9*?D3!@Y8gd4P$)|B>%?|;mRO#{%jp2KKA}7|5?pN5mDNzDzoNAFC z@)&8#9#h$2Ze@lV6ej7UA^3t2I(8a>tQ%pUCXHZ;?Gn&;XUV}?;iOQ`MJb8ec037x zh@!k$I&un00);GMc>hGUJ3qp$rCyPE>+uZUs-gXtlH+c; zMXf2O0#M#S)*|l7Aje@`l+kw(s+?{4%u=jI)d0jqNa;Qh9|uo z&$~~3R2Ge$8q!{fS7#?8Ki>n1+zkLoFroqG!NAuj<3+O=7Fl$SOwvKrs(R3-pBn!2O@iR}8!z0#kd(O5kL;da zgzOX4z1z2<=v-~6oo{HNYo`}{geHv99IUZTA~DBy0g|0;@#sjr&-Zk;ei5e|!{aq# zs)rfJZ^&bK6*xpI#K5_QZuZTe_7nVuN5&Zo`qq|G_FD~B@Z8A{VNG_*%s$2q)ZFM} zD#ny(8%T^KItr~UHI-jaOjwzkL&(wW&5o!+8KqyTr{nwCu$A^TY})cn{nv78iIlRh zNAxT83=1?(x()d`i_>tGvgY|Bou9W3#N1K0%8|iKnv=hK47Y@cWbu?t#t9K&&h*LH zQ&svY_c({#2MvNnbleq7$k8}&lM`{YAXNSJDv#dNG_J0Oe&6$E&DP0ifMT7h@KY z<+=(dsUlrz=0jL#j?KWbDu!TY6+~yZKx2{q^F1>JWmb)LZdT5^@(-UIqj3zI$wM7o zgN>aA5hLiylcIgd-7LA+)G#-wQ7FCXZjB(#kDKPadv}~|F?Vs+30Bp&InszY&NSmq z{I7MkHE}DM5T}C}dK}QuxjO| zzeOmTCiBXe9QLCsc5>+`F1rd1U&_<9nQs3@$K0@+j28T8Hwo0#=D}1)+nZwV@xb5$ z>BVTY&#`>?y(s=}a@(|QZ$aARVow{vHJ@N1tm^qMtC|=&LjC82Ow|4mPmUwW$fq6s zNss9wd56KW@5$e%n60TW`cbgsXXsejam~Ga5LhgjV#=Xfaj_LOw!qN{aRWjNAaly& zUNIwC&R+ze09Ev;xBsBDu8041iX(PelzO_+QOP8Xv*4(spk)kc>{xdW+`@oLVw4`> z-`076YjD|!{3no|N*8K+%0|?`_O25^rM*$;^Vz}!zP$01Zc_x_M^(mzcfkY`5TIpa z4_h492a&r0t%{u70D^HJ^;LYsxob52DVoH`wD2lMBOSrT;m=Vi(mwTc9?h(sf7B*8 zpM})k)TM$MdK<&J4sb+j%>5eN*Dj;@oO)jMMz>^N7`=1)hYd2mC(p^tw;VeLkszG7gZMM>6KGdml+nz98?>> zWgn12icC-|lVIiZBaJ{_ch5V&MxR3n5pqH1w|6@LwY zyL-!{k`4$pqbG|TH_B%lW-7((j$B_05p3X|Ug_VX3e(>-$pGX6Z_56}5=KpKCnUE<@|0)qsWNi1eMnL#98qLY!5bIpo*ck#M$?zN0J|AwpR z+LRgW^JF7)J8)}~$o^(pm4|7#AYw?xxUos?o^}<}n~7Ome_y4OXu^e9O#BmBsm0R3 zWOG2TcFFONv3?_L(-J}|Be(FN?EZ_|cNX6EYBH1V2NGyG)==ydePNab2Q=(rc1B^y{&axAuR+NEED^aLcW zF_d33l5G&56%q3$<_Tm(sPgMYVTp)xmbf$Z$Q<^^sm=0$cRhwdIED_t2hzBBI=Cs+ z+7;Vqth;j0r}!l!N{*yXDSqpxMFU|P&>gELbtRCI=hB2BB`N_l8eF=DSdKbizmxy> zbWX;az?ksz4>6GV#WIW)(c#Ac#XHd(osb5>*Byq8ZqI?8`ig#0&R-Kq zSfXBJ9hFtEr(w_o9BWVs?ajm^|?VXq6L64jWGkq5^QFS4GJ_U`^=zo?OiTc#|DqC+puEpdg z#6$y+b7~VK{8}j;rDPlk;J3cH@tcNa<7lYiDnW)Fp9`k94w~CPvU<|eQ{sJJx+f8S z;2<%TH2kI;IppdZANuNTJVtvsCf9p zP+&5Kf6E16LYfrDIc}pbF>}pe7?$H-RqzZDA24fJCfAH_9)>UFu5#ntLL5kiYSNyC zhZPq%rr}*ZpLA-jp-XP_?+7th1;wNzAL1v8AaikVn2+`bqt|P?H@GKwkk1cC>3W*I z@iUrGpJ;wD{{U?Z^&ZSVIhO0W$t|QJFkv>+zVCZ!=S&_?8ng^4sB2ECRPopGFvLjk zoxCdpGK>P8wS}biSVyeeUFCo6Lm)yfVCA94+>$HFjGu_Q%^w2ItM4;43v0UMF$p0{xQ^5 zdS%mQF;1?>=jxS&BXdHW98_0T_q7A@r~hn3b0$KhcSW98Yx!qEW35TW(@P;Uk&D8d z(thWGq~0-Yi8!cs-rG-s!cTB3f0zhU;+Z7wytfIX37O)PEaG`Eb9=WFwQ zLdiBsQXWCuQ&NF*4WZ#No)IK zRsP;$Q4XtK=3P`ze_)CZav(gmnPsDW!z-%o-MRc44)LEmL`~T9#9bO1b5{sN_}9() zxvLAuKhE~;VZR8qsY5pF-@GShLdK`ZxjnXvfb(QMc(bn=4UCbS4}_XcF`x{5&r}F^ zbG7m3#5{83=ln9NFly={O%z6hK~59WEtCrrk?YB?+zWKF;<=A?2Rr^YEQ$h40#RS3 z6?RfhLJzhew%j+S46LlHB4XX4b+{RL$&ApLn^py3tgI_q&AN%B#pBz{^O1)Ze z$bDS6p5SfODTEwayke{I{&f`pco8;`Ic>nVwMRQ23gc<Po{E>#E}2-4DCQNdw&6A@%*owQm-euqs1o1{^MsWjWwUHVIDk4ZFTQkj1yTp zKO-N5q2T5F{qi89kQG-G7#BS((47L<%(z)sn?rEy`Lmy|Mc?Y73>i~6w`5c9ydW}R z;EFyhSO-_}#rZ|!gUhdje<*Bl*fhVB+PO-%XRs>aSn!guSU;tOB<#9Lcqya~h92$d zH&|HutUUL_UdQ~~nwMq#UAd@16E%scX$S%h*qxpS>t&A4g=LX2t^3Y6`G5O$=DATT zf>{jn7V^ti{fa?^Ex}DDS1kf;_kVRX2k=l>dlV<~`@XuTWxG)Iuf-Vy<1un2e#s&Z zAU#k+!r!#5+f%Hv6azvxasc^R45#!5s>oP3k>6u8J^1pZW%#6?78A;JcFx$2D6UPd zzo2xf;nt@}>G?WJw0!t+WHg9+gq=TYTMSRM;A>aT{By?6R!-b9QdkzH+2RrQamjTy zZu-LhC1Srf;Eaqn4J`)H0kcs1!E> z>o$UoBx1s-eB}e;lLT{CEngotO7Px80=5@h{>djTco!nuJPrge4{pIH6GC61IqtYW zAJmIFNz2+7kYnO#O@0{WY7XQnhS&U+sFd~-a(|X%P^?1#B3;pDk_LfB{D#tg#J%%q zl~u|*&PeASL!=i5!P!YfXf)I5{^3P;BvB51EPAhgh*NzE6lcxZ?2MKw=7%KOd^!~Zqe4JBEq2B|^JZUJ$x8Ai(71t@s`&|~k5qmy|>+gS+_tA@) z;+w+9j#4+@PBuide`C4Z%qaN<9cOY8%5XbdWrNqBbg)r=byd4pRz8B+4ITN9sxpe^ zH;x2mvJ{kViAW^!50(h1&stx7P*O#d;olW8InfE3ag0T+*R5r9r;D}a_Df47+n&@Y zV?s1!ZUYp^W;AlnI@~{WNT}I$M`sOXYg45EcvS2Qb{_$i3wg0geyrx)F32El z{I+*Pi5v_QWq%APqQQ`%LrSkI(v4m5!H;uFzX{-!UId2)Zbw!tyS#0WLd|0efy~PS zfSd`Fh2v5_g~cfj;43Tggi0ROfe&eG7e1HE0tg6{ivCqvpHZOJlv|DGYS}$L8~!W} zjBbI4O)d__U@koWS43jQS=$t}{yBCZ0Jz+u>;8JPHBY0OXo;DBt+?Ql$ZzI&_=Bnn zW?Gmzjve_Zd-P`XhyhZ|<|RvgufhW2Q09)^16YNZiB^fO;J63JBSz{i7s2@`ACmm^ zqR1I{g&{&Rz~z|@T$;s>pCUg9Zs1sc*-%~ycUvuMul!z7b^o__a|^A_8u~Nr$1$covgTc?cNzKn*pRUcW~Q84dcWfP%wFkW&{|%*_8g99hbo3CckF3XW)(^`tS9b!JNf)dT|vXXubU(f-C`cA!?WTMb(iu2DQM3&y+KPvzi z;)F)LrBlmg<0P^$mey`^F+1UHCDz|={~1!$6E~Tt<8N^$+qcg7nGhXNL$|LsK=Wxt z4VC7LpG{*YacCs5QF}cx13aYMnMU&sq8Pv3l}Hy5gbhK90MZ)|1fJAV&L?lCql1Dx zY8Jm5Qu&eBS;7C77G7+JtbTk?KdT_EgiN7HzQuPezVTSM0Vj@_pjRSJQlG^zWU){O$M@jAq`VU{r$(6mRWUF zc;+qJ(YOD^= z#t0IbRWenLAW@et=0rD*Nkhi`{?0@rbNfx_T(4TvR_Ik+=qD+;nXma&T}sW^k}329 z)Ad6SZLVL$Nn_B!_z_3Y1U0!aCqWT`^cYBSrW`sBT8t2_j&1cz*(*@kKo&0tusrU)&9y8h<+oq5NEqdM)iI z1QK(Fu)CK#Q@4wjso%DLBwhV?gziz<0+ber*@XRmAV@wv58(S!gu16(mQ>(>o{qt? zpL={mRK6(I#*1FUJlYDyjUeX46*;_Xn1i|<;{AMQCXCG%g7Hs}H-5;O`q`GdXusu- zDOig5?hm1e1jlLV6Tl4IPmw= zUDyxu4Scu2>kx)+!uSJ>VkOTcp$$wCSp=Q-m?2}wQQA^P#x&n*pSKpxW zgof&lGt)QN&eqYvkf!D%l%y!p@V}7m2WR8(9Y!LUlFNkiD{HSZl=ZiU{siWWmxTj* zMtxmZY{IEi?63C#JYbJpK^?Bt0%t{}}Tuwb- z+~4d|yED0xzB_Q(cg83c@w49oj#H{u7x9BsctlYt- zpaG54q{X67Jm0zis{LtmljyDXM~)-9^+nVF!hQ|IH|`5~sV-Tq1lOK)QD~cWbIue< zSNhQbK3?wDVsWnL#cCE!h34XamYRj}ziX}ekqM-vPK|wlRRLC~j?@<2rmSCYfm5q% z*wXFnD+%$V;jl*IG~cvm`_^Kml)cprb3pNbx4wUl6Hh zbcSDMhB`nswim1{=2g^O!*TLBcaswg;x}ZCvR^N zziMcX76o(XlHGUb1(GxsAXwLHIT7KHJ(e->W%q~b8b+!o1GRHcH(fk8#sQgS9GqdH z61{oMZjScF?ciyS*?g?UN!3bZyO{l3vFCzK(;#n8henei8>VSAaiJQU-umeNd!#W5 z=J8zY_q{4Sm=a#2c6v{3NlPTh$l?IOU>EL;Y=FOV?&F=t1 zt+rAAvg8k+@x!|sSSQ_b@!S?pp0Y>JUz{Pdpl+xuZsQKPd{`9Td|PFML`kM_&;wek z|94LYogZME%q0%At6a%1`(61dr9}Fv*Q>mNeGf3MZs&Phj)6}^F4iR z!i}ZX*<=}-f7`4sYQiZk>LRGFu@PvP7C;VG-;T4`R;#3?0uG-XI1G>eVDE3THwyu! zwaXybcYHdA(%W2RP?;!6D5|(BRff2VXXPN{pu}}bhkR?ocdqc^O0)VsPU(+~EugIK zEEJ@ZF1F!Z>4%vo1pDAV_6QHn1+`GLy=LwAp#^UQ3`n+@UlZS?~)BT_3SNxiOl=Ve;TH(Q_SRz`n_%;f-2`=M%HXClkBw_+UA~hMajrF_cIc zHCbi6%)kz=IK!b&G}i2`x4JfQtLhouYdyG{ z*PdPT6(0Kc5XXza25!L!qT@r2^$IZ(^{B%~`;wh62he!ZcIZJ2mUpT(p87aLPBa@t zFsC`=B@G3KQFr{yU;0fX@R$4+#UG^Cau?o*i9(^=#`$gEk+3Qzar395ip;+zmDD8T z0O~hA%BrY0$2ek^7k+_QcWpFg>b{|5)G&#~T#MY2h&`rwk5GD?7T;3z9aYzsHx74Y zo*#FFWmaYWtIjG23J0Z4@}I{st#_>9R-T+iIB-Jq<9nBFh%ux8ycKpw>ZFvp3>qIP zU)?rOw+!Z?6(xe5uKnCYUFe`S=Fan1{&H*^ji~O~G?eflcyIIp#u#E=cVT#f!bj^r zceXYkE^2GIt=y*FnP0i_5s{Yyslqm4LjV2funu-Km+qFQe%jKPyH@df(Y_9^=+_QT z4?<^;YCLppq+AM951ZsovqtyI_a{+rnwR_K-6St=Ye0O(oAtyCPi=U!dwuhKg=FiB zt|kii3oDkDWo zqRrxcPt}o$@$$x3`}j_TFj|}00X)IU#5;0!$DM!!Dn(1wMt1MTLTn@cdC61NjbS5G zof3Wsw*=CxYo-y{!uY?poah}<_%O_)!D*0Nxb=@)OwM0Q`$x|#Xzo!P$8U;N3ked` zWDG$%s%Ap9?V#_8D(eO7YLntk6pie)%N-@!Xu^cifaa$j#LS0* z5X|3P_+{w&5M=$M+_FJ!_SJ7aJLn#t%)?p(E5(|X{I8d~pgvd}$sbkVZ)!_Xqx6GU zg?i3IdXu6SzlX2bNQhTAtc=u*urbPh;36(#7U5Q-9Ca}Jdx-Cu?DjaSR9SxoS2QGJ zBVj8KN%my%rhs9B8KPhh+aqNp_t{yX?J<;++QKK1bJ483P1Kff3>HQdDh}G{*;rii zNyY)+y^A-exP0}?o#lEYk8scNGMgi0o|i+#s{5=H^79djemzR=9Nw^gmY~#AF2@g( zd?<`}^)X?HuY0r&xIa_jHWb0jX->#V>%x9$gzt?_N=j{dv-?bB4AvQ+B0+@iU+MVx zcEMH?Y_S){Qa>lM_^KNa{~BuFVG8^I%+joL4hl`cARuw&dVHQA({*hZj7EAh*(j8C z9+7!f66~KI|BR@a@EKn!jEP0qdEXpS5Dy~9wH;o#9CvzVL67z|)>;_)6yhcRDH_}E zcPD&Ck2n9vB_>6LiFmoi>EVA02si2xnap?Q)GIOw@EMWz*e!H;qHjMVHvQ{{YFV)< z!VIw>v!yEtcotTzj0QXNBRo}XiZZ%45nOEgwcY}|w4@dVs(0ox$c~`e!Llu7883hBE%gE)T^6Uo z?qhu0j^s_UbFPxORuC-i`ElbCvB>vU=%M@@k6g;RLg3nt{77GqpXQiKIJzoCIRNRi zhO|NT#igqVS3Chy!m))-;8D!+DUy?$tSCVwSy+MUW_FWiC1X)Jo%TW4;3y%IL;5;6 zxh3%kYt`d=m05ZZ>l%ZL;pEF6E^SX`P#WQg5-;vtjkUlN=`+*-ujC0>N7EVjQ$AWintHa<9Ed(@6)l zIu^8#dFae={x(0Pa4D5~jdHUPEJc?_?!iYH!~`Q&Zdz?#;Mj34)-(dU?*1rWo$?qy zuN^N5+9>12k3_t7koYt-(Pt1lcS45Mm`uU!CGY&ek3JO&VL79*`c#D!Q=MZ0yd{=- zbRL%TaSzx-JqQ6yRX%Nh+@~3aA_fjz^LFA-&aYw-PpifT031`NtcI4D+AF=I5Pc$0 z9o=VhW0c8gr7NHAFWgt1`L!sqR0O!VGC;L5-qf@5xR2Zg%zy}(A{~|yFl_N}eH3`) z7{ME-qN3BIASM$NXs3c>A}M1RS5YWrX+7Pe*J=dUDR$oRoe#S7kwUs(j@6CL%O5vD zU^A_0qC&6!oLQ51zO(nG)zRZ(43X|n{3i>?g)El_WGj>LL&I9CPX(KYr1IyPZ+nRy zl_A$;Zre3zSX4J!u{Zoyv6!LU$TWihLJ}I9HkSf5JL#{jj@CqY^~}~R#pO9De9E@8 z-wv@{xFVsse2B4;A~#vu+sylVvgin1qc~19g{-1jy&+%tWTN^NZC_1mS&DS|J+Ytp z!fDR9*O2a6wx-|Un4k!1j>Yg(p4(Xtc$C@;%9)KH`Tqo?HZaz#6%`_0?KD;)iD)n? znrFjj6MdW5DQnIz)EZRe-7;*y4UCgfA=nz1=Qr%J?CU?hya_jbQP-MMS^2jvnc}Yh z93m&CiqQx8qerL^by+8(&b1YrQ%)}X2#X#V3~q)q(ph}I0@bNJu13STTdFa*(og9U zD^Xm@354N9ozMQtq?)~i(0)2nzx)F+l7>K?&-53Qxf1V$f)NW)&)m4$NRl;6w{fdX zcSGPu+qgOsQ9L?86XFNhTWc~7Q*{Dn5d15KTNYC60PDm;^? zorY&?*wY_j`gm>@7=jQjx0@^B{4?#R>}4k26k@N>z@g#drxrvL8|gV2Y+VUiGEDW%ZAad;@kRjz_eft{BW4=6sRUujL*8xp<=F5Vp9rZMXnBuG~EvNL3>mTnZt*QRj% za6FfT%TZB$9`yk?&p#;G8FR?DJc$5VRsaifwJLHm$gHEx;GMR#?`M6FwRFNLr%{P- z89CzeNqWiwjwwb@mRJ2mew;;mB0mowu^X&h31)UauVsjhCDN-*!W968G=twBMo|MS zzZ5s9&0JU*0eG$h9ym;`F3Gok2mHFxrHJbcx}P;k<8dMTJX0{oTgJDA#K}Oi)w;Qo zKZQECP%MHD(BRs*XH%ge8~A&gx`ewGGO+fqxItE*#GJl@%^StW#<@oE`th&u?;SR{ z&}|6Cav{IiXB5T;j8MKosd>8m5S@oN%xrfKO;{*7O>(7HCd{(iAJg&fiVO3P{^*Q+ z1|dgz_IVOp#NZa0WG+B-@Zi8m9<%v`vmS)zWgvlrDlDJ!jS>TtQc8Xyz8`lH9%A(v zG1VI3Psn(w-tuaV%GPp~8OT^{ik-KwBl5?gtG9F=!SXdO2p5~%Q$-8%$^w)5JZPQ( z;RsPFM{J$W77*Di1Tc|dus@c3s#V<5R06>DA}bU~l?Gs+63B&F7iHoq!P0)gb&p{k zy6hS*mEkISCur3qM`R)Azn7cskywhM6plWKkBEXkZ)i{ zH#vs1r_Pth+&$|k!_(D4pEVI_!p{_(Qbl#~%wG8N^NeMT!=k>W=H&}r8c2JbO4$;L z6yaQ6{KOtYJ;us^io{AJoFQPzWxlI}P5CPq&|(BiP6%Itx?QQZ#Y)+v*_JVUfsTl1 zuacEsy64J!PIlvTXn9cQ zb$-nX@VjVK=vNiCGyOu)A*WR;}mWWaH^1*E;?Wg0QZgitBD)T=T9n_T@{vjZ z6VmW+JpIJQ((xjgBMoo9@-svQs_+qqGSuWi?y-?|e4INzIXuXhxjK7y{7@Ddo*3_x zhyFgR@_YQ-5q8#UQ!($CVR=%Qy7KS%AsuK%4wgt*cIc;?Vl`jdCvIdNPq#rNCm>Hh) zCZ!Eyq+7mfOZ&EoEy{jcy1(Fn_6niZYaKW{ju=V{!u&w zCf(?P%`}P$BfyNU_(CB~OlWYXFtIqy=DMx=0|Qopcux+8lLH^y(!t7N49Rp|LvR~a zpwlUlG`=(SW?Vn-C4QR;6i)oIYqMm*(lTL0UYfOzFR>wn(?ue9sYn~-usF<|Rcq_O zwESqv%mzoeF1&v(4awhb=V&nT1+;A?D_WSj_Bx|A~IWCL)SnD;|0UzsuO&Q+;sA_ zJgVd0srSPE+htEjHnzC@i*|;N+O^^+s%FZhim9@$)bnJfT$`%HDxZm7Eq%cGO#<#6 z){enF3Xd#}Q(}P0;^%lwfbB<61Q@k&7>Rtu}B0hnY_1azQ*REz{WZ zD>o`~CjMbkwG#%0aZh#b2Y(cQiy0JKnh>XAfGL)T?hB-qlB$Opq*#?4(&K zTOta9*M&cO>V70wh$<*mi0VTvXO3;TzAH_LXxC1QGeDLZGuVXP2A!_=4!_V(+`zzkSGoD?cem(K`$(d-w|b(EHLWFZ#|L_d?S!6t^LSg5~uiQbcUD&#wdgq zQO1#@wy1Au{WPLVtGCXnP6sF;GZqB0IRVn9P5)Bi3VBa?$sc=_#^!;eIGe3r`1_$$@D)<%tx_u;UinD!q-ulOY zH?;pR0|fm0Om+D9&_JAQhEu3oTcaDN~K)LOyWZq>sNm> zsN{or%CnV0PU{}>!V;tzf#ZT2zawSwKgnt2q65z!{}Nhi7#N)r4^-EUENHA zKqSq=kr$R3@q;!?Kux20IMAY-97Av{V$eqhln!kR8btONVYak3Z2h$}ocvda0~WOW z)bl7P4iwk9Q8{mi3(vf~lNQczm3q=7W!);scpycHX(-fBvFmKH&xZgs?ijQ2Hba^x zI7&Jn6iWqaCmf-5tTXl;<02ymidMlEB?RM~;5Ha0ER$pHt3jO0%nUxu2bS3cW^qHf z9(?WU=#>rud8QX!T7g}x3+!|b?!2vl4IHbp`RUdOmDL@vP{q|X5F0kXT2_z@?27fO zzUhKEB@6D@2#uL8V}Er3W={4-?3GN06LAL{_mUt9F=*LrhM0?RYR7=lC+!75iG>v- zUg%abu1SUsD`W})@}s3@X}~=Lv7g92W=Y5bb=sdcxIdYLg7Y}mfw`nDuwMfe%!jzZ z0Q7Kw11JfNc1K0o_5K=+JV=P50+g>N9JfU(O#9#?uJW2B1UdntrQShe0rmm7$vUDKgkx;mNK-iVDHD9VbHiHgUhxOpNH z*7~I2_tIp{`cDT0M*)MB!6390QqXCR6dz;`L7_m^$tep1E7DzsJj^t$g zQd6BHX&!GAWM9~!LKmIncpM$A&H>?3VxYMrosLG%UpVOFkYO;!$_|%i`rMSQw!L5p zo91OPL?F4WN~IX*)?UEfejuh%9#AqLN8~(|FZb-&>e&*5&~q+AfH2 zqS6&q@o=KIaD5hj%xjL5> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.ttf b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.ttf deleted file mode 100644 index b0dd4a1e528f513a5261baa536e6a226200a2bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33404 zcma%E2Vhji)}EPLHa(l&WH%v!G?D;;R7fBc=}7NLkrH|*KDB(!MSthtgU|4vBp zX54MlqC@-6@BaBsOI&|LNN8A#&RrX?PuWAm&hZK%4A_2sT`j_K* z$dHj!26vBWbrH|16EgUVp#w)vHjF>NBxG~~p5GffsBqxlbMQJDb|1UEp|}z9eAonh ze><)#4;@uJdGyWv7(#|uCPbPza?F52d$qECgbYP}^yN{7lZ&J<)(h7mD4#I8aMU2{ z+zdM*Q|E!}aGx;m@Qhii1c*C4nS_gp;va zh&dv{QpXWuc92rOSH(V1>_bb5gEZ^zV41PUSzLo2;)39Um>cxaWJd6&rnn9!*C9Y0 zjt7N2)IwZ$LdC(s%*Vq*9%f}HCPpMm5tK$yDUsHqiBc73J$5-y|5-mvL%v~>u2bf8 zDvn3{6q9oXoAfw>O?LKSeHODmgpnr3@ARQ)K^S>T3k)}N*aJE2Pk=NOkcM(dO-fLD z_ryz*$w&v2jy!<>{RHUk=((HYQUe?>wf~<^s_4?GM+vKQ6FJ#td ztX@WDUAchZ>sRFn_PiPZY6~PW#35yBEJ)(ju}p`l)FGK20i~!{GFk0*DcNeLOFED4 zu=p3gQ%39iDE%vN4Gw<>qAt*({1`2XCGljH3-}Pg8{$E;85d^Hh3EjZM07v}JgLB& zRWXFOWxAtcX0%2mPZJ$-siUIkN9==39l@DefbU_j*%5|&W{0KJ5ny&iin6v+2QfRM z#hpsL1<8OuIX@R$qBU2_<(ny4Y}i|q*=vtBuHJAr+L--!G_`DAv*q#TwOcMne=+;h z=-)Q1t@&uqBf3=|Ot&tf{g=_*dOyA`(|0b>2eV|_AH+&p8Ch~YbvsEXqqO+yHP8$f z3Ifr#Ku@caaFN6t%8~*(meJ24rF?JZd(BF{O=e~-#&?xucEp!DuutWCt*ZA4T9%iZ znwFZ6UeC`p*=(ldJY1?K)h6RYRZXVk{M6L^T-9c`0NFmn<#Woi+!7cIoBMf%}vsNi5m*cgP*%4mK_gQX9QI66)EG6)32TJXn>=G()veT*tR^SIIp(;Ow zS54ptv+J3~b%=HyqRi2F=BQxSDtc*7i?8SwQd*|>W>&Tp6etMM&I!+C!ga1{vL~l; z%qzBhikqs*La&4hZ>l-y%mq;I(!C^s?`X-MZtgmPg;aaF-rh zxKaNt{e(4qW>G+$*exT1)lN-27tz^g*S2Xpf9(D@Wp;Shi>vzU^A>G0Ui@S1Vwru_ zRw||kD@~s_a;0>$%b?659fmdRG6lT(f}BW~Kn=>o?2>VcTgGwG#%1QjHnZEVRhH_T zD3lu|qx5Q0v^tVlKyJ($2@DX2oaqRKh_&WfNWNWV%pPg6n^GBCxghZbm3PPP_-ZN} zF{s9Y;{hy$wf>Hl&|2-MPtX@R|0%n!zuv2;m|meN{hmSn#wxuktF4X@^_zV4hj0k0H2FQ()x5Qiyt#cGnI zG&)=Vu_?9XZfs67t@`WhX3zU#ob-9m)nnnm|l}!J4O$=@N$d% z0KIM^cH#)g)MT%g<5d%&M@kcNP7NGd99Q9ZRAv2E>s2c@E&7J{S`3S4;j9E46G5QA zH0p(e1CgIdAL=Qw^m7)!iI=Vgy&FY7fW4EXNr6G4kGW-_08t9(72^GPRyH(h7)!00 zw=cUPYuK+rgZF8J{`KX${Tm6Wjd{{qp~0=dwM(LT?2D{ydos<<-6!?iJ43C(HSSR3 zJ2_o>6EG%{=9)bzne&&O>)9vh3y)>O(Q5NH2dYi0RA#G9nr zEs*>9^wTqE0$5<>EE;y}>}it}m|RPLcq)u4mzEz%O2_fyf+H!Bvh(LwPd}jfG)IyD z`my!XKkBFTQfa}ICb~(vaZmrExTXG=NiDqt?EM3~tBZ0PR+n4N3AA}cxCd-aCJJw! zoT*7(cr_;Ro3NXbtxA4ME_=4*V|_+Ei%XENEq1)d`vw*uaP$T&k}jH5A=cYB5$KzU zfBT4^o@Aw(6cNKe8DZ7}y`RJt^sHu&;f5hM*z&26L0nOq8ZbB7V7Zl)71~%#|3jA0 zqQUbV))S%2zFu(Zqwt7p&+66L#T6{5@X)H!%Vc@aa=P&P7)k!%;H3|H>rFV!HH~|6 zB4DmUW@!Oct9fA#1I%F_m_1TiBNf6plq6HTPH1m!7olUdOn%mv&~c71vu5%EA7*w0 zadSqi;=QLuR^gT^fp(Yv!}Bz{d-D8K zp`k@1#_h74h@cS{PQMoxxP1D6{sCtFyEo5$5pYVKJZ|<2A;EL!ER%BRvPs1Y7+X?I zPkzPZTc?J+P`k>J;@5wb<=e+;(GpqSI%m=X86y`4dw|Fl!4W}_KP{g?)1_bF*D1I2v;Z|2Pqk1{2<_q)8y6%rmnK41^|&1STHTVm&goH7!j-ZI)G@ar z{eF{vly;gVeOFe8U8~0XWgPfzIAEzrhH9~u;!&XsAc}sWo__Jz)%dVKrJ86c2M;Dl z1uuA-V&clv5o&fslwz+%dLOyE13JRWMP8oW2I)*E?RravgXt^X>so2MtwXY$Ki7r|1< z5>lkdxGVjwXv9WRNq;RmtqKPznp?uI)(H;uv`&zq%cAlVikgWC8bs?96F<}JzLtOj z6TDYIy(w9hO?mc8%-y0?NSj2Os)n;jPuo(ZbLQl$`Zw(smyF-nHY8I2@vY}d!vhkV z(M_~Kzf$-@hKc3$Z#?BlL{POtMcX0&`U7Wqo>0hbx-B*U4pcCj)XAvvz*`#Bq ztsSWH^0uBExxOSjKu^ojhbqZ&HLsks5k1M9rP=!M3uKWRgk7Xt7z@9FwtP9D#imH$J04Em0nP3PX#NZ;dEn#n;Hx zV!g=Hq#9gcY2mSa48R4qk2f7rW-ZNI5@>~e?qy6^@LY~_hJ{V6i>v!I|a5Fr3>w zrccX`+YZXgo15y-%qlbtk`8-dpWGb$Wcia&6Ku0p(s*L_lU~scdSqoAhOte*MOUC? z8p=$T##5D;;l6N}6pSZIf^Hj;tI`>{J?PfvN4I$DV5P87&}hX3b!);9zE+|$wSv^U zGMnu@N2jf&Q{O=^6wy_ZAzcTZnqd1w4ml)@$$?!TPEBS__FkbvP`bpoJ7pioN$G>c zUdq_xytEte6p)M3hjI%aJi<)j@L+_daCihX`BJF!g+x|Xp=@?#wvtLE`hqq3{5QE| z-*5abU4)j4CY4EVtx`%V?{ADjg4}dbZjA38?Z$acDVH6m$!4Lx%;l7{St#i!!Uq=s zg^y@GGSid?X(~n)s!76wJew&J1d&P`h4vfSafUghTd%?MB2HTWIDYV@u!wV0``iEK zUXS{;US?)px@EkhUyCtQ`%IMC*dBEM8%(~ozvST19-H(_@P^R3nHlvcD?sa->UGs^ z%2teDo03IZ<7Uly>l$-iL>y_Ejx3jL=dlodLsvojS;BV|A`Xra6vcR+c?YgpX03wn zD$T4V`K}0S@ev8l^(9So0WoLS~X`0ark&C#P0swNfnv z;zPDXMKYD5*i+1kQp_YD>oF>H@v7pYkf6;s=Pp~YAV?`(R}yR*{@tNl`ocd#0!H6{ z?$8Ud%f7v+-`&b~(O5d{>Z{bgZr&|tJ7vO%-U)O;&HQDrBt^0wZC{jF$@V?8{c$D@ zcD~;@c9EpgZZzy9wJeupU9X^je@g#m4V61hc!nOJjo!aOU!%_)m!yOG%h$frcb}pS z4ok|0TEX;D998sta8@$o807mh$afPghUP9#@r_qJ-a0Pfxq+@i+Nd1kfwFLX1^V-Y z79?(RMv!25bI~tJE1cRJZ%X$4G~p%ZCHmzQI$fU+cU%WnfgJ#E)y3C$S}1^I zNm5)^TZ-pc*GUh5`9+xJkN$;$5cpqT?M16DJ`)}`dZPXz4WD%^Jap7d{f^?GS5Le* zJoU_&*S}+joDb>R=@aM6+vwbJ!$&FC|pAeVR^FWZn3N=0r0^zg4!W z`h;k@({-!dEwJ}_0Y7T~=SGz>#h7?X)osdIZz zb~UbShEtjn=WNoE4P<+qWjhqdPQAJZihY10kTm=+9Ha#@VR4sZ8V8{84ccA2Re_y@z#>M6z#iV97TNS@W=#VFSG*>WylFI|~KgvSN4&CkaP zg7UMQ5?w_SGs|&F3PvrQ$}ARc7}=A#DZnI?DUypl?o^PcwbZ{qvFhWgfu@!vG{W)r zZxLsMSI;`{tYVd(Tl>NEdit3-MlKB*!=%~2Y@S3n(kj~}`TGx+u9r>vH~KHj+r0h> zQ%2Di2w8}}R3?eO?D~Yh3<8@3c{~*jRPEr@h}QFB#c|c2c9T=M18qbKIc4# zvXlgY*IVH%oMgD(DmM)9>MZ~Wl@sDmX}OYXbm;OE=SwTkAFHU}fA`Y+A?JdNil)6_ zRUD81dG`;D^)63d#pLJaxN+4%;Hud5wQ^Ru3Ai$Oa3!Gk2ykIL3Sq;zBcNeKE7Fq; zCsWB%vX#6*&XR!MS{*(XRuwMb8(Q^aX@BW_PVpU?54YCCC;S^ELvZe{VRZeyqT4q!nrS(TG`IH zvge%_c7WO3HL0g@8b*3N0n6n&%10JZTmisHfCmYJO*j%L;S7nvm^cK90~%+gxoDmh z3QWS0r5J4cU(Ry_Cpky1*2{Vpo_C@{`pC~gi8W-c9#53_IF~y=@WLl(IFPi_Xb`u< zpU^!57*FfVk+PR(nIbG2lQ?ivbNNa+;g&f6zI?%1!UA7ECl7zT5wNV0$8h^_lJT7q zigAO5BysOna%Fs-d$$7JlKROU6!c%cTQ2s`hxG$r7Q+bCH9TT)>O%-{Q>f#zcP6T8 z%n?eWDO5KWOS^w&fVfuOf zhd%qHO|RdO<<0tg_ZnUPLRMh=keR$CT&h0+LW2+wZL0-EM)8&eaTC>rO@Ss40zE@e zEm)$wTzMf6IcM=_Hgu>^{c^Hb+0&i_&O7PduO3EN^iLk>uh6DjE=QOb&ejjG0_PQ| zpI@%L_v=o?pQderi-nOfMvx+lacdReInFgci!&oq=7KI9v=;7x&dd1W{sNcFfXaSg zrPxhrYO)vEmEabGhLptcQ{b8-J3miac4L{|s@0Ox@v7QrXVLC=SCo!ZrJ#@o!%Umk z3WUoI7WF^#xLQ=3_r^Xj(|LbwpGkYum~K;LY3^U!yL9fVcVsiJe(c8i_^U%D6OA@z zahxM0DZeT>%T5Y4C0cm$6dpNpwdy|`g&qfvW_B5cW`8ZK1q-g?YR>0Gb*njrn_sHQ zYD%Ua!;2l!9fL18Y00<0T7!?TyF;%!4H~)nN<{eF1^O-4)_DT`LGNB!Qd-NoC6xU@ zx6Gcg61_r68X`4&g%7Y$v-E9^OgqtEqT{d5qI0*%bJ5a+geZaNDU(Ojl(Tuf;vNQ#zp*2t0ib@awtv#=es%6E zy>6V`OtC!rS+VTovULdLM*`}#ka}9UJ2JwJ{&E3kSk7-)PUCq6C!yTfK^KVuNG@x@+JERYKd;|-ol^POBd#+kfuq~h zNVL?gMal`3a^kt1+go75qeTRp3oRmXTGGIX{17S*0Kf!asnyOMrpZ#83AY5i+V_XNyRNBaB#>2RjzYfsDtj~ z|8v<^dgz|>P1^YbUDsRPV@>puQfVHm;Y@L+vwY{9>^lbEgo`F~0BHcCqymI;T~*E= z@j&VZ&hL%clT$ev( z>57iGk_itvgj3oZ{wP;C6cGpElRFuXC?ezLC76Y!uX^Vl`BRz--IQzGldj7h5l>Ag zQ#4s*ctE2#lH9r}8bT?WyV5vXy&BhxW6lXuG`DxPU~zzr0Ox|Ae?YSa3#S3pvY*Eo zUQ&OlpO{)JU&UY*e&Srj(J>hEMzAE4YB#0W;5AE2f^W>mPMM?)2UeX32%<6HUI+>5 z+qd^Bb4lRbYoiXG5AUw9Fs4_3W?SvFC5KBw0((@9s{;q{@dYowLc0}?Wvp*I+IL+? zCcnPdd9Q7LUc_?tOxrK%$N_Bz0T=PWg^qZ-g;XK~wYc~MG|S<(K6n@y7!V5CgANb7 zi6>scpoR*QH&`5aB*mwkxvKUJ4bd4YL#xxEq;q*(1(t|Q=b0p&BB$ez$dzwRyWBVB z01ZAhYVO(XM-^&1Dh(ZRXhO$&`-ku9#G;?q|C}w!t7fXi`RZy}{^GTU^}4LxCd)_l zs{3Vm;cuXi=EnEZUAYr_xV1(Slh7s?aS8G3X^O{)_hUm%j^OG+ixdYQdGzUS3?g`s zxRkQXxgEuQ4ZPdnptI3?h1;VKhc9?*_@Z;&!xZc4d&^(Ac8HBDTyYMrKG`&JE}PJo z4nEjNVoUzmlC%9!#My2hqQmFO(x&2kF_M8cod4J%G~Lr1&agk51-3~_lGY8CbA&V4R$Uw1UaUqim+lncQ>kP z=g5_%Gfou_J*EG--#YvJM$IIZNF#^tnA)x0&JlaNviSWpXuc%RX0;w6(@>VbzF60` zY9}-8rw`Z5(xL}wQ8VKQ={C5{4!_kf&EoRN`NbbZH+Y)k8NO(70bF|^A?W1Axa)DO zx1UYG-LXCcON(@s3@G1MN-BfTnfqBeg_#n$?Eq6smC#)ZxQ#w|>l=#_vE$CX11|?k zreJ4%%Yym47Y}XvNkq|sY!)V)$41ID=}!6{8nj4~KR(^4QRj8<%JTZ|{l`e}NISPv z^UMRFv|@;^4r&bijRQ2*&bi)2X(F&x$t^>KO!G8Rm^_{fPkVVlg?iNr4>kF0ARaZE-KVxG5D7&vTiZaZ66cAp7h=G!s1_ezIX&EETL zKNhhmh)pOQv8t>qr!ZM>FINF?R77^yJT16dI>$3|?o$0Na}Rui!#x*bplflrNeD?U z3RRi6S~Ew7@QUCT^6ML$c*cdJpBw}M`pZG2;cx=Xcl#~U^3hY^GgbJC{AkhCC3@96 zQ_uIS{QSv^`VZGezgaM(|DHJ~Dn`yfK4?QHnVpt~4S#Mz*LpkFU5H@u$Eh+yl9x_- zeCzr@DjWFBm^B!sEblj8mWI4Gxo+gD9kRTa{aha3fG%Tovoh<+1$`R8V;`wEryt=vA&3Oka}lrTXiuAkxIwS` zCt)BJ*Iw$dXKH3|I0%wmQn_SD|K;Rct$CnQTa*g*l}b0h6S;put;Xh*j5!sq$J08l za838jaC7;2q6<(a0yU6OjS;9cnmht zF+Q(Ufbcp+6_9`ROT9&cV7s~>|GQJ_iW=m0OF>Il`|M{xT;A8`f!M?Bymx5s*C%PvDU_wqyhI%?wACcd=BKU7 ziH&m26*YM}$deK%+Fni{RDvN>NsK8fiCBOt33q!rXDxDV(RC(HtoCvgi|`z17g~TH z>3sX*SB9*L-F*GIt&x*X!bM}=fg%!#W{3uQwKkPR>LMEB ziw<~N;?H(gy0F69vs>1B*lzE%g&f)?yJh*Bm+PeCWn}=5YpZ*5JfJhfN^j!l_44F& zl>^M1J>X~VKsm*G1v%isnBL^F86fA7#050N%yES&po`e##jo}bXV#5BuUzz6&(QGA zzuY#Nf~E}Wxp`=KfD$rw(DKW6xgA^W+-Tcrtd!a6zc(DDA?uuHo@zRAxg_lUDh0|hl+05Ue1&g)`EwKgrN7xc8`&8wC4L2bC z5=tPy%Lk8yK?nJk@1i0kF6Y-2bizFLL2IZqTWxlrh70jO$f@ z=b{TNdcXenJV~DB{8Raif`)ts-4^FRt7Yj1dZne_Pv|T&GG~Wsq+%rw6*q~zM!BaQ z<)}#5?w&?@JBtyKIcstq{467Moxf#7xl%$NK7<-tV}Wfdyp%4>h_yW3FY$n0cC!E6 z7dMxf)aJ`xzOG1PhHjbIr}4%m=jHbDtkI8BnLJ%)cP>q*)^`Rw&vaR{hshgRhPba32#5^Nf!)j0^BGh%GINQ$Fv996P(z_2|F_ zr_LXX9lt%Xmb4*oN0|ZHKXa2D4lc}qgev@=%cqJ54OmT6iZb#$y}ar)W9K%~j!3Z1 zs?oAfdQ8^Vaf3Ftm)PsuXs^*sWE(Xxeq!sDhOo~1YBoRXOz2JzQX|pINY8~g!3su~ zNK`GKN5=E{{E`tdsRC0KtXzVM2?${C+?;$9LinlqVvYiJX1pGAd91`t?Gp3D8Z{X? zGGz3{n2Q-oL;cYzXWt68c0rpgY#T=Ns}O`mzx0CqsRT)6+-e@*5XqW6iI2*^wr^uPn|zJ0_im$zr@Zt z8&|LPbSFvOD@8uO0=Py)sr>}Fp6EmKfFk(Kb0Ij96Auw7+890w-&HO>NEcpoe!28R z%_-G?d*L9cLk=pQiY6Lb-k_N18&%|LdoOIPfMFkYJ(o6xSh09MDk$3hol% zahV@zk8`?pU6DR@-Gn2J>Fl+XNCl6tNI7Ni$^~VgNvY@)<1*U*5YPpa&aTcV2Ua<5 z^)e_IOy1!!2@=C&)pdBHe@qhoG5RY_{X%a?171I&U%y2!8srLdAd~L4^DbSlk7U&u z;Q zx$2y`@coph&6(Y1WHmZ>fksGGA6xW)5DnR=$X)wRmyla)0atxw!c|4DU4e(v=C4BXQm@8QwtQ?kJEV$ zyx(jh3=FxPM}Ut zasQSzZiTIPVl53@tN*UP49qRpSF_=2U1+ilEkSIW1fG>p<~YY`$^Lmc54 z0hKyHI2e6K`saP)o?mtYGyp@j7WH5!rMxcDb>+kA1y;;V_vU$lJpnBQE$bqDqlQ$x}h&yhYq@A`E=Q zbS+^xxaM<3C3C9?=Ade$-xuzPeKG32-5IAcC#?w!sXpcGq#CDc%v<+DQQ_t*VN@!f z%f=Vdg%>J)f4|cC6=P`d`wOD(e3kI_hT-#N)ga$gTZu$kYCOOQX^HX{#;+r^2)~S= za$yyZ2UDvEhX>Sm#d3~k_$Yk|{g}GI(;hG}57YBPOSLH18y5d;PjobBE(QK>dtQFN z@JEQuba&*+lxU)7;v&1Vw=0%KRctc0V(jkN?eQ_xcIn`yfODq)gGO&PC(yiDHu}RY zL!=$sS=C$b?r>iFQjBk|{@^9ex8jy488JQgR^nc0W;-doO zZbt}@c9PF1f#+BI^*Cu_`MEq9Kb`047=3uSrc;?)bg zKC_V~PS`PP{ZyGv+Prq%Gd))8cPDS0#m0>*orWS`OdJ316dZ4Y-#SC%Rff#4d15g( zSRpn~{6Q!f&xJR?AlxdYYb1nAgOlObcq{AeunKxaZmz|fXXrrEJ$Tl{_ga|mb`WP# zC_h9h_&?Z*aH{ivh?I<`AARNgnO3#w%PZ0e*w;BiA^{AXg?<&-pTyV_(>KSsy$ zQN~=g#KfP-y_4`9}pU_aMH9D*S`um88CnPqSN8Q z{b+a#8mdQbJzxuKokLlpqqg9_lj!M-{e~PmdX33<-=JM*Hlr+WK(n@EdZdoOe`d(= z=SLpN%wqDlS7vUM*@R&oM|FuWHr34BG_ZcvjxjaYwJfRze)(MfS?UBoPB3IRGL4Y8 zBzc`PJS>f=sSsCDTwDq%=}Nmz@jL&V7G!3+6K(h4JgXj(ZZqmDJs?CyYAvK^jf@63 z&&qU3Qi=3O?$}SrUf^>@3&>oT7|lTUWq8Op9~b#z5RossLCQQCF2zf5=>}!w^L`1+ zJV}DgLEOhHCM;_aKBC3oBF1~A#fo64BOgO-@1#%%`a0En<<>%6;fs!Q2_-Squ-oz# z8|GD2wxp$EDu>KWc{~vf$%87B(|FRY+$`+uhBdpxf+DZ)Sh-DIr8eu?cUDEpOzoS# zknF5sqw>q=Xxr0~HiNu!K|fK_%k~ZJ^QuPURz}&s(GQ*vI<4PZ$+~VjAj_W~=zrmJ zChuKOyY@#KzELT;ZBNN`vBGuzA0~fEXT1ClWr}=TU!3{|9r(7)F6;X*zpd}QO6AM6 z7ngpou@h1|^kzlmruTDU)gvJ^sR|bXLND^EbXuS!t`V-Wff>A-NV5d;`_mm3%n<}4 zD|w%A|8k-~&X6sV#HpPJq97^Zmq>Hrk4K_Xav2C_g)H*koBbdtgi;#xz}P zKNG$^*fDR~f}lK^2I%Kn_loP?eQ1D^$1b+&Hmz{{bO`$B_7csm9Xx6llQ&G)_k)6_ zHeDq(%umlC$kp#bHc2a`6BvhXeWW8cx|J3fI^^RVI!St6NX}ks~HDH}*aiaTXu7 zf!OkSRt{(}1NOJf6o_MY{t7qg>~>Q!%sj}KG&^U|)U@P@g4mAH*mXAhU48$h6Z*Y% z^F!vmGxHp6b=Dd-=k1v<=_MEFg<4A&P`Ye`Nov}$Z6FP15?iVw(aMz7bp5KQ2L%Q- z>am=??;^U3`u;bs={w$%<%_gW#=M&oCHW?u{@Q|1ixKe9=Z(>iN*$>(XIw$QjOvB; zpNVf6ky82TyvEJsIg~Xkc&dSfe)?KTlpI0>V5TOY{N*Jwup;lAEzVYUR-z=X;#7T4 zy1+hl%cx9OuZUqH?-husaL}?BWx}!Gy%JK3i((b3JQbpvo0ekg@qKyEkU|jGuEG81 z%~0!S=XF)p+BNf@kx!4=!`OyFMVQyVW=M9+4z;t|cLfY77`Yho1IWp6o}um^B?sy!!8Mu3vZDV(pi;&muY~ymNUc%ED2_0znBEi8*HOcNC&S?SO`&w|g z$nT33&jjMBpc*i;$;HT+-j&FnbDoW)0|tbcYGpO<5Vke==eQFVkskTQRNH zrBzlQrL7y#2^%okX7IEbxoh~?U^H97epJrG79Z>CGvP+`aFTF8b2y2e2OXzFB1M;! zlH250BK78YGx^{QBqA9dj<#eUqgj##@Uh}`WEg6dyf2_BF8WVS!fFV4n0yCHcGEzu zTsVz55n%S?GwmApHmMDAiYjgo-Zf+9O2xE!qO6=+Floc4#sv*~nL<}QBM+jieqMHV z??F?fiG`CIr_UKPhq37+bMhP38jSRMwDTim73}w96=2qJI1^a~XwXS6N?>jw)FPF} zK=Sg**6p4TeCrsFibE1D2~uEV5U_ z559^FTmS278db&usARmk^0Nu_Q3qb{em0aYklF~&0*;Oc!a@0I>`heR9}U`1>*r)O zqz$ucG-4lTV`^lBob0DC@ttGvs@|Gn%^F0!+#m^4(t{vRY(t}=BL5yKX(rX{1PxJL zPEahJ0U=?6{RYa&KM*xXmX2YV}&U1Y)(X!_IEp*N%Hz$nz*wf3U1T6_IOmQO4&6mdTN=_c&j`m)m&&60@$UW%j@~d93wk!6)N&nu)mHhBQ>!7FG zwl4|~3~2Rqr=l?Bb@}xzEuMc+gbXyS9}$Vt32MZB|} z+(qUVf43#ujCb}Th0ptraKoeJ;vFOkD$A7%qWS1^PL2kkO|@) zj2J%9r?Nlc9pLlUAivEn?|>LF!2P8C+XOY~KTlAzc_yfVULaU_jzC_1zDvX4Bro48 zrlz^P3he2S&cg~Pg@*R&-G71Qr1jzPBQJ-CUo7qw^Jm@6th%&b2F&C`qxKB!HGX{m zV#dbyp$FcU<+q+ceQa>o4YVPTZ8oUE4d*&&#eAT9GW2FR;$V|p*z^pWd_fJakGL@K zconq>kyD4^uAdp?C^yvv39_EKDZXGdCn!JdWpQWbC1OGfWEfXoV#8Ey^>o>ROy@WH z<9l)^>A6^E|EE}kSm&E9*pbJT=*fPxP~W9EHtSV4Ie(&)+54R9tB`kPCJzAD*A^>s z1iB`FVEhpjC>*e|B;qYpct5$bNGa7!vPhVPvJJ+t)XFC-Qai=;Nm_+Y(;v^KDxES& zUrg26`ak*t+KINO9meSzZ8uMM=#Fu;gO2=ti6j{Nl%rE!l)xn+73xDv1u53)-T6M`^C z<^l*uWV6Gcn95x|$ZJnS_(){5w|joV^i3CrD>QqOc4yYRbLMR<%?=9dc4t?S-VX_C zSK4kbDXX3&Rh5ICZCj1I=&WLkk~?g>cld50txlzv3MF~!euETGJ)}3)Uum34jgg(D z+0p{!x~I~xbzIiehDWGB=!(yP>#3PV%)^1{n4YYCkKhq>+^G8A3^muaMi^51>G`h@=6&LR0;F?W7H^8o%GTYYVbj# zA47P8=ORkuVF+&*2CIBY7e}POgG!5!^r#2_)s>JDA!a0V<)HG}?+~bI`AAlPqTsWY zC2nTJVEW+H%a(~}r|dc!8u(mDVBXpSDd^r2ZCu^qV+Sn@Hs!CYuPU`0)d>h{({b41 zDEXO%?+$0Ow!ZJfHu)phkFB@woXlEoY0U<7t21Kbq^If@_Uc>EX{0P|f+Zypt8q^) zM0~b7=A||wZ)mJ>6AnJiifqgxHaqIN=`{`lFV5pk_cT^?nb(;o3B{oWyYxpe@}z>V z2g5|cib=J-t`AIjL@r_+{{~3eUaD1ay;aZkRz18`?|MCqX#CQ1K<&PX?OHWgNq7ls z_-aKaV~+RAJ+CzdHiByaDX{1oKib7Q1IWGtwQ$*LSN*aYvE~4rh!}6C%0*LN$~~mt zUwbGhNWXC>B&1uThrfu`WWk*s&uGcr4}V)sefZRix4jp%0GA&4$pG_c^2`vE^0cw^HoR(&E}eoVRL0i!AsAj zvB-S#kfqm2Yz`BiCzxw~@&nGP6hA~!3&zttTJD-0Z+H77L4^5sNubT8f~1|tb3&tc zd^Pv{ZEM)lFXnF@BM<+j?)AZ1^P3yrEBLPV3#%_%!)F)GDv4LD`VDKIeyYVsMtm5AJ2$a7b2E+jeDOvB!@hJ#=U4}W;g z!ZtI8I^@R2Q~Zk2bds5tn}fdaBf}!{oEJq>YFr|pP0{ug{>{*c}l8~=4c9z1`=L=#h4Wt!&*%B64TH{9_adq#@aYvl`t^7du;#$@)*$R?VDk>`c0O4kj2gZeuJV z!))StpuPR_K;s}G{D-U_B>b=Z4ZjQ(xH+DXkjwMaJPEn}=^JH{%io@Ub`a7xI-eXq z@6^sC5zHTwl;5lnwpE`dEMZt+(jGs({;484f&Re5Jxz;C$a%IALM@SwU z{fP=*aH}T_%}1g>4W?OKO5c*{KZ_N_;!9=V{s+IT7sx#Ste3<@lPMK^Y_*Vh=Cz=( zHkuXjFQiU!iKmV$`|w7y&7T)WWv0^}4_bX7)p1StjdSk61mMTJ+bn%=WZz@=6ElNM zK`Sj(-bpRHXgamfR*YFO8F+`YELsYcS4Xf1AL<{rYd3EbaM;4QtKN}2BX*Tb>XSWM zOoOMme2+0ZY9JbAcI3Nth|m-sB$s2DSZJ46k17>jMO?sJ%)NzLZE?Vgep--Ma&f<+ zZ}z)pag~g5m5lXY&By^ok>z`@CXYEl^p{fuJPj8@KaFR2y15KR_~IZuKBk(uUOQwQ7TM||dSv<9V!;y0&b)FoN1p#XdC%q;Gpn9jo? zwp)U7Ys|v<)JjwuWg5MlMKrR|u^2TTV9VqU5@wi^U7wLQ?=x-VlsGe zLq5tlDrYlAwPK9wUVlYUG}pq4d%Y98$|J6MbkD$|*yxj%%Br>1@`VeFzTj^!k!|!g zdeHl}7*Pow&OPWDfu!Z}Ag%h-z=_dz&01NuwOY4y-juK4lh~|(i($GK_q)m4QX*$d4FGp4S%-ytO=KNLfBgOi*@kQeg8S>S;*5!`r?oIf zX2yE`eHKOj#GPKuVbd8S?w4gBVOyneRJjkoo;jG~VW)c)uYmYji zTgPEc9ow_h5a#SNc2xIjJx32mCOIX2(NkUEJ;16t1oLDxW)ksbu^NswS>(+IYcsxL zwAW@9r_Z4CBIyGD9wVFSU!M06zmQB~%pq}hv0`c)m8k72rtjZOpFS>~(q}~J)97Zr zN{wGgk@TvP04W%VAp(NFcqJcedv@$EjqP8AMK+)2xGiL>**D65RJ)&yWvlrdDXuU) zo(BZBv$8oH9gX|)VrZBYvQ&#tO%s^#8h9Sf;vFNUM2j&}3Zmy;?+^0k{bo*awucux zMXUjfz2M}M@TmBx%qXe1e~16z@DM63^au-9M^ZcGH%kHpA$~nUW_?n+uwlJz1L%X((nO$KFFX`5y*|E6IjJo zEhaCNq@+DCG-%$Rbo!DRG?d1&O8Y7^_SUO2mH-!r*)r)j@SJxZmPp~TK`;2GC2-*2 z(f_#YqgW}OE!)Jkba#w56*2#z0vYCqXODd>64E?cCIJ_H?jdLWi88)#1EvQ?XR43s$j&aXw_GjjzTm?V3|}z~petSD3YN z$~Bqe)8|K>>8GDk2HD2+Mb1H206*)%S;neGKB@wUM}UCKq$u#7|2k^uFM&>vO@#%e z1WWQ&8@)s;mYNX0$|)XSrOQ)EjqlN=V3R?kmB~mKbi(TMK<7z=FBgZH zO;(fLh(na@#v7N2G`4&|g1dGq`+&Ao7J}$sLJ(FvAK9Sm{#yv*oBthwpl|<=2m~{J z75I-5t1UKjwNXedPaD0X{}4qiSI5_;LP*Hl0&aC+m=sWol@@u&gXAzj2x<|%kc&B( zCKf!@KBUstO8SOSdU2oLsIFHj3mBC5KH4>lGAXZNZ!$@S5 z7Vesnh6EGUZD&5&Z3!a?tD9v?So`BT-}!L|7RUzLeY1qP1Jjpx&CL(21YHsAB4#`J zt?!fQTi_>6O6)OyN9>L<<<|K*um95Bx6;p-U8sd^-Na`37W`pbb;-Nn57pzLEnF*B znQF3B9vOt^xhWk+^E^7k8#4~M37z3Cz1gqy1p2^NT67Or9HD-tmznasb+07<_)2^0 zHv5%6W=iyyUQH>|)!f?4TX&dW>1C?ZTY5NpIFGokBX8Z2H=$d^T6f3LkIPJJz2#TY znY0lyZh3SarR<^e(6_kd~R*|sjg5O=HvA4#R#kl&CT0CKQ>7dH|QoB+<_~0?O6+Qv=?97V$wp8gi|}B4{Yrjrpatwg>axkX>ar z1Y*?|ztR&}BuWGG@aU$LD^nX#x@ufWD?FjbD&z?81Op8$xgqtYN`(1ATnqZBwMX&VMaEf&PrrE(f#+!Z`&fC(sM7?_yqiu)8KPmt4{D-Da+q zV9jgd!HzHwxZzO4S6UA8D?Nb@LTR)lI@6KiDTWS@8_rdN`wQf3UyGk|J z8}nJ!DAmF(8yX1NAZGZAR)M2&m$Fh=`+d|Z|UL2V3c-CYH#V# zo5&>=bcflfa+A8z1Tm-0uk-|p zw|I*{?LI7`MuBl&BQV~>i*av#9*N+pk5iqi?CL@RA8PZ^xvK>46Bm5L$vRh`po~un zh`BBTE__VT%{#tUc#UokhyQEo2^3R&cq^a*Y;L@WGNKi{Mzo^0w-rK1@m`McFDp31 z_4VNd0~${AsITfx5Ddt)T7*Umw0hq1HzX};(anSLrxpNBJjV%yrSb_!}IGx@4wyT3T;L&vvCp$c%!|1mqgQBKVMB#a zV$HF=V~b-i#wl@maa$_}RGd`tvx<)^?XL8B{G#~B38sXUgwGRxPpp|ZCGnl4MoEQ9 zr;@%(X2}J~qms`iUrD~5{HStdNt!=ew z)k>;8PFK>y(=*cBq>o6Sls+&0WcrQtKdM`*r&O;~{bKdcYc!~_sm7}r5gBtcF5};| z%zBxfGlyr+$=saj$b2pHdgk5Czq7)#lCtV#wa)6FH6d$x*50gBS=X|@&iXSuG&?>! zFS})Suk3Nz^Ru^RAI^R``@QU2*$;EnoVc9KoMt)Qaz^DW$k~{4B%(M{>e4x zCgs-7ZJpaYcMN)u_aGzW(fT>5eZ%YhL1N+U!SC{~5#WA8N@YOj;=~k#q7bQa}fi7uaz!id`^PN&U$P zxrnr(tBqAG12%gUsU_7nR-yb*Z2w@hW2=cx!8Q(C5w;!J8ev;ce7hK&EG0Y(OJKV?LhrvLg zF2AqzBa`G`#BmH@FOc_>H2E+&s94Al`4QQt-Y2ig-x(juC&)qhnDHZvF$}2=xrpOb z>1onlT58N;MOfRV3CWcQk$AZRX)X^Zt!3y|cAgaDo{Slb@$^2)q~92k(my1DpR1pc zN`NO`oe@(^bwiH%w#|P)3}QJUrKApCFuwWM}NMghLe-< z3ho3fADCJj^W_?(3h0d5nq+w>2TVJaeBOg7R& zI*vbR^Bkqp335wGA_w4s*+Mswqu7?v4aR16m6WjSWCJTP)?;Pd-T3=deX%iVjqwX$ zDFh94l&6rxXh(N>94W@V5$ulfJ+{Z#e&w{t=}LKuWO90V;s*KZ&`-#m1| zX`|c*n&5Qd*#u4Set*)&=>Rm~zj0jnZ{GgrG~mCX?|J`wHs1FJw}8N}rja^auYtBl zwe^YMOF~b$c+$PUMI^D51g)t^}y~p@6F5w!)BqBjauSut#wg;5wHS*(Bo;lkgU=TwE(A6qc|`v5apb z$Y?Uj0eGmG_)9DxK$dWi!y|sKiuoyH{Hy#Y3ZjJT%5#U`Y*E~NNjT3E^aEye1 zk+(UL$h0YrdBB4Voyar(W|H0HMRJ5(Bv;6Fa+mx<44O?lvn%W~b~7O|p+Z8XgrtOm zgr*6_2`?sDU_tR;C~DYE_Tasv2~4m?zgLc`TG|u1k~b#?p+leF?xf) z@W1~KVHwoJqFqPH9E>Q=Ah+%;IY-Wu3z#i2kGzcbULvoMSCOT@04vE|CaWsft|Sm2mn@pz!r zw@(cRt)7t3Y*V*-o&KMT$g4R^sp;oKm z2yoTVxx1rbtb_Dex|G+~xqEV=WA@Ueu}jec&-JD9*JmjC*BcG}ZvX?$&d}K%P!$fz ziLv}fa$<5KAneh!h9j_g>(1Sq0mMXr7*yR+xmgWIaCJut4k6W#r_sd;OFMUesUfI# zz?lHDxJ&n!NM-3>QIA+hGJs83e8vpCx$p5-hE{hpTzn>h^z42-g*1(QiKIyPn&N&) zx&s*wn8eT0DO}swpAIj`N{Ka-fOK-2K3z8>F%qYzS@)-FR}p7YrzSO1Z2X?wr)|CT z7=EVYRZofu=V$8J-pzAj`I%|Wq-P6~`B}isAsy;e;Aeqdn&qY1`B~7!ey#H=^0VN1 z1KYXEh1}4V4yecPg+@k%V%kvtcwb^`E z6iFv&;c>V(CXV7yMpnaL`Irp~oebI?h}`y`pyYnAduw7&xuPg5Hvzp~K{jj;He9uLHOEu z+#ioSZBSPe_!`<_WYr8_CKn7GE5yKG4mF1JzoYqtACI~PAil_Rekq=FO!6Ot<(Yyg zFhy;Bu%Ci|5+v0eoX^8Q3OTe8`z82CG1}#lkjq;JS#}HOysjYNvzW+Do44sgDh!x1 zZX`(^GH%cak~6Zfcr@yk`G@djUeHq}wFpdj`4bi{Wb!=C#y@Bm2wm0$a zTiD*lb`9G**gnAaA-0dOeT?lBY@gzLH?Vz%?Q?85@!eb46tw6g{AI~+NL}MTsc+mO zuVRyN*MYk~;Z7;;l!7`lfcZMuUdDD2+a+wTV2i*rGy2Vpw%$Wq@1d>t_)3ImCvV$5 zP^lSoY6hj6L91rKd=D_+1I+gT^F6?P5155jhdxk{nbZM`z)weMimUdZj$WiM-Va9o z_fh|S)PEoK-$(uTQU86^cOUiLM}7BE-+k0~A24;s{sU|uV*3c&$Jjo>hQIxY{CNwu z4cIng<88Z-w%teD?xSt@(YE_&+kMEUHY5QsBmkxa)Hs_wW2{E4vr+48)H)lr&PJ`X z2~#?7_?0WB0AzngLt?#a{9*iJEH)k*=Zsm#A0)&$WITr!{y%=;6a0*O2KUSTKYqs7 zu0rTVi-^1Zk9XYl|6qVZj311xJaYTrexCaOYni*Qr+jS>5(!={_Y-%^-#G(l@iTTn z0+@|GSSQ7d<8jK`&vEA~<2!Nvqj&GIY54oRz3!6yIj-&-Uqi+b<02>^!ngss zXaSW!2lci|3DTHV*xhcny*}g{gNxOTzA zdzt@2T?f})*SY)7Z~SOn@W1!J&pCGge?M1AA7vWid%k!7?b?O?-+d+iKWE0~|4%7i z#`Qg8vZp+c#{2*N9Yf-2_`kyWe~q2ZF9Sgs#;4mQY-!qURkV?aAViS(h>DM!uOJbM z5L`v#4-s(@kvO_>;=tK~IJ&qv_+$9J&uUZUV4vvL&g{&*&unL&_sw)lNf-Q8p2A9c zsQf8LrJ6(iRqhWyCqI*a=eP8~uPUXc-BD?^)T%GsG&jh&^vie3GGnBm}CT_uk_Fx$P#6ErzOT< zj{8Q%pf3iQYeCXRB(WIsz8f@&M-Lyi|C_s3F=hOZab+B2>DwY~8ejbOH3-C4z4&St zUx_NdTHtAs+Lk~{9A(5&ojA(44UlqMAjiG|+w_n<7krNzq{UZEd^O5*@!To!@L2FI z-I*hzD+YZrm=uG)7)-ir5Td|uvCDXjxbwtaT-+tZT?@>;Qkt=r5o>kCWIkv~q{Acs zB;bi!a4~s54cHtjZLD=re%S|#&Uj=;hX?3ty;=;c91%3H%A*e~HfALfnxw?&?7J({ RR;p6MN{V@9tNe#1{sOTsz$*X% diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.woff b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-italic.woff deleted file mode 100644 index a2b770481888875242d97551db61ceab992b14b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19880 zcmYhBV{j%-!-enIwz;uwZtP@Z+qO5hZQC|Cwr$(ym*@TUP0i`4bJgjdo~o(ouAX+4 z6BPvj0e%jdQULOQSAVY`|3C7d`~Qd7ZxK-d04VW?3H(SJi~;mcOkPguhb;gAVB-J) z9Q@SNfrOZnvJe0Ok^7U;`cY^iS+=5_5F5S0RUnGKN-UxoqT^kZJQbE8~w1tAJ6umUi>NmW5DYt zPmu6GfxrW6+UQ#w|1gFhpY@X?L-D7>u(Ne^`e8Fa4DG+%w?4qg&cXP;%*xi!)Tw&!jCjUEx`JxHpG|>C2fS9kk(IQ!W_~z zVaQma{!e46E{*m#iZG46l_^BDxTlV_3wJ4746RTV+@P?m7fU@*VZY_AMozI8*dem1 z;27(YwPQ)9iLn}i%HKVqJ?C*^Na$&p;rtaw97uM-t+f$*Ivz*^C2&RS9e!e~Lm znxKX;{VKA<8s+77(9^o0PwhRb;@++tci9I;w5Y~ooaptbs8=)4X8B`*2V-{T*(30w z6_2xZmJ32*8*P3PZDERa-|Qk;`KM9|Ud%q2;vL!bJ;}0mZ`VclAmwem>?yg|nCsg4 z%f?=kw*;y#(hd&3ab0J`HvTWd8a0${MTU+Sb82lWL9&HoM( zT+&_VSF@QUkHy9@v8eZrI%#ILrHs>PQqbxZRZcG~)JZIjv#jFG!s67z65P5{2sMo} ztd={tNh7CegXyjLbyw}X>+opMYv#fvhGH#Wmt+-W&DK-k$EDbn&n9|svC1&|%Gp4eUJ|mL8jBiP1Y!Jp5-jja+ssV) zdiFq@%Z-W!#)0FN(#46lD&0osKQ@RSN`O^55BY5U=%~83&_Elt|W7>dECjXihj||NE?5qPc zgt)*8Ar0ja-9_QQz27oRAXD0&0Fhf~r%TUi_nKyFUj^%qEa`$ZOu?TI31`~XMd|C{ zi=jwHs30tf2`LICQxcuVgg*YJ8X>PbO_y4qg-3(RTZ004ZCVwqQ3&iV;V|Zy#1>=v z^oL$k%8aNG+3V6(cM~_5$254sCp$ za{KEvt?l3yZZiH>F9#(O2Is(9;|jF63eOz1mL{(xcGU0@1}+b&}6UBu5+ZK_jU5HSOHf$jIbXR;Dpiy;OpfEdM zBH{*+Abw--^7Bt&86pxb613?>BISERq$x{f4%51lqh_ela|v-x z%X)OZKp8K>t^EvQZb05KAXXa+xWoLuMzdDehxxRbXyh1<%?6g5*34`*3Y)o0>Ob#N zl*Rd@#q;n9wE!5)4iom+&@vjy4X)pm@(!$i>Ie}Aj7>R~0c;tM;#QeWlguSz%AkzB zD&~NtKI-@H=-vFpT0fLjagr3CO1Dz|RC|J}OZ2PwRyvz^yPBsRR8DFLj$fA!3Tpz< ze=k5@mAiFrt5K^_9|9jipFtmAo#5O#KAj2NV7-nH#z-SBqO{z9#|uIg zB`U~*CH+QlOEg-bl&5zb!HAmZn_ z0aQO@{a-*hzzwhfFapQ|Gyow0J%9>;1(*lW2^jcEpnmBAP=Pak<_JUp7*H+%Drgh{ z5v&$~3XTat11bg}f%gL7|7*$(NIMz~9z_r}*tAqr2(@hTPh1)c-2hd`VBVH{t7as~ zj_f7Pw`j{Oeo08L%1zwy^*BQD6bUN>{4tKh>+`dls*_?|20KeDa=(w2-}W3wZm*np zR4B6d@3YUivUs)7!BtO~S&SH)ZQ(|Iw;Fq2L0TX-wisS+Mr7-;Z}@AJthvy)RI|V8 zu@G*^0APYd4P91)vrd6RMh4*kRTX^eh&x4SoDRRfsWBubvj>GNUoZ4rfZDydMe%^BlE(A z*Sb31uy~d^XjV;<0{Lex6;7Ei37R33brS`bWtn<8lm_FbkuSbQ^* z%0~V+e{DwDEcI8~3b7~jQ-YqMu%D?b5C9ke2>|~71|YZrRdzyXp$=nkd=+0@p|x^f z?Oese15-g$jZwN7vM;ISgQIz3cwTos(3Q%F$iI*>HA}wM1wcNW;`L`>EYF~UKS|AUPvh4v4{6Ch8{&yUZ}E8_>yU{=vZ+ZLcKS+ zWEB>Mk|O)bgAz-W@<|dedPUtzajwOziJ(6HB1;dhohEnx=A)qO=5$*NfaKX+CV1A3 zeg_F29{Y~)K_jUZU|uw9x>d!&y7&e)=Qs~^6h|9PyfvB&VeENQi1U9Xp{Q`dOWYd~ z<>bu9HT_daQjKhAl4SAWb;LD$|2)aL%rXFQR2M9iA0VYU>6X=7S z-T9?X#fHS#N>ihF_KU41FR?3y0zM_8kVDIC5M{re?mLX2(0)xY@QcAlZ}M8ScLwh- zpB_n=AE??f1YcwyjtWp`l(SVO3T`s(Oj$pd@=NVr|BIT5=YIVLRcttshj|%$^ke}? zx>VN@%_3r_S+hHB(T5rRBevC+xP3~)0t{P?W@gwiiMakuiCg`uZahhb(LMh!k&n6p z60n|^=cPx@tM>8Z?^DsIOB@%Tm2UfCsVli--;*!n@gWai`WKwbh2Xp_>X}?+vmCbA z@2a_{%9-F@R2E2pV94ECV_hc>lU`-Id;>a8Faek-8=K)^X@WX=8UiXg4#+*O%2*7W z&mX*#-O^f_DEOy%>#aaVAL)Iurni68Rz{rW=BMWPZ0FflgQtHK9n@4+jL41g)KwBu zIY~!Z#+L0H20!}J9-;dc>17W+V=^n%jYTA>IG%O|Om?h2G}nFs2C3a-G_w>ByXK~#1qf}9mWjaN9J zsMIY$y+a{u%dYh32alp?ABRlp2rR00PSr9rVuJNTiTw46v-14%!XTwN6IL zl-7dFUOw$oVm?jhwwEWN%>sliA2{uiyKLx+dGJ=M`{yQ(okQ!LONu^~+T{f-yi#G& z5zbnf7swTM^-2{u6*s}8D#uYx9>lg*UzRSu`%ml&Z0z4EXc^cc_>!4{t$$+`8-yTd z`w+g3Bw6BH3GnKpAVrUpFdflvxXZ?{@O2R0wX|Vb(G`{EHUv8)u1-(B+flcGF@Ssuu5%lK5wp zC>1|N+)iJ7bD!q+Fry(hg=vR*^}l%Ttq0l57c)d`D7P?xgdDHLGt-4z7+Y4NEjQ^pTBM8I*xz%i(9}hhwS2O$r~CYeNRBKi!Lv3$5N{D4UPDXH)4v1?^$v2Q zt^L}#rGi1dV5(l7BQT=DgWL^btp_qn3D{8yt(!g5nK4jnjpe=SwFS_|d|^f?{;Eac znjF#L54SeB?f&81zc8J_G)a654j+rXGs1I0nF&!OWWy?)D9XwmoA#UO*5lm=Gr#vi ztp*1L2!U5N$|?Rx)=wAcHZ5R2Fv_kBT~|*(*r0ZTfQzey%|6KMNWm%~AEU+k$1q1( z^qD_8z%Q9cXCPRuJy<+ zH#-x8L5EpeXJKvB=6%~K6iNBmq#Hpa-roLZ zvTc6cq*!k>WSCC8*Qo`#Yf zPBT#@&#T)JAX1bT57|Lp;v86y_qb%WFJ;m=rMWiYd)<&!&|++Xd~<&FZu#t z*)Gpe90y{?fR$`F{;wp+@Xf3$qF2E3_Uu`UYOy^vob&KrW1W!z|ksm zosRv@r6~4T=zwN8hLFf=1w47xA%c*^K$sMJF3b0J+|sf_TC+;9jT#tQ24$?YCNxm| zL5&MY$tvDDQSS{3_C&i^6-aM2R=p3jF+;jni?f6_OX6zAvG&f!@p!X2$cc?Jf_{_q%gt%N+DP4~bC#I1c#zBuF?4#u-IxVbQB8!8&#FpD+rn3vsSoZNWpl*V$QwCRFZ zG#6zpbF?%?Pagtnf`D6SO$c|<1ESaqe?CH58zfH8u6lfUc-YanZU)!EoVCfEB`w6X z(hsmAiX^`R1*P5LY7^-A3p<6_ZmgP?f2Wxf@6RJH2wk0XAXOoBSHAb!EoHVO%5o1k zb!di1NzU%~7r3mKBMIvdaEBlb6cex@rAp)lpG-+M_ zKVDA1bF9~tkKhEO>X~pzGGQ<^%%cvp=VWgLsMU&_tu})}R^!i!Z;DObElp2pes`e> zS-@<|r<$cwP6t(i@Z)M(XK4Idk!mR$?ZZ#dZ0plWm9h479@1{7IS9zw?G-toNTWm- zgEtAyOC50;LX$2lDO4VOoWJNDfM^mEF~F)@PuGX&fT4bH%BkBOUzVYRWVZe`+AaSj zC9U{XY|y}Tc5c|xRMZoMHRS#DP-kkO;_WQb(SdR;!f1Bzh!JZ!pTFKcHJ3Q+9%d%N zJ6(R9Kw_UGOAbl5)kWaU88FJQy-sVGjD+T)z(}C$;vBRNc%W>a;-*c{_F$jJuCq_p&EsOPR)(->AEXz5I4a~ zGu#lbi>=N3$W0%Rn1T$%+R}PJsUIrob_i&N&l@oHR-N@V$z5GDIEp?Guh=0G$VCEd z4tL|j%Zlr%_;WK-=F0q&dYyf$;S**Dw|7+u^{b|mt+O&A)q`P_eN^#m7A`;k0}M?V zgg9#3RHV`v<#qDn%h$Bxi<4+;1pFOw{we=>h*6nruhirk=e%WZ`LfcshBq2fo#So! zXD#TK-Zv`d)kg%!R8CvkH7^K7EGiC>FjdPZYeq*NV61YunIkC$bnlOt)-TZbN8uOO%W?uJQ^dy%Y zP#TjHUVS;yKEv|CQ-fan2F&mCiNJGt0%fSjg((b43HZHom~32|d4|C0KS)$|X%-d* zjqLd~yzg|9HE9OT9_-9C6>HS=jmtVS$>L8C6^Kk5UA214=FopZolG&EOio}0p}hx| zSe4QOte3)UE#}p`*%otAjsmgb`%|Tfi@G>RfaZNoBcA9a%V{)u=YmdifM_S{L>u zz*&nr??)Hy&!*T(PlFWw?`!l(7?bD6NiXG`Bl9@hX`5;th!MMIH@B%1-{$WujcCg2 zGAHcUl^fD%mr|D{i!nVPK*>Y-%^e_WiN#@U7q1A8<_35P*;5Y<6I{e|y)zxlp=9Oi zqKOzxeFl@`aTzkH%z;xhX?vC&MFXl#=(;$bX)?!v(R0lRa$x@_047w9&_+*etD7!c zeu`JhN*APbrn+x~2n{?EBYbg>8s769(#p z#}JV_!N=o~tyR_Y+=Fu}Ul-xuifUlhgzr8oRW-3PX&=FL1xTC;+J_?~yj=Q7|Fl|U zmwskDBv^L~;coQgUlTRl4hL)w^zNxV$~siGNeJVE^^7q!5}?EiY(kVAw_W(KF%7qy z-*0buDck)J)n;|DX;C-h-J`}ipeD(7bV<2uJ+}~nbNI*IRtLSF2IKJWbQnw~Fr5;7 z^j?*eglV-Djb#ed#ETH-Xqo~*wEjMm3nC^oCRoNET9aulHk2~%N! zvK)0!a3P!&W#SaPNXcySg%D+uQgX}F2)kktMmRkw8sboU&Ppf|l6cR!TL(g}e7-CL zwcmHTpLi^q_KP6b=U&&4GS556+-K#Mx8B?lBKRlQ1d;SGb#3BH)ml^x-J&0BrVXrh zu>Vet0qXhsUzX(k#*GCQDueMn-mm=Xz==Z~oYi zhCvfoV|^N0{yS~?yUt}0Ln#S)Unfz^zxeWehQ?!*o|z8*SK-c(R-+TjPz1Tn=^uW3 zea;Ck?$BI`<>R~{?h_#aJ5&KC=m=h=8uCXal65B&QFFklmi2co>)XfNu||Q~nnwNi zXMxc+$X`8<1cI=OE*G;(4ZOJTNI~xN6@t1N8ZLB{p|asPJjhed!hwQOjZxL}Ei7dF zhgA|JYE@fb>Z8&FTB&cL4!P0F@5)~UNkvy2GKb9Xp)(i|K!skrjuyH81~cz)&Y6#; zNKv7>p%Gx>Y&PK?o#zdBOEz7Rh`gWd%W050pz<1_aZj^Qs9kPLZCwGWdb&{cZ8OAy z^YK*g8FsUFXro?5@F^kx1n1CPMntD)RZcFpB#KSU?(VxShmYs5H7@s2rVEa{$VWbz zIJ^QjzB;I@SdH!i=s7YEuYtv}gvMi*NC+XLe5iyTdkAn6E$#OeSD-`kFe#KS{FJB< z@a`C2)zh+w2^~kGn0S8UNg{nW+{!v#WM6}O?BU7Gb8Y;KF&`{4LaIKLdNkIHxd#8j z-u?@aSu&2r&W*;OBjn){59kfMwy&GuW5fJ>NV8SkD)L(^TE2aMDX7ouzP5v_PZaa$ z2FbOBo?L_eYKcRka;Jc_FI@RU={83}xmSR1qU$D)Y}x&5vd%qf=*G_rSDIO-k(ID>8Cw)Hp)bAO}mbna&Z z!bRS+Mc507t~2<$|6SYw6ads9m+3qR6CSqVMR0WvlgSb1->;2Af<0IX5Mat)VR)6m zJN#hbxXJ4TZqq?1Ovn3pMwltJ=OLU2;Y4uE`tj?yj7A(%A@B+LvXL7-lpPuP6Eb#? zzDX_f?;~Odsm!6te0?_mWxO*2c|4Pr8CR~DI(7QTgt;@%kFDJDRXT6b2#R_s3FkWs zFDBRIJ>noM&ibp$zQFvRc3cx|2147cs+HE8$GTz3N;%0D|EBaVS5|Rd`%aFD6>_@f zUCHoi8qQmuvm}0?eW0w_zcQN)-mibJb;#vp2P`%^=6z>U`(hBlV4+|!(qZ*N+%WTp z$Vh|L2!<+igMIg@|5WMsJ2RZ6Bkw+f>7LV=O7XokmRJJg>Ay z%qeL+3MbNif+03ieg|(9ZLY$){vo1NCvbK;k8CAa*Aqj=4gd8H{{Ms^4zI z8!VQS&Y0jj(fP7@wm*+o6{GEVC=_w1>}h#RTaMWcd$pu%3zbePgSkxvGFzGb0~rmgMuwle||^N(Rw88Og^~GWrV{YIrZWj{@ANUX;ik6`-`Uq$%YQ zlt0FzH33m|^ZEPqs6djU;XNx(%f!uy5kG|n{lLrU4kgY~>KOGfhGNc#{~%SjURhb3 z5sNwB&ZK6@Q)Tq(W-avO#6rC9o9Y@ z25GPOVs>g_1V3nTpLSZG0URL(Xy3G0Vj#VL^s*fuZU+_g4wfxP=6BV+MqSE--?M|}v_BOt3;Sxx5;IRF4vcbH%IXJ%)b2_?BgP)VK?Wp_U?@iN=r%}th8EB9YAF{0tz_;t21wRo+f*Y zcnY6i;1X?gdF>c~{nO3dqHxeADuS4y&oF)?pO1|N2y`PV)^>#hH<$BDVW`exnI}yU zTOAe*B;hg=PYEi1K;eep=*y|SUp&b~mx;_9Q5xLuo=Qce#*z$nQ26YtAMLd2lnhx2 zE!H!oO)H@T-u$ZsAOnT*X8z?zBpJm0(Sx3>(@*TjqoQ$N@Sk^Z=;ly$pvwx9$9}Yp zbTp^a2*O#MvXFLsX9v^5FKZIKuDcHO!@&;W_;Nzdne;I83MtxdmsF=qw@7eGZqKAU zs;M5{y*aKPBW`SXj2aP^I%{bxGNCJVUKCCoq;O25t9TmQV)p$xd;5;+ty?pdhNGibKlxhs$@v#h7wNfufi z*k{*6sI;CcvD|iJ`R1Ms_s|x8J~po~rod7D3vRL6E%SFE^OHjOm#%JS_Uhn8?gjl6 zky0G&UqXBV{9lcWEQ?qRDjs#WrKwKmO2FTO1OpASooY%0DBtP*gV?bR+Xd=HFXCog`pD(Kw z-=45^g}n-Nh8+Bl;hq=!mWSnro#a;8Sum*FqN0}I*Q+R(8Eypn%8?&gIRd}-a37Q5NxzP-q8&iPs z>a|}0b&XRKp=P^PQuLebtc8vU5!i1*roy|u-C^8SuGBpaH;wCD;Mi<_&6|cBq%$^N zKOw0Ept3ohoTX?rGV5HgpKU00C+|J_+Hi*Vv%S)>Sh6Ph@$Q@@mZVRr$&6;*^SnLz zvBf4rZ4CXhOM0u~98*#kFdYM{0?W#6;YU7!R0RePlp^mjBw#(ktZ+;G+b(mv;Au7+ z_Z~;Bo1@J{+5Y0sQUs!tJG*P%I@i>ZZsIShM@afp1KutJegzmt232i=MV;`Pb;9EPir$#PI zA++oGz{b%qJ# zvbE>w(CRM7y_qU)NFR5MGj{k0tAgP%-`~ znd3Nj+IAiYVo5YyE&p&}(4nnWXWsD4{vlEe)L8oa!;=&;#7ZaGJ2ed+HWTTUR_a+* zrlO;@?Q<`Xat`i{=G9xe=5*bVK)RFR138|A-|$zr7};ltC7H5>XUe)oA9(aj5rco~ z=A4WmKoP%_{I@fo=c;L=M@5uKiFvoqf)vIhB%@<=exJTi?@4thvsyNu%N~G`-u1Bx zFu?!)5ODln4JqDde&>#1Hud^$93L zx14NOFaOQs>b@&^kO0#|mz29>CvyxXkFgVQ(>l^zIF3JB`I9@j!E$IM#o|i>9RI$9 zU8ea&Hc9&)T4=93D+M@E1<%6Do(U-0U-G@rNGp}^$$vHd#taDke!(j8E_W6UPMNk~ zw=JMPw1e}UmE1P%?l5a$1799M2cIUYVtvi-GYm4J3WY9<75CG5f_i{CU$D3*Mxud@ zulZh2UAO8#FmZGQ(6(M>bUa)xxHMPlI9jx{I$?>#o*`VU>4J(_C7DeFHJC#Wk0Jm9 z^Gf5tCq8|9eS;x}5_vHu^Sx^Z zIK*>p{5As~LXv8ddGzJ7Z;*{T42CPd?*1(Yn>8o;etCTU$z4^IX5VAozxDQ)P~x55 zR}eibTVVNiRT;T6+=eoFF72>K__z$bmz+ zJq0H`8!#D9hQ5t4chGv@ulj+a(H16TWSvYz*&Uj6@#;9dOWVPIhv<$)MIkM=Qg`?aX>IhU#?IVypJ}AuC*mHGOp&Td`b) z37*(m*l91VG_(T&iJ0Q(ysbj~^X~-ve}I(ld~30Ha|{JBRWwZ3bM#+CV2+XbB6YYa zCZQ>#ix?Hr4I$CIA+pEtRs;8a={qP0-6`!xtVJ@Gi#CCAwSpZf8Kd5maPfH^<&ZcC z50;L+@A0v?yxA=!p=c?aLrVt}QGH5+h7!Nn6>_ztFyZ|?s!LIA(86AD-pG0wj(#s_ zzB5JC7hBf`E@s->YgFZHM6mHH#rAxrgT;-)+!lH@J~(`^Zx5$bV#Q3@(ucL*yYE?Q ziqaN4aC)g5S`!`jzXP0t9;irr%~**UCHSMq7=>A<=%6+$9eJd<9!(GjT}%|*Fs7JZ zKIB%^n@gsKl9T=n)zGmq?8cP7$=5U}kW-!rSsf(2G_}^3whogG3|>U6W+6sps>bNB zYAJ%l;kC>shdLPCw7R;&k_UCzKd#%Nzv+By7u#kD7MLh{*!6+1vB5sw)fBQmV1x!} zNKY9Xnb?anQ61XV>ECW#LhjDW!dD^7TmDh>J(X+^kqZft;NG>fvnTqCmg0W^U7)pc z!1Q`I=U78SkK4h%b#TILFqR%>8X={UiSNtAII(4YQ|N5$T8Z}*op#p;o>BCf&8Wn$ z#cxAddb9`KQU@J@0suUGqjw$Y0=&cnwyQrJlEPT-`@TswZQumyKe8Zd(9Dk zaw%Jw)|4PUKaa1peFOnB;0#9E{z4OlOcF*9lXF&N0 zt}WWv)V8%s{lw=Kd%@3yA*_QV;I#MyP61jM-VuHru8b>e3@!aPVmY!!WO>@CL0`PN zQbPc_VLkKfsBd*!Vp4dewOlN0xr626zc01nqKW~h*##$?j(T0<0qKm@Z7h77S-$s& zCErOAhlU_IzPeXR!xgj3j_U8I#!g<2jasL*N>+A$1a4C`9?w}_)Exo3>v7%rY8BNc1uo_01@ z>Omz@7o2qx{dz@u%k@~Y#SW3>^@Z+SaJ`q*FY$I}{%9;MLIO>D3D1L+LQwF!jXHwD^L!N+ z4D>g1&IB1<6R=kgwP6x;Bz#7=Krj<=;6C?q%6XFfBlY86BW8Po8i`a3B()UN=l~Rn z->IAbl2;n{NOR5`XOL$@e&q`0k#>Bj)Et1OG?er5!nyTV#T#N!Hit)=bIG+ARncO! zSgn{cifqwnbx7%uw_I`S>EQNDrl?F8zF2S~d0!!)Iq}V@!%yojO`$(K`h>mpwqIgDZCt;Kr84ZID$dr6e_4s$3Plewgq{th_ec?R!C z{*>0teuBon!ycqJ57F_ES$D*nO_ArP`_vgQl`v(?u#bfYc|;cawV3Ji8(gtAD)8C8 zb!aq|$c$qpN>*QPrC|d%?v`|+ClfWCIhi(oqAUw6AGkZm$&Vi?OtNZxpp#}#Ug=Z` zMNGD2ZjfX@3Y3}`=b`zE%@bo%!(c3LBv<=vg`Vwt6bYOXLicpWQst{~ReGkQ1MyFZ zpZf)mbj!pNJR@}ass*0;)#ymzox=&p`iO=D`kdbJHa0~q%3-qQUp=67Q5~`{LP0bn zTC{YX9K+Eabf(A&s;RrGFp^US_0+2cH1=qOq3_y}GRhlEXz2fcBm zYXeoP?*q+du1!l4n)%+%I7JGw@FB6xe?_(+RYrDM`*LQnVXaFh;vae^<1_M^-K@U) z&Dw@()86=r!)KBdqDGSlQB}J$6EQQHTTx_MfAyxteY=ZrR57}@%6`k|Z&wj+r+w$D z8)eCw+^@6OpN+3{OaftzH7JqBxB>oNatuU zJYX=9w^dE_;vx#(uk0&=?CDU;>srBxqY;_2gNMXJ@J9!a`TPB6!%kzfKAWMx|IQn) z*K%D_vi}mH{Y{*IhXto@oQ2^0JWTuk^L_@05H(U7FLETgLNh4NA*YKm9^-~E=4$z_ zfoqjl75TFb8aGw`DLca`R%g9Y&}^FR&kLa!H=!H!b-!y7^^X74+n<_TP3m}sQke5_ zVr{>}Obf`l>{V!DE6Qr9fr7C|bd}7&oG0zb-vJOIl#iAz7Z$7Le5}52RHL<3uTo~{ zTdY`%C$o7j@IrVQ`IMRr+1yr3nHO-q%U^DAU$Rtw<=UM=!_f68d`*sL`Nixjrt1IgoSn z3fEJ#_o!{=oBpkvM_rCb)k%q$N@af&mi zu)T_7xg@cP@*V6>H=#axTfA}6Cloblw|@-ecM-ft*LDz}YJQ4NaaP5(GlZo^C*)zfhre4Na#%oQz% zw4o5kKrG72JG-uYKq%LN+5e<@i12&brK>k<>B3a@t);p8aFQEO=90^qvKAW-Z_Sy$ zR-Ar5#kG;wD`4(ia~-#18QXvKLIqfPFxzW#vV#{$C(2%hbL}I{wvK5b0fR@x5>WM3 zy`8`Zm^V48cltKD9U+E+3qa!rg1D&;GKXEH{l10WxpQqydvRS8S*T)swT4k=Z2c}1 zi2Aq&W;GS@OQ#u|1rB{Q)JUx4Y}LlSq1tiLmy4XpLC62u<}ri(&N*CTD$8fuq?5Km z|Mo1Z-h`7klr|yF$L8`K>ytnRmmYZ=_;oU3nb_^|@^Pxq+md_4)4bY<&Yp==uRsGX zUmWq_!z~Sy_vlM2Ax~n&m>gR9t!|N@o|n(|i^dJ+q%lQ1Sm3sk1gZ$~@Yk1oyfB}x z3+ecC(bEq8rEGTeEu2Mg#?XsR;~+V~K!GEOLU*(3oy~H&?fvK9;{6uRWz_(7%Hn`N zSU8U5iXjGM3ModcAWpfkICgP2{FP@Q#(-&<^jl~x>q5yqYRQK3i)y#z(fO^p=*&H-xO^|T5cyc~t zxDBsKXAXDSbiRJs^!kGmXL=8n+w)Gq`mki8hc3dxx2r!}h~;-n zh#!-}p@QC;ab4w4_OWHHd9@FCiYi%QcK`@g=!DkNq*A#z#UQ=q8|{u4#63Zu^B%pU zUZ%2p(;nX1sw@-GiV4b`l#nfrEe!MQ2^X-$9PFkYio@F&l?F)4gjUKUEXL81^yg>~ zH_7v;P{pHhoOEiWfs&qai%hSU=w#MC|7pEFWiXr?(lTgwRm@s3TL{dnmNF7G$%@^z=s=5dTqF|i;Gs=&k?N}i`#r~EBHO~NfpH2(X4-G2-=#^E29ycQ@{|ed zJYUkes>~b>W+e8pKAcF++8ARPU)<*{$i0N?_lh@d)X)tW$s4*$X-_>(`Q%nIR*eiluE~WIU6f}rAKR$t zAP)`l@nfgJ?I`Q}RGtori9AnxieUyugV(Sj>U39^gGI$r!7>Iz)n4+`-6?V84V+%#r_3^(E4mLa{ZUi+@i94!Yg{?8&xMmChNek! z&F!(z_CDrwT?e&ej0tMlSll&QYndLBwQDIzk!YOrYx)u=uiNNJ!=tBi)fK(h{yM&C zt*~wvtHoc$-d;)bdej`E%%{e?+A+bR{c|G8u^vIpyFeY6k;pH7MtxYGgA%SgVtVA+ z9-R2T=}4nxFCw(YoDv7Y*VzmY>2Mb9WO{dS7XCS%e|dlkYACHQ0z!H+>{hUorwdt6 zz`#|JjqKcY8dLJF@ZdxVrV|M=ZxE)%MjrA2)g51=H#{j|^!GoLFsNkMV6sp(Xmbw@J+7F2om!qRCfZ)YXzh3uH_I1ne`vvRX%LNYGU9*&T$7_ zdgfY8gH-B-4teRcxY97vALA1XDa<2d@La@u5ojsGOhXD8_|WZL+znPcS~P6GIryol zK_1(-ck$+CbgyvEsg1yT5uSLv@2VIuZQnt}Y94_yzrAE3m8t;~Sm7f*^OU&QmRw={}APAC^`qe4b;lQ z3QNpXP@sk%9Bj-Buxx=(phCiLm5tl9ykAE?ZDXOdXCSGfHU)Hf@Epmj!!ghjDq6S& zm+aL4bukM*hr$Y7$sv6J&gR~4gMD1WwGDv`xwa3mN@uzmcq6N-mP_|;JG#|PNqlHz z?58nXOeGZ02DKjz+UTugNS{dN%F@Z28o=dB&mnuNP0Z{^Lo{Q)FU>j55%IG_hx z1p0+|S|G?S5jX=UyMYP{dTM`*7*SJeOx@~1;q)|IG3RzERtBY$JJu2PbJafv?-!d9 zP%q?c!%OaljN5=Bm?aE(mn3Z7ltu+npl(`n)%fxp4q6CuW8hI4E#B<*0pG~)mvU8%6ev_jjHuH@}i|N2LeaAb4deOzO(<0?t}T?i;F8kngrb1}im30BDIB z9?dAcd@oi$@SgA!w|!WsCHxwHA>oksl#a5ClUkRPd0)xLDcV99UxFY{)if!bmFO{~ zmFV-o*fN`xvr@?{Jhmz=mVHNo!}X?`9ZiZi-`a#M7Pt6y9V409?z2{(#ZteVn>y5a zu0qNHZa6lqmuL38;NEH5JXz#lAlyBikvZFuXCNu>8BHzrs2@{PYHb)}#qT>!&8|1&ZGVn8NB>^{1r7T0J2xNS{WBoghof*! z@;YB3s3r?{7z$^NDb!iR2}}_bR)4=drB}C+Sf0?g`*7^*KVj^XHTsSl)stg&0Gp{E zqzGiNalTNoB0b!T(UBtZX3grH&oSz^9mi^O(4t7Rgg=L2JNhH=oLHeNLKYM8oWkp* zk@It`9omlCogqcqoG5J;+Rh$D?Cdxw;J^69yHuqa)gJ+~(u; z_)F;!QQ#0v!0W+LY2UJNMz|b~Zsp(8w{y0og&hKdUia978#o+jZRWW|`g*ht#!EwBb{K9ySKum~^cJj4hX%&hmnsuVxdc~u!Ch$6R`;;Ia+xF5@Ap>>0exx+R z{@AR*ioXnk@1W4{z~Sh_mYC_2PPbjsrsjn4UnPfs5dHoE+@QFmnAJm|A?Jq-z&ORd zCmYi*d$W=Vk$*OsubSm5;D)Cl2)53~*QI;?6WCa1_8U+r*D9Pa82Y%J_QRSYDmnaV zG9-oUUC?OobgTVyR<%*&FXs60@Yo9jwIXS#bNqlw3{D38ydxJet`YfnH9#;L0F{xb zO8cleD;Kd-q<2{cjF*6~az?;c8Sqr1@^1j}BvKVz&^9C@@yJ`9`iO+p`DjEU%4rSw znEp8wk@der5&t6)fyy70-^bG#jaG#*A#NR~J`G+UhnNrRVIPpZ;(hFit3W2`0}|Zg zs~QB_UKRc!1mXC95`y^h|2_hNUi-g^K;ZJ91^%PNZi}r$xXD?0^&ch~EB2-;4Vl`& z2I+=UHQXpY+-Z@iMX}RjwnM?@5w79!JL9!2;poaitwm|B6J;zscB}xEX-R*XixqNqr_2#uSd%?ekNj{q$sTr=S1yK=%KujQaW_k@g zjp9x<=slq_rq>A}`hD(X(`~A9tuW!l<2LCmp&#aJ6bS1`R!l#4+hU2W2~WZDsLD|aHs@AcdY-2t2p zfk#mv)%3OK_Bk`r>8F1Yw-l}K0J9>PZf4fNgDA#aleS+n?TBVYC!(>|b2D_7IE4V? z4pH30I<9DO6Uc;X$*r(rrgSB61pwok3(1=n>0rD;|02EtP)0?%&8E=?Vr*FRquNVaan_Sibh5gphK0Ex(qd2S1fse;w^vis;qir4)ry*- zbHgy68*qg$Ry9XGI7U4%KkqKXj5K}Qpnnnb*aJnn<;alH24t`Yuls#fCTpE#p93qf zLPe_F>Ffv10OG9mQc)|>IJrxb(U_cxMq~pQ4EC2QX`U5`SZ7Hj^jV=%`h9T*z0W$s zv?ITj(l@s=$#e5`t|b7$T->T}>aFVFR#mUli^zzp)UbzdQOD0y$IbV8Dwm;u5$Zb~ zKUF4U12Wk05B$E`2;X&P*L@KrTT=vamLoc_QEwA4&jPsC1@roVs<_Nm@J%-z;ePrT z@g4wOQ?gCQ24t{`PuRx`X!0U_XW8e#R-L2r)p>3v=BU?NVAM}2YB2zv1JbpLn6t## z;CzZ6MO1lis`9)70?s()0C)jS$%g>~Fc3n~$ni=2B000000C)joU}Rum&-us0z`!Z?%i>=drw<1M<7NhAa2Ei6w+1o* z0C)jy(qq8pN(=?yGnusS^?gj`MpS;|+D(Fu!IPIP4Cma3Hg zmqdGK1Ts<_(gq?g> zPVq|2;5Y;?F zQgcf}+4qR%eYsy)HhG$Ip;$O9waYyKOuNCN}4zAJ))OjHWd*isoV(RY6rncDOv%wN%#(6zBF>$YoHD zTcDMeHKZGIUwu^1yc~MDaUKpScJ`GvSw)3Gd#60C)jC!2=AHVE_QYXWRU3eaNp4O;UwYIQMw(hY$u{mscTX|bE+fLgHdnNk`N7ymg@xe(s zSGsstaaSEzH`hGZR=4PW;9)#7JRiK}y<@z)e3GxTZ=7$pKkhH?pXfgt&;x@5Pl8o~ zJA+R{dZ<-sUDy#W67C+J8(tN@82%ASL<&WAM1|<6=*w7(*v5G2`1ttFggenbF(mOZ zSs}SJ6-W(8ZAmNXQRy@3-2U&j9udWsdqjgmzg zC%uwg@@%D+GDz91{7~&`P&L$=YA3ayI!fKBUQ<755slZ1X?wIAdTD*0zTXHNBaMUq zo&+U91JDtS0Q13GZ~&YEkHJ?MgbXYOYryuf51b5_!A5XTGg<&L*%zoCW3<*O+4yY@QcyS}ecMuFZ=+UgC%go0s*Uwt1U>ru@<& zFB{5U)x$%}5%=VxL$ZW2FpYanz*;SW1Cd zoFT4eYT_UkS6PC$nJkFK-JIeFQO9$0Q&+MLh{Y=+$jiwFV)5A+smln09J5J)iyi1# w1=re4371U5b_;_(00bZff+hzb8;wM>qO9-Y zE{c*cN>NlVjq#;RJi_r33n?2Z&d&f3vW8;+nLltVd{Q~Asxer|vFZqY2rfk;@0phOE2Ez!~? zqpBsP6ecp1)CMb1zQ|YX_-R-;rtNm2&xH%bYEDeKCO9L&{oB;+c19Q^9nVywhh&G8V#0Dtq?Shje0%pUYu7F5#60|W-}u&! z0S*p+x0da-@(L8tSTTN%K6au6JK3|hCG&{K-oz~8MI%LIF(M+R$CaU@7Y zf%0cn4_9fM)32(o&YG&x!qtg7eVt3RWXiZ)YPLe_TSa$-V0!(x(=ClDp9e&z?;QQ9 zP#fc2aEiXV`IV0a6fN{r=mqSQ!S>+Z1 zuPixuI0-Vd!}y7<;#4b3FC02yMp)ePL;y~Y5Sq7JM!?&1$Z5-V7$Me$J5^p-tV7gV z`JCgPkG%4T>mV-%`8MgTG1TM(ue<@}S?&y!JPCGT}FfzM)~j$ZNkj*CyTsg$ynLXnQPS}Z+PYvpK4X!YKo}VG!i$X#vF0fcsiFq zop-@SOP1r(v&*iy>Y6)o7gpSJKdt7CKRmFO9_E$xCV1Lep_^y)@{WGion?VD;K%!( zo8?Ue%K1QtEIQ@1GdT+Z6E#`n6-!q3Z(Y+GBQ;=Z)T||4$}5*$an-f&LBeo=MUI0= znVLa(_S|{#(}>Ce`9GnY-hzmAD7@a~x(0u{CL(a__wJ&O7hQ zcPMPgum^|IIk^s`)*TghVZ}Z7ZSpreww?$FtZ(cjQpAB=&-Z*xX})DHIr)y3k@OLI zp3BwoDwkaOQ+3-s!^R5jdz0#r|Dc(ee>W*|1pnk|ZK^Z+@9g_S?@1RFbj=ut9c&FfsvYCh#eF1mOG&S=G{rRk9sAVmf}=fNKtwdciE zV)2xcpMvynQ)Qp0i*JEgjQQ@AP?cn;ltU-#B=gthmsrl9R?NpI_3S>S&JIS}(_&nQ zG*w`k4V=0B)AP=?Ptmv5{IY6EO*3hjVazj)J0(pyr}NU6iVFi=B-g`V4RIqv0|%jn zz)28dLJWIXkgXKp?4piLn*la679?0PD85?nUW!G@rjuv*u zeInTtMS(iN0i40W0$@Xit&EmK1EUC%Hzt-PlzWLoj208l6(9lxD1ZRyXQomS9;lN`jcGZl*f**#kJh062qT2+?dK#?f*} z@&+(~096#B*Eq@;;6&rCT0m zC}0@bh|nOAnOzYmB+xE($2dJOw#MOXv6ne`J{)VPPpbFA1M5Re4XDegd;VDHI1Lfc z!mm)`K=u&;TmkU-C)is62;}DmegQAv+Xs*VKMv3jE4xHsnB zqJUFm>lw=&%2O`7;f0TWLzQwK7srF~@N!`pu8g#doQ$rFsZ65Gkxl*m8}MN=qe}^P z<4#+0(@US2!|6nhjJS-{nRQ->%3pbgkhA$OXMnr{@&t%ybpOBnf5FeG$JsKZOA)}G z!lN&LzN-w0;zMvf;7-7Ev7|BD4f6~;IX?UK^A%Wh%4uhuRj9~0=Us5ol4Zq8#%+U@ zDzoYj53G5pyn3d@kYM@!XUv}b0-(MM_ziH%qk#)f1z^4x7&kNP`az4@8VFyCl(1q7 zbt($4jJi4Wvm%$2FP^|N*?O@cR=7^`ooT;xFbamnl@1r8%#}wd7B7+A0uL<7^VxnQZwA*4r1=8T1&KWsM$=;9*d!B9Fb#LP{54&7wm6zZsk2? zLuBeCEqgaA$(?O8jZQ4=fzSNfH?Av3cDP`J1O}{Isf~r@Y~fQ4}ni4 zXR$0q=R9#B@5E@2-g2m-iE+&Q%ZW&I_q&%l;r+x)C5CZZ#E}DwXDS+l1BMuz(cUAa z62B?`hDVZ`|3bUE&4?QfFw8Ii_2F;#2Tt8|e_BFy<^-0w_v^U4EYt*FxbI#5>H)gT_Oxbn*=2Km!(EEtZw_N8j z$+IjV0=*Y)(f8!?6%_f3W}T zY`Qv+Ey}qzCyu+3Z@3H@qq+~P%mXcrmr+SE`WsA^joT*nsF8rA`u{c1crG`(*tO21 zUQ)xnn7x)|Why0+ecV$&mJkH}Ve!FzZ3OOr8i4!H(Ga1(xPvaCQ%(;SEC(xT)lOF( zqe^rh6?q9!$&$9XJYqn>ee6@tFbazCk@%>B1*e?z{&nBnLkHE!Dq2mucVh?j0Oi_< zQLlv3)Hq7M@PrLf@BRGeObE9$gT{Vj<=Ieot#dqKkgoy2uL`)Le>hrPkje|D}h z54r=VR^35o+Szwkd)@dnbjV5x7|y`a;t1MU`xH3ERv1agu6f0{Vs?$tM4rTq`7T3G zJ~&>Z%T@K&|Dbz&^D0=*?PnS#1hG11)bktZ^2@K|;Sj_cL&RC&_vi_F6A! zc{wF>G+|oKu&8Pc^URa4kY;UBVu@(s;Tf0+ZlKNB&5&g|%%)!D%a>|?S#^ec22r&R zda&=lUN~y&;o0@WVH8De8=XO#H3Fgw$lm_7!mStviZ*`LO(T zo}@O)S=2os_he@0A4Dred1*nHTYi_n2)rbNK09`(O<`%X@^Zbn8uN ze(Rb*A5~=zFCsclf{?f|ob`n*S!txiGyHMFktaJ^&3j-#Ansc;f1zan4QH5xI?!cN zYW-TDMY*xi)6E^6zpV85Nnqz@gQGpGV?YB%jT*Vl^y{Z{jtB{IAGyLp7wzDnQ*;Al zDT;$^X;Y9uprE*>!zeCZ*kb(4a_8iV=r8ZL)#~`JUQjUBsA7@1HgIw$IMc?z{j>3$&*}xq;VHixt2sR$tcjQ;m_kC2IMU_PY!0=QEssh0Df7}GSWb>Xc zZXjCgc?b+C)|G{VT-vPL-s(Nk{6^0_!A1!*T7C==XafO8GJ9-Ctw5@=FB>c*1$cx( zan2A8>l}d7gKcoWNsjhWMLDX%Xs$=Bj4f0o1GZn(ZHtOBq&CLn*>{L())f@)s7~%W zic}!>qq^SsE=&w_gAC0PPgvBG@X*kxE%~A^^Z&8@U|hnEZ$IFV<`zSE>%`e>te+6` zfLmKeS$6v;>>u?d^pL-XVjt_nxfH zYyWNI&UvbtTe-s&_fWw85W0b}gzAL(7|&bW+O6W0va71afJlz9wiJXhgJoka)iu@m zQqyaf&5cB(VY@RGt+qXg(R}LlC(IGVh)D>Hx@+RqCZly+%pf?c8iJt2d@~s=<>}G(EW|2!SenpdZN!!>XSSxoOW9B=Av< z>>|&)6M%|_gQAkK*z5k3wSw8p3y;=Zca%t}^ zbzolZV8kS}i=tJUx~}(K9?5HMEW3jah!71n&|<{4A8-mY*MDJm$YwWiIK zNQ^j0)QAm%>fS#mO|_gyD2e1!1J1;#S(`(#nqQN$qMheDJ>+LIffl&18S5{hzVK!y zUqe<%x)~)Y8pC#+2YCK@6ym+y43U*@mi&>L^0XI0pVGy_L10h&0Hsl6QBuT>(fRq- zobv8jA2b5Qn_`^24g&kXN=P4S*Htn0-e=P3R6?(s#pJ*eNl z-XK-`iE-*Uu|Bjj2#baF`P3Mat9J$~x+>YQjSxs1eRgY}BfD59ce-C}=rv_VK*>++ zNP^jLv=GRwTuepP!^B*?4WnpkBon2=x-nvwAFXEkh;cT~!PNJ&2@DRVIFM`!`;9`3 zp(zXrp*TFiXP~N4Viw+*Ryj4EgHmAqi1(Z(wDMy|^|NvI#{Ndo3c}AJXvu(#L-OvflpXv(4(VDP_NsUOXs#mkw0p%!m zx2|VBJLf>Y?7CQ70NB}2FP9!Kv%fOEK!?AgR>RYPBo}6#P%T+0(R@s}SpF&aD!s;S zUIYENz)u+P!w)?O)HejGnFE>xrG9Xqa{`_CL3|IbNEY&6c5BjA9^z)u^k0NGm^H~l z?v1)7bvMkwPm*GPDA>2OJ?L2%Q)IxQu4e`XeHL z3gCGurEw?+jkHm7Dam<-xu_ffjk?$8xy|Qv9jEcPw@^4)6}`N;=gty8@5&|c;Ni*J z_qe0FysCqSIdBS|p|NhTABhRwL`UJu8h(0&kdjsq26NE(f>0a1IBh%$S;E-enLtl4 zDby*ygd{)OzAh;dpm^AyZnH|w=R6dazJ%{ZH=Z+26T@XDO%t2TbaiU{;Yfm#2f-LR zIH|M+*c*XV+>r%lJJ~~_$=?lF3>v5;8C+D+5dTN4WgZw8>XV{N$CI>uG(4w>k&M%u zUR^@-Xl;WrPRVSWE!45quv749r3k z?F4yQN^p3YKjOi*dRhV{EV9TSM#J`6pcbENWjko&2;*U2mh~Dnk5*Ii@j-q;P_M8H zUx`<-NXc%aq{8$)cqO5Zt@jZ7)yhAfXedU*hiHj8p!Ue2Ae4a{U#2%lv$7^M`~e|H z{fEr#AL$Zx8n@EruL1*k<(-l}ioyG2(Hv3)du~^|VlsmN(~3Rg-$pg!Fo|K zj6FnYKfgVviV~*|Nk(*fV_IwdY9Bwnb4OhF*a^1rDOV}Aqbg16w>PEib z!>MEXxY0x`66f9cjZ*lpo_{&+w3zHWpnWUT?qbFzl_dTk8_%EFC-ErtFwhfP;g5nx z>r3=W*3EAb0bBh~kYX6;H@$eeH0(*;0ZLEQF*4{$2MdyrVmkxmjOQ`pXc5s-S-4FA zSg~#@Y?u}@m4az`Ez`8uBf)={ zD;tnLEmIgtGmTuhkfyK3Mjp+DHwPRz<=EAnq<`@3_*A2y-c1Rvoe9h6F8VG_`i8<) zP4Y#8eJ1*uPh0Tkn^qf85xU({tjv0e8RE~itk+&|nMzgrgY&hO@_?&%#Qp&$kuf7pVTL!N=p!Py5Gl!9xS5=7Q0MNXZB64WX>WD$Bd?EW2Ikj%) zQ*a4ZfL-TBE#tH10lBE6J`a|{69x1*PUB^pMs@4W5_!VECB0_yuYfA76g-JfS|Vi6 z0a9Lft1Oz!19mIy3k(tV-1=>BL9)vXIN|w}fF`SL)3iD2d8*F#evf1`$ zDHsz(Q3FZ)-GjkCCvnbT75P$5I(82ER&U7~Vorxpoceh+GpGX{UB{gjiaP3y)rGZ3 zqG6PH)Zw1qzyOLs-9?U{z{@;;*pVpaI|>*fg+rHoBCujOTYBIdz14`_QS<#}X$2ZV zSJp;`0gQ;t_pe<4glF%Io>A~aCWOSK65u4w8K@%PD9FU7kbh2?x`25Y46+k)D&|lV zI`)LHxKkj4RY!G&!A?Tjfa_PihAtF|^%c8(0be+m&{J8~hBdRNle|%!j~zw}E2L@6 zkYGr0I>)LnyjFk?p^}EM1116YVj$-l4?Enor-Kgm31!6|1}PMiu_5v5!>k;Mz96q~ zzdopD%M@w;7y2e9(*1=ZAB$H%rl^epXK68hHSTI=8a9Xg%H&fIQ%&Wiu8aJ01%D7O z2kE$l#st*%pjKIt`d;_K1;-^|-U zj5A%;eiF67`m5}dN#_O0OAc1diUw>Dr5qy#;RK?84S=Up)bqMi+sbcU-oqI4K{L>& z3rGa(((cZ2S_cjlLL(!VP=n>IJc%~iw>fD^M%CwASCtua8)xP~-m~f7lV^Uo0kBHo9c)3Madh&L)?G}fhd~qsi+1Zm_(v1be zo@~+3^y||pOSBm8lz>WP3hE*?hzSz(DS>#foaN89_&zM1j~o=+_CmW7 zc&5ht2ct=Z-PQE#eN`1IhG%O${-!lDhFYi}>K|Fe5KPEPsTIMP2iD>nc8ZZm^s=L- zrd0%^3hdm5=rq`;D$W@wBVNhR$o*{vrTdcwOtT05fRkEOGYicEcnNUM^)cT;{ZBDgdBiA&}8>JvL($YXQ!w5%lSFrD@4778`?)&ZG7z;FWMN zBoNlPfz2z1O85)n)#qb-6hsKNcCr!lW0>2@kGCX6K(n?Wl2u zeKKKIkhrj40cWw_(F8k#kLV*62*>UqjDeva;z9bS884qz@Qh1H0aJr-_>m( zB31Dq)n!q;=pMz%Zxct`>cPi}tz~~6+f0VFqbN{Ll~_2@43h7as9$?GM5ge|Ej z3e~QXH@}g7s_Wz%%uT#wwu>VBQD*6wPpA#KN>Nw(3pAHzb{DCGNqRl=#bP~3_;1yG zCsTSu`o>xBSW{ZPj*awpXpWs|)Y%o=pREW zL!tMbU9EswSUPXU!q~V3Q#_p5feH1Vy;+Hpu_$kMCzHMV_J<#2g@DPiK}w_WBKN!f z?k+!cR7q%bLK@954W>Z z`iJ-xk?*JQL+I2^B7YVTA_CHa(LvPKFO<9aKTU2YFffdnEm}YqQAt*3Npwwj(IywN z8@tI}CM+?rvobrbVKPmC=3r^^cuP#(k^0SURCiX5gG69Td{cF{%9D6ToYjr)^eB{w z?q$`k|BO0F@s`)RQln53x}R0E2DUvFy4$nCx}hMFnJ6`oB$AP+Z8WcC#9Nie>`Kx$ zQ&arL6+ohs`o*T##Y`z!o-X)44NN|tU@hME3k{_W(~oYxvJO|#=jW7*QvmN`kd*sjRTl$Gxp@9*!L1I+Vk!0oc-Ieef}mqo;lozYSE$l^uy!;&iwTUov;eE_u(6=6IXPm0Upp7 zX4gvnqO%D$b{;0!2tjV~wuH!aL|A~c$mY-KOwNMH)!*h6TkaR1e!|XWZ zF4lXBEQ?-w9_V@L6q-b0i}gMQO4R(^wW~>4*etSIo5^6Gr5EPjznqYTokUhE^O^H8 z>W<|kXGZ|aagDizI0X|w2PGRtl0S{&CcT?k?!qBhxDt$Zo0_18+-hI}gH6l24fWlz zN}$suJ1ts04H)N7pqQSXQ0Nb{8(}cwb$5io0GMB!8S1dtQbp6n{(zsBow}x*3s89K z79iH_Z`d`kI3gvBHzyf(_7jD_DvGrzg5Gv>PC}qUpflBqXZFbm*jul+0ZQW0#vGUe z%d>DH#PsIOFXw7AfJkD9Eii)KdqW&VurcT$48Q?s(LswA90A-TmUX(!6X#Z2WE z!erQ(5#6F{q^WD@xi6R&Qi*c|K=S*q7b;u3fy6W2P#)P?fjnJ@P2>GLNylZU(aye) z9UoKH3rp;+-B+ft{V)ZDJ&B)gV~>Avmg!Xue|$`=6$U~V_+VfK>@{S4{;3Ln!83-s zV8}dI3Kd}?N8_3>6g7w!3Z|NeQCE}-!Mon}FqbtgvErau5wKKs$^V#|R@i5JRk@EubUhCD4O_#V|G6sV6+h-!nO$ z);0zBBzOzBs0(9RKF0z3@Ylazwg_9bmQ|;CC2Qno68_7 z7I-N8OX2)qnQi6waa+0#?ip~KwanQ^?POD@{BD8mj_Gzd`eu_Q*{EjBr zr`rQt;X#yWpV8hj|1x3}_Z;}|QB1~;o!s!x#;&2d&)`+TW(1}$f_rIJyB6t5A<1BSsBdlX#NO>T|HC!{YzG-i=ueFxHp{KTQ z8rgAwlmiOKN}7dhfdvpwg(tmLU4~C^P#qjTLarnq`g#114M26JhPkGCpfFey$#9)y z3pM{gF$1GvpPQ^r@9-Iv4UcA7J!F=#k`_rOHMGdw%rM{qJN2xT)l17#4ERlEu-no| zd*}PhAayX7>PfQlaML@kaS$8nRPUnr6$eo4L%e{_a}Ix-N<7U|>~JUfabX@dhaR!n z%k-MEFY6@*s13!$AVEayhX&oK>scYL$JER^*R+~SZszGkzgX7F8o|||bC=n}jPjgW z9+r(0Jdi#G44=4PmN{`rOj8A*Q@#&CYn8vjmGE;2u7d5)973Vz&XC3eP;>oY9^ry0 z(UslNP54++1>K>y+{1!bUQNm%T$S?LEKkr-ooFN%sCr(WiT>P)ZnE9jn3c5Y(s9we z3T$~zdY0x3_MNr%Z7Rr@b2G3R6r5pC4WWou&s2nFe(4nILPwrr^RyX#oO2zoBMcrw zycQ3_-s(yeEUV_jK==7NH72ddXX|yr z`W_cdIy#L&J(yYH4J98(7{VU6&9Q(h$_cXKRd9>Mil$gR`E|g!D;i{#R4-O0nm@@- zm46Iy+(7I28nJR#gn;2Ew+4{X|Ip0M+~!TAQ{o-lK7}-g?oMcvXb=Sl>m%s-f%i#_ zb#n}lc9+0=#2)l?3XO0D6v<=xS&#EMo`tP|6(m@T!f_TY{6gTs3;3ffy+2z(^~t7q zk`=+6no?90hxuX|vbdf&sbsi;-fL|BejJEo91$-)Dv~*WcwrJ?R^ux zeM#v|y3JrOR+kqa35xd}hvu+Q&P+_PD^@iIK0~rk zX>Rw$tM55cwUK#?(?I8YNUn%pP)ZELmleP99aSNyZ+(;55{K{448mx5LcxzC^n6tS z(s1`W+08CX?CIss^pu_9qIqGPhT9k4(I^^k@&AFv*Eevo>X7mtNlBvwuJXVEFD>D z<`ZiwyNtm06VvK!{^kn78??%pBv{Wtf^`Wr5(q%a-83KElccy;C)*jBlUy}MpuyD! zZYVEpa!(q7Mv*I?n(8*z1lZtWGQofumu3K8dGaoCpadl zLe|<;zh>G{`#Lx*9cj@0#2TMaxkZkFL8+DQv=g_2*IJVUTb^iiMk)st4W=K-c3jdm zD7$m*%8LXR3e73Dl2>!*0l_7Qv)7qqSf2GfSM7`3osk;2hqv{bCc%3EGAz$CIwQ4k z9~ZAQ@7_c{AN=Dt5m}lL@REj)gcbS+#eAuOHc!W4y{g)rhn87Aj}y{5-KM|{ucQ=&$*x}F!MOijm*}zOeQGx(hq0N=3K$na#+Z4rZ~VrFbb11x zl^(F(w987#%SGSs<&OJHuR3lEc*TXu?CPbOG22hWz`7HWYI!wptX~+@l$Lp81G-ao zy{-FuEtzt8Gd~#57wyC>Z{}lH#2p{&9&do+mnZ}E&Gi#w$9J6XUB6?$xGvfZ^!cF$ zGrc$aCK3*TbdL=#@e-wzd2j=C#ia}$%;vlG3w-IGhRgoynAE@!Hgm0QjX8VmRQ3Xf zxsSHBZL1ST`GU;V^(60$UZY3%bYt@&FpjpNxq9#YzA-)I2^+ex_U4kXT|LI^-uAtZ zUi7t}sOjjaXCK9a1^H04mcTboB1+K7EFo4&B=8rZ8w3pC+ABWy_@%vn2a-ns;A?+k zDFeWderorBw12J~+Z-jpkpBlGQvv&H4>SOd&$W#FmAnpspTXmQKAQ!j0Nt4S$Fn+) znT#UKeT!3vvR*UhdYx_s8y&|S91E$LfucH=P1UAmD3cf>G^T!PTxmGOe?>7-UBrv= zVyxID8re10TZ%QFj`>5UHs)Our#q(%?ika>%|t(% zgwlT`L2Kl8Q#M5{e<}S@QC{4I)9pdqd(7}+3+w+3Z10@wm$}==4fjOe4vG9mI!>W5 z>C=+^EKlBub)!wFb%@Q)W!{nY_cmr@USfY>TtCs~dS`b%i}3uH%+|EsC*4l2_9@Id zB=X#rF29(OW~F&~K38N6 zros9v%clGu%{r&&Q9|oWW;P*H8%K8>#dT-jpTbtMWBHTm9@;%bdTYVyX5O93w0U&8 zAdl-i#u*~Sbg4@oF1eM-n>PXdC}4gvyxp_V8&c&$H91qS#!gjwv)69W4fbu?fq zVh-A=2$%Soai`+#qIxO;m#-azi&Rc{0y{C0TFE;P5G_KGsjtk;>?TCKgslV`GpkXh zd^?(QxDg1fti;2zxFf(O^2fdozN{jTn+u5P+| z`k80Cdj8D(nC`at0088O0|21^1Rn4|_WuqbAQ|{SSV`?4Dqt^!3ZO>yf3}K%0LuS? zjp`(v|A+d23_3sq-~urJPd)!r008s9wH3ey;0165m;v1XV^{$n|6|+%9ss-lJe>av z#tmQxaQ-J;|H=Q%BLAEFAH@5g|NkEm0Fcy_Rr`OA{NE4`U}_2AAO&!21E{%iX3yg% zEH-seY`MAwIt5d33b+YaG6_A#JF4~vofCo7XauxS{_>0}y`~IVQ)AwCYT2He(!)v` z`tKC33ZET$c}`uDIP7{T^Xv!UHMe}@Zd5NebE01RDu+kZx^8)uV1+H$!C;cd zeCM6q`Fto+8C>M|v1}|sJSVFe092W&V{pQv&Q+fF8KSrudSaw>xy^v{_>ArBUXM1% z7`{H0Iix$i*~={H+s2oxqCp-6PL3Rnj&3rb&yj zNtO^2T4>7F)3&kteCCTHGTnj5=q@g%(+*uasXPPLk+5Txe!Q=dj+ zgjX`C)>x;$gmpP@4zW>uUPL@c>mbKDwW-}N_S}JbE962##(Hg|0VJv_l4mrY0SkhtqX;nj8Xy&L=KtKYr>S&EdU5Q%N*)5c{+PFze0I^5QVa zXpvsW@auNB4B_hi?_R0K={Kt3x6qu*lFTt)J8A15t=^AvaYnhs{$%^53k>FXgl1A^ z!SkFCBY3NJ?*Gud`@b!GyRuyrwtRT^oR+qg8~iRxW*m^O6g&ETsT}o1f*^T#yNt0p z3B$t}zjTj#TRS4fqM?4!aeAXv8C#2Z;|j+^y3zEROD#E$@&;_1e}LBV%^LZWKt=^S z#d?ayrK35k`9Qg0)FPtcfZYTQJUBTXi}DA_q3QYl_u-DLV3VhpyFU^4<5zLa1pRB` zzuA96)rLyPPFx3Axdjv4kj&0&x73u4y~#xi8Ql80ihn^WKjhPUamQH%SyI?M7PWIt zf-I>uvX?*;^(h;)EitSGauX%D0we`DvtnUbt?F7$GCU4jhhyWQsn~{>_}Bq ziLG3cMm8I!k}zf9o*8s1N5P$uOp{A#g(q2^2B-VUr;HLL&Gp}Nk0jRDaMy<#Fj8ws zY$495Lz;O;EWk-pkc3nhvAtGt$@ufiwzM71jJq~DD_mU+SDNvyBxlcb4uxw}Kk6+u zoG3$empbAy{N9S)d@+k&L?)u$gKnDeQY3EU?;4&fX-8;x)l4U)(5)P@HYX8s)6{si zct&@DhURZ@n5ZGeE0?xDikT8GtEuF+e?O6hhS}ms&9@&T;un;+YI7E!voP@y^h+~y z^R~T3Dt(mn-J4QdkfYm7p_@GDL2ldieP*QUQui1#oG^~hx<=PG9>ZQS?#y6Kt#keP z15_m5(kuUaMoP#UEmt0e5Y9nv6xkH}8ke4UkF^?(84$cz`eX0!oG1A2?x4|02n1lzz7k%v?SdkNg+2lJ?bmDcam~fJC=L@7V zn_j{cwC7V15~;J^g9Gt6$gF4%;`S_OEYV+?N-KV}sqTw>o?N}Fru;&g09px5^bfHI zL>Wi-h&{$#8XgHxu%Tt5p>1^6&6UeZ$;!Kz`eZ6!=%S0H+a%a5OVON{D^GE?N*~uH zH29@kiH|Nq(UqoW{yF;iY`ny!`@`93*+KbzZ>;aRuy2ed+keXb-S}i)>y&rQo47Jt znY5*eV22++j8meoith74a_Awc*P{BXUy}HePbHpkB(e0fPvrJF;iy?#}tRZ>~;+-uU;3M$6z9Zt6HSoE~2NTKCncNXW8 zo=fL;VOvu>*|BJXOaE^yOh!vnM<>S#=~Xk$VlA$cLt$KsAk*EUR@QIxpDT?X*(!LH z^~sdJ2vhIT>esknyu6%|FQGn2BXs&p5ac7JFp?yTGSUnWC~j)ay|Wy@d{jKpX*?W>eWo*R@d=>@8UZtF7=uL_{GN5V4^^S+Zfd)cQ@=Wz zeyfT##(FH9(xKL`ZaF-XdJCp{n23V{9eDP8!{o6Cy>w^_UaInK8t*uz3oKem~C=)mF04$cIiQBkw3A@_{_)VQ3onhg-(+WdUA^EjA{ zc5q#fStE7P<>kY)UUHv>DQnuN9(MxFMjEt1nV$(0Ix&+z&*@;08Gs0vCM-7_k7f1$ zJ95CQgpKCytn7a!G6^X#Jq&qmn1{&tpSt?FG0n<%j|$~hQLJ*(>*dqFds$_FD&4x7 zCvAe)s`=@YV4np5maiQs2nSm?a$RUC17Zp5+G{VIN&r!xHZ14l4G{Y)A8wp|&MTv=p>j(97Z#nIL?8OOaYtGSE zA$>4`S1-v=evc!7E2dF+V+>VUlx;+C7@YEP6hSJ&8N9W~&idHQ7G9l6YiTeXIZ-gu zvf36u^>sok0n^u=d8+)Ts-q zNCOXo=_9w}dK#m^3r&`D;K| zR1oo2R_U7MGj4X*G=jZ7>EQ6WR%WXmDSO~Q5m1u|WVEK*6Wbioc7{^Jo83fr>S`uD zO!u6(Q3K6Js&Vi97??K@-lizt57YvCY7%6v(YEuuhlrS}{?+D`y_jtVcqI&Yq62U5 zvSfr@rrHW0M^cN^Y<@pAk<_clJTBc)@s(|%-g6deA1|eU`-n(&H*mJ--ZLiv7tvHK z)||pPLB2eKfah|)jiUUjv`wb3bk(35)WqhIUw2&6Vc$ss#i>~0>{9zOS+N#hvSda* z2ne7`Vbyf}MNWD#Y#q0a#wgJgisXI+IY@!Om0$3qo}mjGv^4iF*D&kOL+V zGp+KqFLl!Wm$odMvsRK9b;Av(6%pkAck{3PNmhM8x+rsj>t!_E-wJzxA}A zMW5AYQ_Bl?E@aWPHTB#1o_`6EVil~F-}){)8T`Z*zPN{jHgtmV0s847+))To@+>|& zv`-dnLAp(gjvdNUU;&?D5?2;@hdQ%>T}C{>-h@g5`L%6&ZhA*##9P>2fm6@PD&ZEw zv^}US?JoJzM}o(4zz89`Y2aLrs1TomT%UAq!gQSo z&#hMaOQ`A;^q~gZ47(1IO;Qb=4W8a+{g>M689GxgDhljrU?AA65$@^?5=P2;?y?NohMqzU! z%>=vU#BtHmBCb;!tx)kSW^CyJEF;4zOf77)3L*1^L9Xt0c*WA|%H?F9qL{rWdVLlU z8l5==34N3gCDI%%6e+4N1SD$kcd>Mza;4-_don{^O4e8DS&y*vYNur0_;15UE%`x~ z0JEGXWD^nWFy z^^~2vhD4NMaZA79sggzY1_6vY9lO#Mu(J@ndJa|dwcTRNJ2;*BgV3(%H6TG6Jg2%E zPFb2WjR=@AnD4&gQ3%Oau}$e9G#nFKaf6{q7?KSzedfDN9y8bPwJRWR6EkxO0es88 zP+JG~rl>_vi54y|OS)T6P0|0O9(fNfJRGY5U%7VcTANCu;+rf-OnsRweS{#1`-;t& zBZ=Hs`Xb`fLY3=#2ZI6_<6oUXH`84j0c04H&S51gnaYaSS}`qv7TTToC0bear*VrGB$7)*5FTiNIVf zg&7}qsAr}RCfh6|u>LIJ{MJp*5%so_wKLUh$Is~<=%NzOkOCv$>{nSLsq6JG-XuZ> z(YK@JUx3oZ;s@Ug8roL(9{Qcb2lxHuBO>C`+|S+{PF40UEL|diOI{<3)ARqX_5|qa z7AEoVd+B~PAzMwi^`Nl?U@M0kwXLE*am*@`lfLU=<0(s(HivShU4Xw(Qk#-3!lExV z7u20tyKg<|l z)F(Bqr|jO>@)%_b^NXgv7*p>Y7!yNzUNv^|KUAv-lt#;@%%(TWwL~^eJ@l@_kMf`M z$>~h7vnzqU^qg^=Buz09JeeoMMErGCIHy$yd3m390-*4vaCw%O>$PAAPUL8vIWChP zw2cF|8MM)b&1NyX4i>Alzp{>`Y+fvdE`b9sOSTwM6Nzc4Kn8>mVYJuYH@G1@1q_Q_FAKy-a&obKD@N7U%Q^W(#c zZHA9$_{mA5jLOx`1woZwuk`ny9;4@+6ON9#t7%pGW}Qu&zub?nAEi=JuK1Mv6poHX zPD_h>0i|t5$aP|%gYLVUaVqPtBMPV@4ZTE6Ew7r^QPjmJI7X1?ua6Te$HvI=)SmqJ z73i*!MZo2L7O~~@BsG53w-8}0f?F#g_D&=O3j!|X=<4iJ5)GQ%ed8^~1)4emiI-HN z4i|(Zz^ef70z#e@13h|Rh(THmsqesb5M_k zm_mG>PbYCShe57(If8-#gEYN+SO)%3o&6`|tX?N}`bhXyK+a0HoP^vauL%=Yanw4_ zb~+o)PUF2`*+C64sqiI<> zL++RKw1P3Wt_#s8!bdMgnt~imjD~yXydLbAv@gDQ+o(Vx+0fC7975NMhoL4t))}RT zLAP)QkR}-sf=?3M>fn=NzY?|rLxs{Aa$1e2{XnUdh&iGQ`zAga=*hDOzMsfN zmxOKxlbWxF-8L|s{lxBP9*qw+v zhV>L2IGPgIKwU-ul39RszCvy@OHH-opW#?cE zuZdZJ>+F)clZ?#{L^(7Z;Rq!fFW)rH2c#TCt8vCqZy9s=#otPgl#C({>u;|t$fnT8 zp-Q76+>z}GVXO?MANf+^mr|1F7g$Jl@j?T6=54hKg(9o%Og4Tur2A_#1?2g1*%Des z&ugI~c*-K^2l060b>%>dH+K5A!5CO6lhEvRMy_-c0?tn|nHZ6C;Yof(HmBgdz#EIY)I^AC2^=MJ)WL3M zksNLFbXg>rSyduXvabL+)5vdK(sDURDqBl#pygtwlWplEbqOXe#P|wEeKn#wU9Ach zu!;JTgOzww-8Y%{hZL2@6h_p>i6aMT{}JzLd(RVqBEcirz^QOfKUS=eJUJ#QGV!3H zQF^xtcjgyBjq$D&QcEKaX@G2o0zb)C-*=2e8hVnOkh*CaU74v%AzD6_Ez6Pb;!WZl zd*MMojKs5T9wJWIMq}v-=#O8d$zo*(&qgoUSTtr z*GLZ$;Gw)=O&g zOJOh1mP`aE=aqlkiwG{98|H6xqD=;*2vX9nl7mI*QN;fyk^y2Sj9wa(49=d~xtxo& zsEb5zvc1hf9|ZqZl(<%cY|`JZkD*=yqiQDBzXu}(OQYc5&66bdV*4!jZgoY@@>NtP zh7hv0Lp2_Kse8A;Kph35kXyX`in64rR9UPe!o5!qK3o@iWa4@@(mls$9= z5e>nkQhuAp>&z28aMRDnL|ziQbkYXw#rr0u)ZG_ zoanp?B7rT^6?#}d3Y!i!otHIKr(BWFo)$2&_Od$Z=CVaP$?Ll@fSQcZ&X2Btf^5OJ z%!>hSvuy7*l7`INdJED=hx^slT&=E8mpdCzCXR!51mj!>5bs?ywNfl(1eya*3>(ws zA++J)(Yyt}i9Vule%WUKV96)9o;fLBG@NgiMyqBaD{tAo&k<(%&gUilrf?<&iL<$Vj(bYn7%vUsF@U$@6Yz9DFHi!F`JcyC&3Gh#qv0?Q#md{7%>E? zfx6+rVymc(>c15zEi^4m*IdY_glaK2@vfeGNuR<+Qocl7=5VO4dW3g7YYCTuXO7LV+=^a2nR36xuWUgi#K1esBZV`xFz+rEn?_d8!0y zp4lfE#XFOQ_m+<0dV>`}#eU#%al+Oh?+9 zQ{g0LrN)guQ0*_GCRi(|ld9-W+)@?{9^8O>Tb5sBSQWmDINB~=HuSX!r*;F7txE-V z$&!0Nl%h!1vR-^0{kVH4dDq1n;cxy_EUWPr`Wc3U?lov!Kt#Tsn?sb)s`JdUFSBUI z8vBPXPGN1bSe_nED(fxRR)B`d1R3G7tfjA8z*fs*PJk{;Z-KTlLOoopO^7Yf;&lBe zSjw0&a>X4r4ypk`!#al`Kx@408Ni3T*_t;QHeZVyAn?N7ai~z zu}SDBJ@n^34)V6fnuLr1RWH%Wl@+J5i8xjyKUNM$qlNZk*tElC0-i)DJXfekG{9Xe z9bz2HWW;=}m8M-z2g=V=#`|LcXRJYsv?7ld$0X>;PLa`Gx=gRIwf+nLw|QQ0(uz;J0me66U?7F1*1ul6+yD!VX=Tr1h`V?gu1F>ll_j~O=n62Fk6K~}F( zsmnr6fd)6l4LXiAF5YXYjN1CQIp5q?m2B{;)QXJ>`X6~CrFae-b$b6b9;UApHXaaB zK$GUvDmUA{iNhu6$f1GozWBunJw#`q0*99Lk3V_;0FM6kx5j6uXx7477avRW0CCc2 z@0>JqF8qjr7^4zCj*pWCSH(Jv5`x1jl@KvP2bjrfq}9@#PW1auaO!EqPlLsc(XZ12 zB@GVV1rA_A)4Cs6Z!#i+2Y(Jb3yQK9nT{v{SOn{-hB)Rt{~X2r*6l&s`ODoK_ux}u zw6d5BbbQ-{v*+1VSQ_(4wsWBl=$H0vxQ5<6Snad0I>N(bk4 zii+(yHQY48?G2+;t0o`nIb>8<3=Dhg-Z5K82U8gF=PkfT%MCe6M)E2xXufq{|}$bb% z$IRbz2pLcen=(AdC*StBCA9=g&wm<`8^HcfQUAc@u1aBD{?Io&v8@rHh!yEBC0uA< ztoV@)03g2u>__&6-${gwUz2J3G9@gi7=%|_Z$|3y>@W&8bqS?hpD8h&NMlJCl#^SO zJ0iVCMvr?AM8nH48)qB*E%4lC3X3iI0xxd~ZzGWHr62D=!V2(WpRhW~zZauhAvk0H z{Btlf7UOOb1J64P_{WtWmoCATG|%pj5s3Rdaa-gg<^&6URu-7-s1hBsn&Xt$p-}>5 z!vxGAM4N6->54o<5;7JEH!5ml&@%T5UZ8k%xyRc*Z68c8f$y8f)RnM4Bs9*pUGAc* zOFU06;gi1j-5ev;>}_6WWoZ8z4LAqUnMSR`o;C&I6wR}LUK zymYDAdizOAc^P;?D-pPIw{ZEc+t3^3(2eIC=JSbxlAeHG!MRuPS1coFk2$}Dh5s`P zi#U~6_s+kfnKsytmP~55-t9YK)F+WMb2506x-gKa9*&iCWaqa-?Rg0q=ApYEoC1IR zYf~OuqECNcl-Ug+Qki3iHv)ER1Y-dnBUB_u1Qd2w()HXyse$B|V+G%az5t=VC2GMi zS-CnbQYrmg?{+j?gr5gP44V^vaPKt3M0|3w;hFFb$7eQ-Wd_~2 zSZn{~j&-evi?3oa>j<~#{dM#=tRcwUl9Ix5Hcv;?+OS~uSTkm(LTyPEr$Jaj%!=)M zS=4^rB^cNzxZjp7B-$Q0C|nqO_U-~1I&%Gt+hM{qHt@}qi7029n{tU@ro@0K?AU3} zn!V_iF*ZFqfJevC-XkClNL;jHBcQeKTU_?qWL-tZUVg2@r6t3t0IrnaqQBpnK0Og9 z6}Rk>4jYa81Kl*-Q6@b}g_j33_HP%4khb9$N2{*vI(<)kB_QqM_5ih)yCQreA!j5c z*k}4x*kLcoFCaPQzd(h8fWDJF!-@!srw^S|(f*v)A($;g)4x)H_lb#*$c&ej;fty~ z3XZT1dY=Mwu+I^hy%A~nSGvDbvLi|>2)E8ZvOJV{{gZ2+NCn$CgTuNo)8gzTROM!H z(5U~bHxVlTavaF5&;1$c9!4vUnmzAw>%#6X`IsIrsxg~k5mMd(_lO>`$_k2gBIZ@L zGZMU}EliO)Hc`xXOyB`l!f>a*QV@ozSd5GNp|A?I-d9?25C7v%L@L4HIf*3x*%+FE#nai3ZqT6zf_Q zd8uB?K{*1U;cR>Ii#QK$FJ(Mlr0EBC{_r>3WAHXF@9SF@Yp!IJbE6=fE1n1z%Fn=V z!2y3sHId&DZaFEMupwc=60nQk9=_U+LiM)H*56|=%7&&CHMizKV3`;?dh`onhMda8 zt@VB7;?r%U7(vPobCB*5AZ;=8u{#1dm@Ukskl9`TBMvRwRcrgtd4>R<57d2I~JvcCBAyG;Rb(RDwA<-@>|fg`_dBb9PmFf#<);hBhQTW{hM%}fIgrUJ&M9)Eo+Is_dcnGKYN zxFw8_H`0BD$mz?vq3;Bzb?g@4_D{6ACWWcRkq`UxF{@}d2eEm&@~~bBFHNQp@({uklK$VD;CXlGZYpCZNdm#SaBdsKR;@&#M7G z^^al1X30y8xLKv9I7rk22XukB9q8n#Gu@B^{Kwn5>zC>>j0ref=>e-LS2#yM*&2ud zxZP2=4%#_(S;%~tXnxRrp&vEyK*2GvL@sx1R^p}yyAFcm!|gIyguUsOJN>pxD;ney z>2|(IU4Xsx4}nW}zxL0p3l4M9?E=`a7=Er>`0gS2=?qReQWN~+D)hw`m$}Eoy4_^e zurN&rlWNUpB0+;U?W~QfKZ}#Vr2W(u^(L_nb5#}w2}~wZT2N;wenJwCJq>B_$S7Cw z*!hE-_DRR_lY6)Mh2nd^EtA+`HXEq&TJgfDlp&NTsLQIn9UouLc&}=?5_%0hthsQ3 zr2S2p3hvHLHyM@q_-M&rM8jO~7vI})VNefDFd+RFriiT-h=M-7H1!6VWm?am5UcuS zG%**Le?fBZg6E^4YB!eH3(f7)#q;2PStW))93dQgHOODw~3toXiZ z&VhqL&-Je7@ljBLDGlyf6z$~S1gIQ`3=vG|mP=fc>A-Q7W;1P>;YR9n1RN`hyl>^& z;;)F$k8fb*jGqr}w}RwrnU>SW`2Q2wA}B?Dgyd88!iIaylI**|tOsp2&l~j9TZDzC;UulTR@+ zMgFfW*}IZhr7Cr5IW_yhr0u8_vf?xglyko1eZ}~$?R}f)z~ArQiI|q4JdCM2c?ZNs z97{Gh7fpYWf78XhxZa&p&8vI|&NiJs$Eg?91W29fSqA~R_0^_@SgbYVw11dlqg9`4 zdMil>W|aP7@Ej30o)w~X^CwLB_{oXUk0FW;GzROES0ruMVpY{z!@R3*Fv)boo71;t zN1IAJnzs@dx;rlHg^w(%ghwfCpo`To{F-BL@4Y|yUw0gngh%WP*%t(kxUTv!3OU3k z?G97TCY~iK53-*^07(KZi>F9e;FP0h9}K0%-#m6b_fqwMxs;nT1=CW!=kL{~ZhX%>sz ze9V>0Q_1~@Qj5M#ZeZd-8bWphI<5D%TAHqcDPA#ZAHp+&I_PN7V$l9!p0HkjrKz&r z&BFa$5tME~B?}iP)PnYv%_RMTt9NqrwwBH?`D(x64NdpbMc$UG@wNaR^Iz?hFhhl` zd9`mw)V1`mEIVnVP}aR%xjU3JNzgPz9VWbG{uuuq56BseP%6kAZNIGpq#gNftBAz{ zEcRHiW5=gDMRdlrtIs_C?V@SwZ`LGbrKF*MD)u5i)CA!QJ-ysIZXI4yd9S6AeSWh z2Dl0QJ__;vN+fLh8sS#dOOcCb{wciTUQLU`J>yJ6X+4MbSI_92W|(dq5H+XWE4baE zLuOGTxo`+$l%Ni%v#zO5`<2hI?vFN^-=={yuB}u>Cz{z23FCb;7G+24tZ0C`c==53 z!!K6RBy%;b$ost3b+{uE5Qs_+_lOQ2dWMY|CjtKj4;~D~w*}n_V0&bTdvWt7Ro}E1{YfKul(xv3puo)nmLre}0fD zM0%(d#SZ+}oV)kVTiDrm%okf(;UYoF(s82Xpd)Ms?<g%iQpVL`)V{qAJWT7sG_))yvc6V<_=G+QV#y|<-v$!b`{LSlvUEGCY(AQ zQD6aYC|Lb6veqKzX|dDK(3D>K!=9>SSJ=b56nZqwE(bf`b|_5*hb}q$4<^#FHoix8 zQT#M9^~V1@w0GbR6z_6~*#;2YQd2iOl? zVVcd05ECJMouRSCw66_Ahie}JJ5cAdh+uUG_wY(Z_Q_d48CEkFXbGm>bl!&kb_Y#8 zJu;fYDcgIOPI4I<^7U#dRs8IxW3}ft5ckgX&?!x(c_r~lX9*fxRUjI?yFat5sl+o( z8uQyD;5d~B*tz#~gt^cqIAt1 zGM!0_P_e#|lp(qU{Gdm|b^3$1IQ`UKwD+PJ`M7wr$1x-U%Tr@ve_$>$Y6P(>GJjMJ z-}Ud$8rQ_v;EnBv)$;bg@NVnpNoTb4D|lsgRY8q3*uT*XQ=%@D+z_`_$X~PQC{R>+ zx#nXTv5e%%&dy3`&2lA95e^(gl1JhIP3AeVXQ=1!$UQy4{r&On<V5_bMzu zUcpKu8;S4)Z^p)hxXe{e$A^VI93ue~M;l6k1z@=y4lRW(w76Tr)iVQ-6V$ECeU z?_p7vCB2RE){wx&m2qKUyv}Ft$6Zm(cr@LhxA0Q<2#QXao7C+4ymXyVZm+$(yfpJ) zqgYFDL~ex_gU}{k4Lg+i$C%-EWr}-rdIjIr(}$9`G{LOGx!UMGV!o_ML)-j4um6m`^|Cug|Pfvy->F5SB7Gdz;QE;PO}+K zQA&nymjbBPzJD#OA0-H`@POKvAk}7pd3adCa0g$AM#McYpzbqD5DquziM_X7M#*uv zn0@(rgg7QPyssk2b|2IUrQ;;4{BD7I9#KC9{CGg?cwHX>GyaD6)8X4q3?LGQdv#vb zv4iBbqZy`-Dv5?KyDIYHU*YbGj}Z!Walc>kgSYsR7Mp}421q(X`-FLVCZ-eyCGOUoC^9Z*8D?c`Hh5kNBu|COYZ znzG`gZoP@Of6KsD>90q!o8t%Zok%02Y6*2x-KP| zcFtw2dg+im1`&>>T`mug)EyGV2$Y1CtZ6RrUhoUi(q2186W-exlSY3y!r~Dv2`Iy) z!>IepUTQJEaI4gW1~UEC+MO8WlyY6sq092Ss9pnpiOh2v8;0kuE(J`C=IRJ?JQI$1 zb|z+4*4@59xqYkV+zzrk1M+=E!{t)>X0MYv3*`f|kt|gi&ib%mwp{`QX3qr_Zo8Q2Rl>Y3h zVqAh$ayAPWV4czN2ziq-5w*WJ{4)!1WVJ`Br0W;BeRnOT9pyB9t7Rhn`L8e}LGgk* zUMf7Q&XZV_$M=|PFA5MPi0&W_>g)qS{h#p%X{+*VM|9QAXZ$Nl(I4(<|CkE`B16=Q zB+$W-1rl974JL)NfwHs(FrcLwJ(=~u#WF^kBp_OPUCT*%lafX88MBhMn3CiAPaJNp2>dMRjj_0N z>4_woe5g5{mFlLo9-^t~XH1rB2}LxXDwZ?7P2SKFNlKM_$AUv!lQIUUa;UDL0G{%^ zq{9f-O#L!5*Q1(i;B{Q4R+WDER5b0XLRdNgWe(TA=-7EH4vdiu5X_x48D!j*I@&U% zzoH|x%K@JKxE{llyCIQd@jJrQO#@$gK^Mz%W^2z-aCPrnVb{Ix?}1!!2fB7^$cr5J zePVwxh;+Fv=IzdB0@@`)XHH#tFQtS`S4-n$npGRdC4wH0k3z2G#Y-8ajh!+|f)r`% z6?hRdJQ97=8aT=A7P&VMBjZhA}LN8 zynI21(PG(7f_s@?H2Fc9X*geja@o7X$$4=pN-Xs8HmX73><$l%d5#*mY6w2vcXmf! z@6Oo`Q-8fJ5VdqT)6>L8c(FD1_tG7Ntk%dSs|IAu4z&^7xpEslwUHacuqY*gT%w~^ zu?R!!kNP-2ocTeVS&{^<1+%n~^JwwU3vWs6#ToToq5d3vlpwh*_b}LvDW=A|yeaG% z1RP&=PUmm$T<)G4fQ&Bn0{Nb6;Zo3y6}+L}?tmQ3#63@6Gq%&r_4G zNl?v>pwI>TX-4&Z^dJnFr!;~_!mQ*2L~^HMvVtWO zrO0n@%AJynDEgDAPTytubn`bMjbjvKcg(QC%!eseYp6@|@}W#A}VD+a@jOIEe0JN8%x41dde3}XIi8DYgIBfQ!|g|M=ou?fxan^ZB{>2 zG<}3_l@a-mYMu5)_T5sp>@S)uHnBp#Pn=H!u9OBL?y%&gGC(eb({b4jx22|2n;%{% z`IAYe8h^X%D(fL?nMl(bu4nhc`E5^wNNdyLKzt7EykGRyF8m@- zX7jktHzOlyUmwX!&70c8W(>}A+2LwBsIkK(ivGFo6`u(yuHt10AlBg?ER&rr1|_sxB0W|K!$otb;(k3Ob4K~NdC!J1TI@2J zyNtdPVPm>92&Qia!t!jHkwG|UF?FoS#Fl~ZkT66_#|B#Gt_$qJ zzBtiW%P5-q>Zpk`AtC|Wi4#RHuF^r-wvlxI^+vow(vNNfMc>gS=@^ymMzsjTPYc2} z#uH$rqg?5kgO(%H<_a<;)0ECL2=5IGuTC&2rvLKiO%ziLt)VD}t}Wb1bB~+Rm=%t8 zi?$in$UN28?ug598CFAjN^*0NhkC!wSr>gU$fyF{v+#CC&-Lj@|9M65FRaiCaIr9j zqMi@QhwQoJxvkOAK;tFI;(HV1MDE!IQ~%=2$y`b(7}=Md@Mz*R z(M+)dLZPDNevx4y_;Hx`#`r+sE>j0na=)8tZCVy>>H`~VU^|aoAF)^7AF!R2JMRta zvQ4bifD%;@G# zwipJlmixX+7!MsAwR_PhyEWsEsSflZ;A&_}>dxlD15$7mF$0-9AnYqbGzE`hV4M^8 zCEV~wc|$DFjOmj`KAmooW}peu9y7N*PF+1Ms5I>9D|rek7c5<^+I}yA*gdS03c(jrBfJ%UZtNO8ClNQN#topdhS}r`^zuH8@=nb z6+V?-sk7kkM*8&fwhpfHGi$?G0d!dQqf>CPH8cvysvl`jj@nq5>8Tu2%vBD>_fJ9$ z!pl94YmXN(M1$&WdpNV2AMF_2mqyF0@eWNSxRutI`rNUp-Z0CZ1NcO^QW?eUJGj{0 zr3Vd(>2Sgo79=+gqkTaluzs#u`+c~i5&FUGYzR4mt&)1s&Rm{?u< zreEj-2Ss_%fV%@qtYGk;^Sre`kPlcT`rVXSmITpL<@yFTab{hJa7V`~RGz-!wqeAh v#g4%>=-%`rNTT$Q3+IGsv=@uepU+g& - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.ttf b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.ttf deleted file mode 100644 index 7b25f3ce940cbba3001420d38b7d0f12fb7f2142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32652 zcmbt-2YeL8+yBh&-d%d`QXv6ymm>)!At4ozF1>dGNE3*J-g~d1_uf%D!es>{K_Ms| z!61l$h@dE-QS2h*_Ws|Qy}g3GzxVff|F@snIy?K!GtWG2o|z+*5E6o&M9fVaHEyCy zk$xj&l%7N5}{>D=%lnTSMRa>HFn5YHbE9MHG_vnB_E2pN!$>&$_; z;a8}iO31*6xUM*G=$HvJySLwl=R@%QaYKgp>szbTg1Yn@gECJJ?K@$F7$p3I>rTjT z9@cm00ORn)eSi=7sd2>c(PJD#Nq@jIg*_iJYQTsw+n1FPGQ1J4za%>LOsu4{5s~PL zF9{&QWTYHmG?_wb+5(I=Qq1;xzW3$(z+z$}jk9e+a&*2>u5LGeL2yBgb-T%uK=7ul zQx699;KL93egS{T0qUJVey|C~{Gfn8QmR`lCW~mI)I>!K&7c;slD)QYCR6!YDWm}p z1yNC`V7KdR&)?A*>{EsDFHFJ&doQ6^p3sX3WV_=}I+@oXfF!>HIDY`=&w$hG{HkVK zZbkpmO{RJQaHdqJRxwRX&rFR7)5pfs9(w{mx|lVjMvWm^bdwbR{N1EFb-KUy8orSy zg$PzXqbXlfme|B(S@07Xj)Y{Jq1YxGZ9c^)O|*ul>DZ2jR~Swg(;&9jO;9${pYzxb zC5=ZR*8y!bi6P5WXafLXfQCvVE{xg*M>0U?NRGmjC{~a10Sx#lw(`kkWFl&HvPs3Z z^1Q9E_b;~jC(AzWhyF%e5bhamA;mTyqb-c*jVQJeqpb|TQ-Q&60qoWcOQ;1YO=Kx8 z92i2f;>se}m1pgiwR=i^8>30ecUabe`gB;{;gd&=AG~O{d@J>7tURL|l^nWp0ey23 z-LCXuX_2yZfs!Lw>6;))GR%=8ne>}URg$CD-WS#K)hZl|i&$1iA=a0n*VkwZC}w*j z+smQURa?O*mvvvo8f`JfHtgfsUastVf=Z>wC&b5Rq-SPjq=iRBgj>_&t+D#>um}kk zVR}QjH3N^+!XnaAGsWzg8$SQ|)SfkaPaK~&YW%dhwEBVem)~Dqc)eidyxD8%_&27d zHMq9pozKF)yc=0^Wy$Wz!*V9}8^3kXzN?|9PMIE^TeNl>`c$stN8N1QSrSO1NIXd= zHOK_Dt|F=@YIU{Z!pa&K)Z z8CFh_8Od^%Xl2ODN=~UBnx2`K8WE0)T4UogB6%${GScIL0h*p^=1o957brErDjnBqZ%ITP%Av#Eu)+D7Am94t?nST-(@j z%bV{0;PBk+H67Y2Q)g{+?EPnS!^YpV96|S$nLKOUQt`V!%R8oYt^0bn;pi!ENfu(~ zJjbYV9G#Qn09eLj?BO%%8r=$IIsF>B=PFf%HTuEC1P)~jO14S7@k2tgBK3l3Fos4% z8sZa#xf6ex8Nc#`FJ01kZ2a7bB|_V8=yuwv$)piVy7FyjWt#GEf1i;p4pE2`O5#yw z)=Op5FhMXRWQK%hqzghqRzygMkTv$#ISCt22-#cSOqla@ywLb-{t4u%yL3su`~Ez5HYLmE}?ZL-Y1I7+DLL4n=g*O$z{-UZx37FL;1BAH7k#LFv#1Gl~THN zjQFDmqA(`M(B67id)q|L?!ql5s|n1`lqPJYYn4HT${@P7Pz*e*q|;9h(|stZymF7G zLsI&XNLG?8xr7KSlrStOaMlv0pO@Q9I@(XU*KGEpJu3!WVsOL>F+!kl3^Z>dkQFj@ zLBP0ehD8We%FxF`%sS*<4mmcCTtoXstC%qWGX~BKUEfTpp2egU2sAc+dCgI;y*8?5 z-<10GQ>xXiixNT{vqdA9grO(_wf2zHDb*vbG%bId&}ZvZeG-8r8jW7)hh7+n@6}Yl z=!Y-*Y5a*ZE7k}7jIzlEH@KBt#&v~S7zJyrAZ8dt(o#c06L`Ncm^h!wlKk$KJh?C3 z`{~DfV!@ncOJ@lS7A=@73PY6>${7gyw7+QsT0^<6oD2N%i<|e9TO|)}JVZVA1H9Y1 z_o0zE;nD#vod%a%*&sUByQO4VbO9s_BD)El!fMiG#H9(h3zbDeNO|eng1zTii}Zy2 zO+&3CNo%#vUIN!ucBHFBn@}u^#z^)hqfz#C-#0SZB!@>D)$ds{sKyr{V=8hsLa9Yc zD{Vrbjp)2^^ui4VRJ?t;1ZvGB;mf%~%JglWN3Gnl_~NtA^S@BOP`UxSUXBv+A3ztc zNsK_$JW#87SzMH51VI8hUn9x#r-b&Dw-Gv0PG)Dl2_0n%^rG}YBYG6%yd3WWT@HP)AIySUk2Kt z9ca}LoS?bd5?-1BXA7*Z)K_A#Qm9<63fQ2LQl{m|K6-yVl>>Pu27I`ccWIhNEhd9F z@6x40d#jBg# zORkU0hCs?7G9=4U?wdM86uSv*n~GTrgt;Es3`}~1PlQ^+Eh5BmNO&0fOngFG1k*XV zC@~nWwh(@>zn3^T@B9zH-#Pt<>9A?}xS6ZA&6(J^x^PFhc|aLmPxQA4 zn^xv$R00;~0RD2id=f@1;CXIc{9iRd`@4A$YQWncH3)Zu382flu7JvLt6nm=z$F5goH%va3SIsd>Dhxh${#l# zD8JDL_NH_t-KVpU7}cfGk-Nv&tStccTZ0DTfPFnlRblt)=e#Kx_H{} zpi-QD*GEFP(h~8OuG#bBx-#ow(2xWTmt%1 z0(y`~lZsIZcp?WU@Ro)Aa4QkEaHAaSi7aO);aV0{O-+*!nWn|@MY+zInhCU(jDB;} zTu1R|_L-yljwm@@^wYXc&)2P*J!`e{!_fJ2@6BB(r4QYoQvHMRAKriP!MKyvQ}z!z ze(P50j!7HWKU=y?ikd%W_<{xZ7Be2+-{BCS@p@Jy*(wgXxuexG6jcsowG=~HKVgOo z5&2oD7m0c?b(jerRRtw54T#r>QG+SmNOaZ=aEZ872tG}l7VFm9(P!F;oZ+A3-TFtd zDeqQH`0g*|=bl?CZk;%3^)g{b<4#i^}TlYm2}b>hTrvc znRrM16clA3aRgl+iUUWYtL@RdJ$M6(W9kHwc&GHF*pMZ$+75fsb|!n~ku&05sihkh zZr?Fjbj3CugM~wqAx7H=i(N|h3k#`uQkl0>nOg){S~~s|$Dysups%-A>*6K5%xG&f zYwKv2x*(HiCY@x-$ou;%`udSbEXss z-yZw$`p%)vPdlyUjpG+~n%{e9?)V`+cAmeSe|Z0p_Uo08o#r!OAEdmdzo}aXuHTRh zB(_vlH}L_)KCFj}#d2_}4{M1)JsSdwf=A2&++~s0YW*3L%zQNigU`Bz6_a6?`EyBm_cR3ZeQ4b~h`O zY54j}0k@8x$jDsOV(H4z;EAVl+s|m19=dAeVtuGmpvV`M3rG9|meYi5-H+Cet9vE) zxw8JffPi~+%F};n|3fc+3u>QTdw4}!tw#N^8|YuZDUbJd?)do1E-J3BTF-v-(fuQI zE?s|K$@}Y>vg&lAb#y}N1G*$_v!?4Ye6s$c2Xgg{9DF6_E?~MVaZ#=8$8R!n6`>X~Rw{~D>{}O{6B73dNoVb? z>C3Fb-^B$3f| zlSx)LS52v&X0oW}7q`u=6qis&EOG1rPGi|e@BZ|3O#g8Ul*h_>T4&xS`%fq z?e~>9W|#|b!w9Sfx~^0_N+FR@G$ey)0@sGkFC^@vn@-Y-+vqms_L=LK?*0Abrp~rk zxpcATRprudK^O935e;*6envwDhA{?76Ap<}v)~k^NfwuW<}c|PdBNS}CNG<0^wQRh zvX2LF(9EC-sY$$VUm$!{+D}|%PZGupJM5)fbhfQZqVxO7_`WZx{~u^w_7%8(=tbV_ z`)*^8Q8`lz**C>c>|2V&dG=aDKVi0gD*ILtzBLKdaTnAPL*D$asN;XKhvW*Xbghtl zB)CFM1)=AWdKKE@AeZ;3e;i0BwxW;#h02mDMOp<53@9h%Fwr61ZK3>ala-Qn0=j0z zLmClNl&Rc1eV*PwHDqUoa#%2)8kD<-reB^;o6|v0Zc>Z#tKt~{r}A}5P1G*#ZZdwYD&}joVLdn6$$rF zqxpL4Z1$zXC`Lc;V>cc!h|sQi;jeTV^Rm+D_@W|Y#akJ$fIh)#FsY`##o^Pajw^_a z!vQ#`h3*c3Hcm6CPA=7zmnHh2esS&gZ$%4cjbBA|wio|gE4g=J>f*KYowTjfar}%? zzv88Na>HBuq?ZrYxX9Qo9Mgf zbM)i%^Ym-=yYg2GQkVc$*V^xl26=GENKXu|{hlvAGz zRHWg`kADq*p**0$b|(25FJ>LY4`WNMWxp_PviLCvgo-JS0u4Eu;UxQuTnu}&W=J!) zYy&9*Mc_iP@2yTLn_!{2MMBx9G+6ojZ)G3tw(*^JmMNQsT6V~#KQ7+*Zp(@Vvo?!> zYN*3crw9JRNi3l9u~tOOvC)OHPN+;!K};G{8X?J|5BI;Cyre3$J+lXkgqP8vGsMB} zV0`l5cr^p9blyZN%~q~7Yv;nP4Y)13a`Nak@fsb&aC=?(w96+G{|Is6cfWG_bBbRi z!|!wDz7xL~QIi-k2Ei}XSJsu`?iHQU7U8VPD?6RrEMZ;3sH#~;PdO<2^Pa)PQG{ph zxHw`+*BfAFQ&qc3un4D={io?Se^K96vuT&B_F*((*}fg?l{-Rf`+GXu{hN80QtfL4 zgdbKS&F1XbpoV1H7u^V#uh7 zr^>-Sx{R73LDwmXr<5cqM;G$^XI;ovl(`s~+K)0rNNrgc8s@^3mw55=KxwkZ16!=S z=!wA)OA;XaR6mGG+D{e7-L$95L*eA19dEy@vz5kPRh}CKDtsf}FOA=N_|R7IOI9!F z?~)xb=t&Kk7?{1I_FgXq&r1@ySR0|t`48UCmGv|MqidhpAMUq*cg-Q?KWC0KlwXGs z{ZG7(P9E>Y7Q7g!SJ&kF0F$bW#|NX+26G-S`r(tZUOfcz0}v3I1rQ>$Fve-62?p%a z=(pu6Q}a$*wo=SDrZz*XH#92Z$do_EkP{V#fxF>wZa2gCqPXJOM zP$kEYS7Ui;3L2!KN(P+zJthd#gaLHQ9mTIm@w+R0E__)!-2Om_5m&JCyP*6@DBqVf zQp@)$QloVbLYF1N?K$`zbnb5Kt26LVGTDz2^bAWlttmEmaaXKR`c(XT%a-NRtgTDf z_f{$w1b_Vu^sQI|*E#cIdUhgDR~sq-@yWDi!T;1LWj>v#d;HIY^@iiDoJtsLr~$Y| zNF+82&RR$7OYn7qIx5+OJ~o~0AEw3lDi`Q%{#AHUkeeoB@ZSS|X3cmi?4kH*29yb3 zI!T##`m}z=vu5k{EX0D;7jBEtkkE$`y!w!v)Qe>bn+K8zAJH+U;Iwe}pFBvbPN!84 zNGFsE!WZ_+C{1$Yif|aB7S1sjj}E8#9#X37m_KKI=@4=Cx^)bOn$j(LN2lN|D`Af5 zU`l&pG)Nu3f?t|@mW~8t>_=eA9_u1^wkgWjcrBhu^P$jje~{W>{Ie37C`VRir@YIQQ;Z&1}fClF@JGd)u#2`sB!%k^SZsjy^l?#0@E4@$b6X zxVNd|0c>egV9313c9jHYnvDu>s1NgFV5(43tcB zh>4F%8BENtBbgr-T^ZrKzhDGi_@H3rg7@2XJ~DT;V0xxpUollr>>n>uZYp-&hgbJ2 ziTkgjt=~Xfm7uN4ljgFqLJS~KyD4|QX#l%)8;`C8JqW%+3=$#M0**IN@EB^-f&e1( zAE+4T{sTSy2N6Queye>B>&BfO_LcHt%r;@9Zy^iDm=jwlXS)^(uxrQZ;}zMV@2W1-(uT;27oy z1pau&TX=bh(ZSQ9+eQMv7$1k@LyauRGR4DZ*1P1?$>9b2eTSd>;HQH1^K9)q9?V-W z#Q#H+X9?-g$(THv{>*T^cq{#N130WedII*}f#GoAI9K-JIA&U;rh9SlG{7~*UykzO zF3qUqBd4N1je>>kwgq9ldbpV6P&FqsOivw57mE=Mj(m8uEqo*fo18sL~6sMFnS{_G$|*ieIiDqiFYl4ReON-8*2Gw$NhG74!4J z6OU@3Ees6z;o)om?9qV(h5PH*^GnX?{^p}c;(=wu51llv_04^A)Uwjfz<3{}i})Kb zUY1lOv*p;hct$M zLV3Fw)t*GBm2#h$0)lfC}nauL@;Gi@!&CD!a=KIrglb$x7e3o_<3ux}} z?s@SA1>*bbl&SU%;ghi=`m`x!(HsI{Vt62Qb`jBbb!B~E5W_xHbLzyt7dRTdN;`z=Q|e^Tu}Y-QY{*jRJU&T+O>(`IHk0t-SE8t_-(<%BFnJvfiDr~_x{a# z(ZC)KI~D;5_j`DmpvgUQ>g3qqu!AKHSF=UW>f! zg}Frhpbt79|Jwy~PVeV-!Z39fBD!!)K|w#-{(;hi-n>o!oT$vvlhWSfX@8}*eIcOT zj8^LmXuZ8z8njw7sZB!B63B|T7C|GQz@^7{S@Mt`UOmjKs=OqP7`3YMdWV4+!$6Gu zA{rObj54VY>vRx~yzhZecsSR~FzqK2O%n+r!ztAno?$hmTVol)(ptLlm%iRWmKg^!NCULe()u=r4$KFWN1RpHW@(US+-Q-!l7n@WF>YN1xVFQHZ@(oyzz z_9dpOc-6|QBAO8AuzOe--1Y=F@b~OhfY`fR(bx1-E_ie+saD=*&u#^v(64$x%SZ=Q z!O-PimjlX`XLJtQ4Rz8vCoc`NngH|^anP3Betst6m}n*}b`GqFXu)$Fg*~Qzz3eM$ zn)qPlUFB)vp2bUc?_0cJuaK}!S*To90=K?cOjApJkKFm{y!_Q2z_wWFBURwAMUi20 zs4AaB-ToV|KFF<54N#6bjpK3zvsTw}CCEb;@`#LlNm8r25ZXG8QG&NJRN1C1z{Kj;0tqY3M(R6o|B;E32`Pi8rBwPBN;NVTS}U}FqSM>~NpGhdCbhp)z~ zxwXJYS>zFnEc7*y$F6yFYv9Ji8(Ge1vlO!s$BLePC_TQS7K89|#48`mS7T2^VWjeC zSK9}NkAGJ<^UVRH2GQ_?9Um9Wx-hapw`f%EbQ;sLW9?33+RZ(Fa&@a=*-c+>RJY5- zt}70|v8zwdp`B4DUq^}1MOPo%PH#ELL)+m-vW86_grHq`#MD3nu_!f|e(v}!7CPe| zD}tiH!f8SnAA==ohb|0x-#HHWy%s|!iO)!dN0l~E=UpWLUh-08bJEUI<8x&^zGFmUi9rn`P#=g9yG2k z6Mt@c>C}TCKL8G9Tv*?vS!U$-t#EW2SgqmlZ`N@1(M4kAga z%b{gibQ3{%4f>)-U|5WSjbgbb5XhlWaJf$lY$YSznvt53frybvy$Mkwh$0V(6ei@q zcjJa|_`UdRd-jM|m6fUAeQ^Hw6~7g~{~&Gj>&o|+zU|iiyQ|7i4H*Q75fj!(^B(;x zQkA)#Xrnc2l;89xS?*B4JIV>K&IvDE9%T?Q@6WYaQ?eXm0=yw^cy%GHMG^IyiAd!v zz-)wF5rGl$wD4Fa(hZ@P4M&e&i_e$ojT=V~zi2@H?mp_&;mKth_4?@42L+!!UGe*+ z557rd-=9raN>9aDj14rDO?+%XC10+{L@m1RNQ-sm-#aiVWX7QVEpUD z4P0%Ghy<}@NKa2JXf|VCiz;n8?Kr-u)nZ%y@~wJ{zFTi+tgbk?m$3b6{T+V7nBI`V zi=M{3ROhg1*yf$8&3N1WEBy{5bfOxa?txln5;Q`K1@@&3K8885=Y7bUt@POE`p z4ud};QRBg{I>;o}%4vj2c&>$Nr0H@T8;U)s69L0ExIV%-@5UYzOu`Vm;~}2714OUR zy%0c7A?n-=HHt#@g0$!lFNpr!@`Cp+T*@z4TclT=Ae&}S>^ALU)RP}#X}P=B8??OT zo3A5ptkqm0lpy?DV%C*~Op(jI47WBGrHOPoCX97tTTHUtI|k$2%VH2ndnyK$Y>$cy%3E)gU(Q9oL1&B&oiy5^ty`)c027U zQ+G{KPSS=`c1;zESsSbZ2W!nam;roLi?-(y6IFm~Tdaz{28DoW-m3}=3&HXuOP`1r zgun21cf}-41eK=4>pw%bHg3XN5VL$T(1K2ns1?|-vZ5kE9!ZyVN>dV?=h7M z_AXkwqsDw1vu|WA`-AQ++qKM`OUos;>9mL*{;+fPy#9O7*Qh!2iZE;4*goBI>!u9f zG`uhyw|8Io=E~Gfqu*@Yu0gwIePzK2re%L8|_5!HSY!7o>P4kaoU8x9B1_6A@!*1!2%X**RJYhg5a<{Fq7+hv=i%T zHOU$|q1I~*jR~CQu+Mb%xN2yuY8vTg;v$o2jACXrmRm$HkQgJvN9k8Blil!3K0^GA zez+0DXA#OKH;ppG$8{w~^HDcjCPv3y6TNKJ(1Tr9PJzONGV{S`&EyQyjtdJx+X64n$rDxy8K6U(Jh<4A)II(BVcG5Tp%sWTwGa$^>tMiYp9rsG}T= zmW4q9`c^Z>&)Rcv$dtxycN|Vnm7hRz~iRV@#0C*jOZQALqdfp<}F}u zmZu>J_&6UDPZruIi}mPu>azp$OuK{fz5}*`FiMn;k==cAW?kOpGx;Ds_HY4XZ*^ji zEAAQvYJMX*)I}%E=Nj$0lFeL)x0#dWST$lT7Bm@aj0H_*m}6PXU>@PA4BGPu$uMT% zZj75KE5&563}&M(x!9JR%qCpcaXn@I%!|mfK!RzhZW`1vw#$QynKl*~ZjDb*h)+mh zvrgbzv37r%+(v^Sx9^}~Tec`AoFHk@5*oH)-;7Drv?53}j<#)XmffcRLgDsHGK@xO-lOyQEwvJ8|wODqzmpl$piyPPwQUFgSj)qrFKC2FIG4DW8q#JLdbraV-Q z>3!Ut6c#aS&7gs+Rt?Nu>&R@;A~UOHOQ~q!=1sYS)~=0cTC-NmwnJLryM19N{3-p8 z?*_B@UpB7|8kx(YhOYpM=*#omm__Xo@1YA~YTyxnU9^r5PP*hERBlvLSU`s;tM@3= z>C8Q}LFtF$>tdI6%A0iSI=baWAcjgQX(((G4(Lvx?ww>G?oC$vFE^Dm3gq6uFebg+ zm=G|LDu{`0^m^IHeIGo)zgP~7V2*H(Y)rl6XaO^0Q&hu(1&eUNzKY;>8hX$XzVXp;4!3D7F7o<+V!kj91j|$^+s^s!&d6-mX zcD;Z~u@Mbdom2u~N)~e-xMo#hQk8F~7R~B4so8SN+fx>7Zqjhg{=7N6x3+z~N%PIw z(ttWCNwv}{zd3p0z^oo+D=!-~b=u&h+O^Y03anKoOSgn_+L$zE8U_n|Od5*G5mpr_ zN>C6*j8ThxY9+JWYu{J?Sff*vJM8_9@a+8z8#IKplLKFlkJ0pfZis6a+%ckg^fV&$ zmgDs2S7?KlByj)dy1dN5D;p^!1(;QRy|z+>J5i%J3soHi1& zX!(E*+m{*IcCG)WIX!x1-;smUlM|~T#0Bxm!cO{B$7V#6TlxUx=_%=vH$EqOJsdLlzUj)dC=^>dT_)qlN>{_>zQ?{i68@ zJSMCgT}+a(xk%TQi_HOxFV8MFO!{EsrVmaipPYQVZ>NsE`*v*KN09n${rL3m7TZ4h zXqUeKsL=!3^cyv-FPjmRL)MEE#G~lTn*s^s>Lxmfu=}0iZ%jQa+gdKhMvxSs=Y#dM)@#kZ3Td@n>m#b`~^s%--R4Jru#z2%#0N+~>Hz zFlK1~sRhD=_s`tiKD428wvMoO(DZSq`^60%J+jA+PcFXq?%|PbR?<4qdXp0Qh~aNQ zbyxJfU~q%+Dke3Y-$R`6Pq>}YQY2*L)X$J!S+wCd?St!-?z686WZ91M+m2%AEp;#XkTTU&bD5u zyw3g;ogjRLKGTg{6~B`DL0Z<}^XGllz!Ai>`}uNrrX=#^1St0=GFP*%ST;y3=#9DE znXe|4(k#S^Qfi>I8|I%MACG|h=Hr#)w8ePksB#on?P%M{NdPAfk!voM;6ka!HBBS5oaG1DX6 zlX^iET&+jgOIEydUP@$Enjs=o7Z%9|DG*VcoVxev-u`-(3CHl5Gow z(!@7~^qk!YO%}sz*uU&C(G{QEVbh}`I{8noX6?w_Iv9lOkPJp z8H+GdI7lA?n=V(jaPNr+yU>PowW*U{6fgUQa?fv&jzthKuY<>YQM3BYsy>6;sFH_~ zZNZo;H_*ahYg7uz4?%^ppG=N8gM5&o;@q?`vGS~XF7G$Btg%lR26X&{;E2%lFLV-5Q$*%h>R3Q_6 zQD;`C@-aJCi&s6_Yn{ZHvsGgkc?9_Y~6)EQ*=4ib>IFpsgf*B76~5p&uI( zlNg=A2~o+3bFO%5H0B!E2rkRK>umO;iJy6d$KYizLZXOQ;v>?0d=E8`jOYG4&{AYp zq=>a{n1!p#1~L7gvA5>UzdLcnr!(K4n6l(f^P)NL*L-^T!{!48%c3_{?A$YB>IPl7 z@=STF=T`gjnfK?ddNOO&$4gfCo86=Ow#-E{`YvX(W zw+I3g>u6r#lnFe7pkU-juLvM8Y`0&U;~haj$tGw|ondEq$I-mZceFT~LN-*2IuCUG zXkasSA`x-BLZ%htSkpj@j&impcMxlm#mmt1;$&LwnE~p_u?V*TLz6vMZ2)s}#|tv` z*1hTpV^D5k3|K8_^>`t{l+I=uM>3O|CoCGoBO=*)C=c#vY0MXc23zZHevG} z+1$q$i$~@R9rEr+!pGrjY48D>agdtUg<%Th7JF%QkhC=TyHAz#*MDTR-Pciq8CPwf zQzXJCv{u$fMuFem(>d77gm+^M@bRjuR z%^9WUR8^2FZdRS->JAZ{DPv%ehgO0oGw1TZ<7nb|yk&ZP--%x?U2w5ZgEJ#O{lT7U zcxT=R6Iv|zbN-cjb&&O?>CaBD8BFC`r_)b+c$5%y)bI(T4wF-lOBqC^cEjrjCtS;;8QS(4KW7DBAvw8 zZduH|F9X+HS@?a*Fdo4i75oW!Qn(e}IRh)9={Kxhv*E81($9YT_XkiTqsocW5g|d} z4whsXsUnNv+_wQelC6;^IzJ`X!$2xiE)m872FXJixY^Ixn~t+-?iUaeru2AY^5o-_ zm7}j$Pigde_0)#C8C}PYJ2+`lm*hqb-)!83)n>AETdb>ljDAp;e*!~MKB$dPj1R;x zJ_3g~T%;He2zJ?GjC8}?R~Q$GL@RlWLUJKmL121_SaU4rW6xg@OKE6z~Ry8f&Dk-=P|txRf+6i-(9Fq?E0g{K1dYfBNrJir)F zR%0y+16fTWkU%9BmFq%(@)y2oA}P+;Q#M4Z1C@mQ``b25ZG~qKWXN0uuEnJywN<86 zfW87)g?*Ll%@%AZcxTA<`usTf8pHWQAySAHFEcG1o+>rMNlec7bIDonHQ^Qxf1}5! zVZC||7p1NvhW3o>I&640N*O{n2xeH`SXqOhf5@;N7|-P^X25rZ#hYjaDlAcM(}X2L zyfT{338i!KUN^E{2-4m|M1g4F4J@*Svareqf-@e`1m*TpDkzG0RGA#AOr}feGQ9a3 z872-wShk4%#KzOur?RjT-P;3&^8<(RrQ?9*OkufjLbnUW?gDa`v)L!i394D`9BB*- zh_=GK*)xzA^W|_ZFVu`)gN*zw#sRIqyzg2u8OG%?VV+d?sy}SV7rtE>W5IlnH^ezudqn`5xvkgqlFI!BS^s`oLp74#2=Y^S6H+TG>WlU@d}SxFN=t9A9aQX1{Wip z5{3KRG_93OQB7idMX&Rf`m`rrl9!_$m}cDQ{~Xs28!GM6fdij@IO0Ie)RE(JzxqmO zURa3u_BW1RsIbqwvKis80lWLv8jDST`YB1-M3}fvM2|CnFb_A)Z4t z%!^@gOF2G=663BwW4sl?BpZW-D0C8bPsMQbunZMOZfEgu5)d>W|7N5q>G&jGw#u2CGzEMd*zk1ZaW@{k z^XL@^Fyiz|@4QyH)--asXOVJPIMajRq-WD3U*)7{st%Spb9=J?lXw1=zIn%=!bU(B zPe!VB=DL~&mV13O?nIvgE>Py!46>YTha;ZB37VoNqtoq>Die~QqD3^~n zqdI7;|9>Amz5E}1@B+yM?oXgaUtZHptDnokV@6wm z1e5ug(}}G>f}y|jJ9m04L()|F{^GsA>64rHX_T;WoiN?K9*M9~5oyRjJ=uCBN(_^* zeEl0kx)6`Gn3xZ?5lx|)(7kv?IC5bEKiS#qa-zbT%;$oP>rO$b8 zL0G%0hSsJoxD$Yv6enKzJbd1VF$bLY;i~R_rcM0L4|Br)a_+IT(4CvhbcUC3uiOla zYS~LcVJ`mQDm&6yQ(iXjm1^!m_mAk5EZas09ttU%|y&^C5EV;y$ zcljXcU*#rxXDld*6Eyoox8vs?pN>WByaUM|^3h1>A~ayRA@fI(p(gB)Fu z+u0H>IQ#*(#-sQ=E*+zc4jk^~eO;8{f+gIE6+XL)w@yc1dLshpG+4L{W3?>rtmVtO z$5J5tU%4xI=H{)#%0}x9d_`U_I2g=o-sSyWFuS0L@yg3uQiXXCK>&+}5m#<2Fp}t` zO+HtI*Rq?lmgn7YYtaw+Ax^ko&OMfPap&gTkKrWLGdHg#D;u@!)A zH?z|5qe%A<9RsTZv25&$ML@uC6vAM?uAJ7=b@hYwUmKbjdKg9+mKly2KKDuUx#=73JI42dU!Y%WzuA62 z`X~7}^PlWr?EgnV!+>c4*8?jA&JO%Ks7272pkqPb2fr4)Jh&+MnX#NP&6sVRZro@r zG^LuBo4yTc5VAMqdFYtXg3w>X>V&NhI~*PrJ|O(Ph{%Wu5l16qB1c9Zk9=Gvv&_^o zAC-At_O-Gd%C0PXJ1QV*VAP%HI?Pn7FZZdv(^@^6g^^b1H1Ca5JWCOm56W zvt({O`n8%*wU}x(sN-h%lm*==O(t2iN|SM8mU%-cySad zCoLdt=t@#v$biifO_qzTNC@(eM%s_m6R8(c2GT~PIY_OMMj-X4zmRz}pH!Aiq?y#8 ztj8>xdE$A}(vVCB>1v?t7i6C800sCI*6lo`&Bh_^&WU(%ilrxkib?{D2=_(19E|D%m3|T2QBb9LU z6|+fwaWj#GiFn?f43(ym#Zn4+Lz+!`OLa(3;XJ&9Q{fFANEXvy$rAd+aY_op@mI3h zAd*FZXR)-L^x*F;CcTBDxHjXs1%Az3k|*9L7QINSihq;J;zbgHV>a^Cr@xcKIELy* zVvfr1D5no_y_@tveR8E+B!>P-R!NUZcfgmUZ%%rMtH>(xG-9TQk?DF&nilty34)!> zlA4gd!c#={Jw^1~EO?po$VTxAd0mKrck=}qgZq=jw~>lS4%)M`K7+K=*CfLMOC!T1 z$8T7Pw;RJBMh16FACX1+)1-}LBh#c6q$$ekA#EmW=yS5ku!9UVG$MV)GiZl*$wcuS znXIc%cIxYq<#Yq-gOq|en~K5>GEn%E)D}+TT!u$8hYUgL1{hugESaEz-qK36(J&Gt zEkZuPhor)f=bR2fSGt}^podo`&k`5OVR#$ZX1OX?Kj~+jr zPOlfRVjREVS3cMak|0SU&y78@3qI^Z#3mUeJVMbZ11lp1Oe5RLLGms+Mb1G(`kp)`4qBad6wYB4_q*mWbCkJ)Io4du z+{iq}d@wcy8XEfrqJ-^a2i`kGipY6P<$6SZ!FwH??}eJnn9Je4njY^_$6t z@!WA5t@Rk`8>H@zTJ{U}qxK{Br`?}?f71Q&_xs+@zF+z4-|j8>7nQ&f$?Q{jN&oY2 z9~QSf!0UC0%p`lsaZ*4E$qDiS`H;*av&l)+w}_l3ACWouKbMcm8FCi&KTj@T&FlH( zGjg5Wfc0~ed_nTa0&|jfjx1k>()XNBR!wW2En$X&#P`ke(u4MEb><=HvJ)(qBlQA^nZ? z3@H!kA0#^x`yM(UPYZEmbixw8O`(#p#H|gcxkI~UYcdF^7fZ}u5fIeN5_C2q+*K3P zA!V=G!hipVFn>j#I~6+nnd7*h>^ZpCXP0R!P_P0rK{D=nw7IsTE+epXkTs65%{DQn@W(Bb3yyHgT&3TX2 zGBD9rKkvAibkEL@BaNa9@DC4<8{vLHRU6`$WEvz?rC3)C`}c!urNl)WiBDDXK5h0| zHA@&y-xso*)u_bJ#15~g$3?JvQm@vvtCnSFy3EAbvcc?3KeA_&)M$2QSTX*MT2^-E zGwrQ*HKW*>Z>PqY@saGzZ(N_2ndRA;|Lp#4)O-QA<%RufvwMMIra-LahqIvCsR`vw zI3u#r&j4W6Hj-09=xEs%hF!ZbI!2zsb|b>*SUI>H?hP+T5$Rk7G&=*FX99RqfBb7k zcW|gaScflNs11I026P;z^dVuwCSn#X#2@2HVbT&}gxm|$mm%SFH!Do|uYNGE=Zs$Hw-r@q6qn-K&(Om&zH4vd54Sq!#8mBqPq3 zZPoCF5lH>8O8)>{4ab+>!qXx6T0h(whVKqQN+zw~9eEv|tv0Z&8^bHALczE+evUzI zyFk6;+*9ZcK3J2;f$<26dkiz|CqSOYA*O+%tX|kp#3n-0%*6R@Z0x@iSRDKUY;08> zCdrt*6d;ROtS>9e4|p3xq()6zbs|yyCXO0H;@=uIU@%D?(s#@-lr6Cj;ma(q`y6Wk zy6y`e=OU2?4;VF!ME!e@{HzT2rohVz!ie`usRQoJ;w99EUoej-7}wrRkI?-TqsY{V zvj}RY4QVI%Fmvc1bO@5VO`^}S;T^sm!F%p)Gu~IXBPc=L3SDn%C9osP00gyRkNaa( zJdPw_b-~J@_GC~+8fc*gTKYA_gVsgMwLtr|2R(EIHFbv%U=>*n&c6=W^py06iH+nF znY`yA?LQ)y$Yt^gx#A_&@A6g%b(jG`7svP5_kd2q_U`~k+2{>39ox|IlH(ShAI1Ii zWTkELXRgUx#jBw?fh#;&?Rm+6aousgxH6M#EE;tpF$rHA7?P=}f` zgy#}bqhNd|74yGMEC+Ca)fpWhlWfORAMNTS`M{MarleVOyvHi^t6*^^lj68Yo*ri-e&~LeMG^(48XC&wdKc*s z(#I(44ANPob4cfrE+AdRyO)qIBYlE&1?f7{4W!SJZX$hwbPM0RjdTa;OQgH_?pH`U z)aY|k3mWNbjuKMG@fG<9Ny1$l?*4>3#kf-p>Z}IL*F-vrbPA~m=`@lF&kzBQ)D-14 zLu!uH5~(xN5~Njlwi;xy0)X{_V z#{2##zXau%p!^b)UxM;WP<{!@D?xcBD6a(Nm7u&5z|;}@>qs|{K1aHV^aYZHwwi;s zngg8A0nX>}x|N`AC8%2o>Q;ifm7s1V;7zTF88DaulNlw>AYC2HQR)noIs>K7K&dlO z>I^J2*N(xjJ7@5LOn`>wxa#=R@zjy$_``9+G2QVe32^Ll>_iR!iy!(4evZcurhWbw zKgYLfCbVJ*+T(xyIm`dS0Sa;a;MmAU)&A2@EB`;{VcIi(pczPF^i{7Pzw3SHIH1MP zu>~B!=-A;n1IjQu@^L4g-F3X@DC1b=_{FizvDjh6om-9vJim&Ymmmg@AdVu>dN?LK zPB|_qHryYn{N%vW1&;O(6F9>E^b1xWIDYrc;27t4pnTx?-hCG>NgOpi^LU=4XZ;U9 zPy;X7!7K-&)*Z*ANHItZzAyO`{v1~i9LxqG=)2lp(_Pp#tFJRBdycCT$G6~d#BmA~ zU~=3BUkm}2?*#u$Vs{-+9G?J(zc}7^oMZX4AIEBt);{0`#4#5MxJHZM2QJHhj_=qv zajn9`TABR<)q{FhJ$K&ul^q=)dfxlr&lz_AyPulVO_>ho+x>m9On>)vUbLLq8 z-{fL>)bBYaX!#w?YV`R18$XK?d962cNwgZ)gC_wvxV_IwaHJZd@qj)y~->!sB1QeAa zp%S4*3n-@=qy^K+4bUM{pfgp6RwF=zOGD0dYz)>KD7z*$KWGqaJ+0TU1wr?#4K1S% zwm{UTF8E<%Y(`iXP4Mle*s%I3woqQTFs=cHK?m%J*%Ft@O*|X3|^uy013lj1l~*M7?d~$A#1S(F^S%5kLQI10tw z)6Tfx61 z$R2DV(7+F&UJQ>a?gWlIk>k#v<1QSSyModf)lv_VO zz&-8Mxq}(yYc`O2ghe(a_buqvd>?^+!fYDK6SLOz&{vo~MNv9MiRw`z+wrWm$CD7( N6K0jQ!xePm{|7p>-q!#C diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.woff b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/fonts/roboto-v15-latin-regular.woff deleted file mode 100644 index 941dfa4bae83483cf1784641063ce1deceda1406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18520 zcmYgWV{j+k)BVNS*tV06ZQHi(Y;4<3HnwfswrwXHJ9+c`KfSl++?jLg^i+T7n(FGg zu5zNH03g865?2Qx{df0``r-dm{$u}ti3y8{0sufsKN|lJq`~Mx@5JQglzy~D003+P z0Dy&?emay8Q&JHG03dRIJla19OCrlwlvAQ({Lwysxatq|b4%)qjcg45005B6Kk-EX z00{ejAfcv_ixU9=@asRH^nV}`06#MQV`c*YK#BkOxPH)S_Mly1X5jb}3mx?1f%zXG z0mx?7?xsIl900)T000=0L1NIpnH$@<0RV!aKOW;BoPq+s?3_(ULo^635#oF9axHU@4# zxrmPb#1Z@l5IEphTLT-DAMNyqr~UX45bUVS{@6J>0RUn_KN|9XzHb|V@gE11pIEWK zKfLP)8&0{gmu^6?eRV*6@)+Q~@7YkxwIS13PqRS$^+NL|WtR!xvb7-0*q#vfPDm&1 z4psIwx8=80w=0o-rD>D(0C*rMVmF|qd5}NE(ip?H-^cUWjuz`P%{CjH8$a96#X8Yo z({S@Vsa>3U@ZfUN;-+eYgcBE1sXX+4U*l_bG)B}!m3p*e4jIMZqTuJ-A+!7Edd=_4mF-igEfch{)_AhB;q{Os- zYE!1rwn-y~3XK8H<+?N)VPqj{duua@7;#Ts8yBup)>sb$@*>N)gc?#@XcN52dM^0#$kQI zVe`OYqD#8#!df2IlVr<4)>19VwGE>QvNvMb)!QOATTxlPv3a^YD1}@I<$+ zR01uN4C|E+E|RDjnh-i0KD{;j?mAp*w3_*FNjZwOQNv#+I$UGujCyFJf*K@y137eO!rM`)r|w6swM)t)35t>n9`0sWYpSMG_>uC&K`* zw$09#Z)6X)x%^YLL_c)AR=Pa(R-@hQ9AJg$p#)f`bCb{2UoCU4;&FlMk0faB;C|P* zgpiEb9kah10ev#uK2u*fi&Xo4qrf!l@l;Zu)d7Am6#tJUdC z263T3y!mxa&I7u@6_Ev0>&~rQ2Myn{@U-=Xx9REw*E@YDKje`xiS*%XMK&e3Q|EKJ z-NTvHQJ~Jo;kxpTi12UYw&RHn`jxl#g-ccFnU5XzYimrduYC~!Th<6hHjl~7 zzASwmdNC5o2or!IHYGu(WK5>joHW4OQYYZipzc!dv-D_CeQQtvuT86hF%E^Ygb)a{^ENT>bnZ)5q~8s1GoXngbx7; z3LpsSfxDh`f?4CY3ITcc?FkFaQrP-3j|uUk$zfj&oQbDXr_&Y3P;J^m^6IVnG(e%~ zwfw^9e2I)7M1&B=+T-J!#xz18T*7bDk3!7%g!rofo9hO|GQWBt3TafVhK01`C2p?6Jk#;7?q%DNU*`pL-w&0zSgy%^i(EJ3@ z7w()-T)1#qxDcL`E((_j_{rIO0wl^-4G=u{SkSzc-41ItG&Wdyh0*j=H(bqA`qrLg zq{pW z)=SJMc!g{&7qkXW*5n3;{??xEFE=H!Gl(l=# zdw(hvDy2)$%woAxjX(hzyqkOjTGe`^=jZ^Z)A@XrSdAFB5gOpnt)J%{!f3#49pGa z1PuN-P`>m5D8Ly%Jq;lM8k7@&0vZiK0ILO{fMWnqfrQ;)^)ypz9>fnF$3O%=~3@=g&7 zyTiY4dR&Sq`o%6f+xP3`Pbq620$*M{%rB!r7rZF6NcsxNPEG2&NUG0i*Y9Imvv2fu zUvz}B4O(9oNY0va#vAnVdMch^V~fJY*Sb2M@C4?0C>AZ^0{LfcRSuai3F=|f4O0b| z6`6WDiE!6%0|An038O|ER9#13b7}&GyI<6@Sj#22mlO# z1OR`31K{0&D!m~1QAVD>Gu9k%9-;m`xQwqUl&7m3u?^`4>JYhHhIJ8yMW9xyBVnhz z*)BqoMTB=5hAS9F6?-j6e-vXMg?vv^yS0=Y@A!mUcWh;`+39{xW`O+)0fKBI;esRx z#Ov&XXGF0JoHMsHd}dwE%d|1+Ub?T6<5H@<_W6xrU< z_eTiAg&X^N!Ie1q8(zZ8ux}9q zVimEX5E1GXEoUH|>c~|2XJed(H{geqCn9(t^}iurPle?ez{f%>@|RvG>QJ|YHq;qv z)i|u%3=O;%r1o8FO*a=ibcFU@&)h&!w*>a#4b}+LzZFnkEf<*eAtc_Y~0zRcUyUWOQar&j26(i2Q4QuH}ayxjtOav53h>LtfJ#VK0rh~_USHwDHw@{L5Z1ULb8;xVrBx7 z`kI2I_JHW|;9<~9FJN84O4>Rh_?eNCk|D(bKuRWdtCz3stKS)KJ(|$%_|<>Kbu#^1 zce6z4eY;Ebxu5Pz_^vvuFhJ*Qw!(Gf$vd1DH%AtIWtwg~alxl=I?KI%B^3T_?e?*; z(H2$h_+~qK#pmlf%l!^}AoS_-VYoJr$H$IF)*KcXrpAlli#E#-vQ_|?+A9VpXfCnV zvJXC=TtJ$_u>Y?-h4X`fHTmG80hdq~Ml(}6`qVj1-#P6p#v}%!sXWn~60e9DmdczW z7EjkGW^(^vP+eqrFdV5;-mFF?Yg&DE2ue39 zapzQW$5+~F`;}VONWqqX#(gn0ayM>cr{}=-l-?N^96~3lXkg$5PN1cIAyuSMxC!ep zB0YLlylULhsT6;0++v^Ap@Kdr&#L#qB@w`fk?w3^Wwm(u2T_y@!CT7t}Rp>UK9 zr9T<6Y}&^K@WvZ)>r63WGZ=iyezRUe%V)xrzx+|xPt2p50Z9f0ZctqW;0F_z-D4q9+0XrBT7q?R z7DXd7>0XgizbI-_Vg-S+-G*3_eCYRCTYd!D>wMuC9PZx!?ZPm*EJ#mEdfJUvi`&$O z1&A<+(1Z@$C;w*q)fRYdOOtK&80gsWL*yn!NfjTt!C@hTz5x){qjsYj8<}H5Ynk7)Om6m z)udWqCOl&q zAh*P|;YUHU!($SWhtBuiP|y9X9N+feNz|iytneqtN3=vO|$W}%v zb8>h)>{B5&b`p32ZRxb(2}C^D)_#L1f>BDKB`!w(I)x0uOBAF_(!DK` z5_qh^k!lXES*FAZPy}SNx>~y|vz*#f9W=Dr#oCB4Xv+zGxu;nxu#;?*Kxl#Mx=u*t z&CrV@i@T|e0pKn)7zVl{o^uH)4Xp^-)4tQ z^XLdLrCtOdLS>OvPZ+#O1UZ)H0cR5Q1#n)iI)Us*jJe7tOt~o^#63ZSwbe2A{1DZ>BcxM8uBkYU%`?W?xb*X zwBH!44jW&S`RBz=Ecz-hO|aFDe%-Qr0takHx%PB@-trgeR(d~$e{b?I+utUYbK80%RL{-y$A}3Q!e5PA^fS9S|ZNP~g`hA(B4GM7{iyE0`tu=R~vO zysx#(h;ivS&i+Qqg6HEyjd_-CVC=0#kiBTr@YiOa^LtB*u*0ZY@Hc7*Tl`_nu>deq z(r@dr#yXz@7v@30e`@Ia7XE=W}_Ro){NL4ZFfnCtQF^by+s~_jX#xXvs3Hf zt4PyZ>o<>2b_L-ZR?Ip>*?-NWe-Nwf2~gpI{DX=@I;jE&Tv=c0DM?F0ikVx?pUjo3 z2^qv@Xsa6VJ-8s&^L0Ous_5@gaIFSm8@`#s!Q>m<=$rU*`UQM9^7wwpwm3eAS0&s* zI`ZaTpB@OkPz+Hh%?<@UiPYIqrpw z1Xmo-Xvz5CG??#g1xF4IG7Q0Dd$T_lcs}!GIy5Q_?9YYTZC9>xdVj8qP23H|i6jmm z9dGOOTffwfOYR}wn8BWcOgojdrojR0Zgp}(QwD9I ziUluU%9+uEVmj8vmS3n#Ye{Ar%BGC6EMhivH@Ninui-!69AyJ=V|I zJKJ_AX8?tJK@b*FJ#(w0@IVp~?Oe(<6D$vcY%m9)d(g{$qdV_ZRLp*>FR2j5OdX$;w_WR z0U8j$OYr)s3lei!;$FO(VKTfVL-=f<>_vnjKuK3i+;JBYqjxg=LT`o z%_cR;wspy78anIVGf~jgRctDDm>l$HBv>2r)I%~xN=YN&5*ub&Bdw(cL%gh7Gb)tO zq{mGfrJ^t$1bI!rANLVUjJao}R58Ds;7Q$ZmPqBhs|+KpNlS(~q-1jJ9(CcYRX=dO zI7}U*FW@IO-FSNLh%n)O1%`AzAF}OKd+Xw+p2=`r30Lsjk@U zwcc)ZftV9&dZr(KJcddtV^q50xp3FnPQ@w&OiJ`hi&R>@$Oius0q_qSqz69h}S z%=(izI>u&i?E$A{k4ob_5FI~Fs92)P`6$S|DgZMT1^k&)Nb-bQ*$BSKaq0}g;}v8Y z1%_&O>LYYxgRI5opWKW0BoG#qbM-9?&-U{am&)8fv7R4@1yh(r#>^B9Yb++~!?=oK zH~yVp!i*7Kjal_JcDi*sJp)e;n~@;ZOc(ZUF8QiAHMG^UeF=((R6O%u2m>s+$vo1IMSE_k5 zu#qBBB37-sQCX{gx=e=Kt|wE{=65iHgA3T*<}(jeJr4Y~#-EpQN|T9fdZ)7va&urw zT?af;Tk;sYoelA?cjL2}!*^5&fFo^AzV=f9!2FJm+cfjuMNy>f{9ssY&NweyYw?$; zWs`+vtWC#UNI~haX=B2ymH3Q+aM?vUv<#`A70i$HRR(st~9OoX1<`&LxF9iF)*S z50$Htxu?h3J3V8aIivW<7SH$kW)UkDPjsA&@gQq4C2o`%*GXfWSKxp%WzK8)v#=n- zZ;1KZeJ}BF`7SHrO`x8zQOHb>T#-R+r;?x!c_k&Zw7$AIzlfNGp@;&bT6t2AN#`(E z&iI}yD0lfV1z@NTa4^vn(!`DtxdP7-Q9CK3_u9SH(T6OG+YjqS#ORMb@CdS=gz+-p z1UhV1fh)H1&P48))yKt{EV8Ku$RtzctKNF>;l(KrW`Xd90_9Yoqcv0`3*ap>al8>+ z1{0H)YkN*F5Yi4K%E~vtS;l5U`E6l?(1n zZxr@ODgc>nL*;=QP?lGe&KSNnhl`f_O?M?V!m+QzoZs-**=cQs`iRQ6V*4Lyh0)wu z;Vr7On{~#$)KE4Sm!O~eB+{WnwRjPEDBOz4WYma>q?0~uN3x~qJPi%dPZ8l{ZbgvS@t!%YU~t|vKt3_l7{8x_L@!v_e)@v{|l-Xb0Cbz~wnP}?E zB(f2ye%UNjz|S_a=h3Rizs-H@s_yEW&69LP0`ZCX?w)sy+0Hw@vRv=RL^l@&KIiex zYJ58^M6Nrdf%P$z&M3!{e1Q;z%I<2H|{q8A;N z$<8k&=?$(>jH@PPg%7?S8ivx!xm%TV(sZ~z?4s^Lr4PD!Mr&U?6W+rwD1D(N9^?=O z#RcC!GqkADBLa#5>Y%E9^%5YV#P)ISewF zKtF0BW9SN(fosvMrwngek;hyz21@^BdvaF9!0z92tt7*R*;}9_wB?|c0>Z35;tlOD z>{-7g8{XIT-4Q$H0^^(F>9*Rcp9(f#9LhWFa|H{+Dv;aO?Wh8rH1~A6+-9lMl!uVe|t0+l?lLeYzEAI)7D@{3NlLxo_77z$I~mT(jA z?i1VDczfzd=ps5sa<}e<^d;S_2%}kl){Xzi0WiGnINfy-kAe;(<~@qu<--6 zU9h~<=K)$+YpRH`i@@E{Ekk+cyUt&qGX>nubjEr&nF<*3XO)+QLzIK9$7a9SW7D}Y zT2WPS;dd9n)E4G~wlgqsT62oRym3~tMy!VfSc&*JXIgKIRclcnUh>u#!DP{Ss<|oe z8SoK$-M2=nJ8rg;=P11)Fasgb*?)6MP5_hhT#Kqhhl3!c`7W6W0bTkD5h$i=Ia8|X zlHa6A8GA?o(&nmD1&Xq`w7=+p==jU@;)Ng9*o=8J-dWlukglQc|A2^rh{4!ivIpMm zS45Tg0QM0j%OIHN70(OBgvt`xn|O{Pk^lW+K4872CeC*KSMqWnVIT9(uBhI(y#vjk zIqj{7?PmXP&r(TPKO|%iF5y03cYZFi{6@|YLl|I5)acYCI=Ex7hz)#tHv3X$Hr?Ou5Zmhuc#OV@6Etod{{4K3j!8N(96gkbpT%B#zYhT?i zjBh-zFcAZ>M*7Z29Wj^4WX@~XMAm~nv{v`~)1?r0bqYo(uP+EshJ0-#cESya+xhdZCb|U}+IWF1Xp$*p~__+rxt4wV-ViJ!AvJXn5}Kb-4Hc9_&}N zHx5n8?zrNy)Mw7I21eG^J14C@`WM`x;Xc%(zES`&*BS*FjcOCS9M7LL=!kE7y@gSE zYemR%vK$UNQKY(EY?^9uU5WYaCis&Z-i0T-;REZgG?$KtxceQ&u?7}BaISLCc)))* zwka@s(E|+r8bbXtX-tDbc>=Ob&WtyS%UD|2$4Ch64V1CtZQZ`6Y!^Z1r9TuKF}ysa zNSqrcbRlM1F_L(g@@ei)3yG3kkHY|pTk-Hm(-H+pKSC&3U z)dL2#o3HcWAECnGqzVZWUvGqdKs&_S@RJfAcpKqo^=)2?8&S{Lm69-i@gKLhqQ(b| z+iZHBTE=?MCnXy75Xg~jX?mZk#d_nto=LG)=I~YNomU%-h7i=B)?{wn6wz_&nesTq zNG$S89{HL8_#pFe;GkfQsG$@&s7Ea16=Vo%igb}WIYQTB99KX3E%+RXqHSoBdQ{1T z)oBRC8R}(Wy#8FCwk8;UwkqL&Y1gxEY&X4cXEw1v;iIs@lkUhhS9vAYXgLm}(~U3SN{f{X~#hVCk}(GTu2t`%*c?&!FyYZd7=s+5$l7Kz1D+09RA;Lv(Q#c~W#l+F;zHOQ;>svA5V3 z{YLm|Miy+TN^OSh@FM%K%7G#!PzV`-ciWll`TZ0c?t_Fk*w%{ZgR&`k)Wlv8vlhM z_4*neQ)&}SGt59LNvZ(bNhw$<{M9aEAF`Z{9g&M(xcNFcKlG%7O>cKq*lVpX;7dlM zUSFv)yCtI1gHv`LYb1ZJ{$j0sZdI{DFPRp&?eYC%!t`bW@_Zl#2%<9q5HA_YC8otj z63PblTjlfm>`TdcWu5WfYh+iOl5r45n6zuVx=Y5cn`Q}j1tTT#R_n=HON9RuAWSPUy~%z#-$kSsIbIzTxcKx(SXtt7+Z7ILB~02RwTw+-eaKAh1Tc4VrO_>z}ov<9iiab@P>1-!I+_kR1zu^OsoDZAy@KB7Uyj> z9i%;6V6cf&qSIc#M=BmVgldw)WJ+k)R8?ba7|GS2hXRr#`(T`R!+y*L@Ges7b*C8I!SoJ+lebpl{I{r*{9UYj@ zl1jN=?ILkSZ?++e93$OVdNBSKQ8SC*`Z;8A6uChSOcXc>DXRq;r7~IW%gXd2S`j!+ ztvtZ-GZ3P1w=&E-@vxMk9u&@!2w=sCcsYL=i%Qsfi)zU6(y3=KQ;WU!M6>N5?ipK3 zi|HxaSV)Q6IIMf=dt`|ruc*0Y4}?L&Q++f_Vx4|*oymi08_Rl64?B3xn)QIJxJ~_@bD&SJ^rnntfMXNxeIcI zGM75V+z$A{GTh<;cC=n4J-90`7t+71G_3(cU$$^6RT%@y`<_0eH)ygA1Q{%5QhNd3 zXIMvEXB@D6pi(Wsw3XQ_APQ1J?|qZU(JfdG0FQ=YS}mA3Q!UG*@u<3OOjn3pE_Hmh zybAYY8g<>+Y3;fB*HYvd3X?;R1a^7#M4C*|L@=2QccX& z!dEiul&8s)Zr#n)RiNU?gR#5L5y+;Lk3wnS5V%y<6_iDb z^QFr3%jEp97)qDiDV22bK7bfOH;2Uxu380#1eP%ClP$X~P(Z|p zy3TY62e1qn8alm5cABIn1)h~jf;6vNOQ5L=@}IpF?W4Hcyx>}Gya1gsG>ug{j>?t3 zlO%kQy`Y5Ez~TR91%P@3f}SZ!HDM@DeE}er5lp|E53*xG1Pu)gVh}oQc}L_&CACS| z0tw6u{{{-V&3NyZ(zc_7h@7udr|eGV8-F>(0F#qyChjLDBxnp97pf37Mr<1QEj;!3 zesXR<`&=exaRo~mn|!q3XMcGQ*&X3;%Kd$TdYx&jd4GC;LV9guDbUA%g>7;-D55fC zP|jen8nwGqaA`@K=gN!Fl_*LTz!PXR+>R7$5S6TnpSNF`utqwnN6+DLFJfoL`$dJ@ z%9mG@k{89W7q|+QI0qYGMu0rZK;D5b_wae3ZIhPML33|N)KC2fWRki*X3b0z1vQ1_ zb}xPt&e6rS{N5wBD)e4g$IuS*>zrRe&*`^?bF>1;zZ5B&7LR=i5FjBujmY`I6}K;h zn@M~(?$`rnsw$1UfV5_M^J#0A2KlTb*rAT>YPUYm9PT*Xs&OoYLN$*$$wl?B5L>80 zb&Z@X1@kzrKb5~-gL%0*9`aQ^Z%B%*m9Yog48XaZl;5`@|yoEkKqSkD`-7IQ>c7!T6sh-mLetJdDNIluDth`ugs5X)5 zN#VHSTqqX@#LK4e>p$Y~6OeMrGlgRwwMw=dtC42rfzMRq~U z{Nue?SG9l9d8tutc(=$4&Rz9s_FVv)86xT{3!Xb{43{o+j6=Q#<1Q*Q>cg!YS-a8-wjhAeV2~b8B_b%OQ*Omfpr5x_K0mK$c}IiF2Wj?C z&o2+3AtFs#61i+Br$Bw9xd7L&!YhHD=v*6bP#5*oz@!HpD+!I(oDh_L~ zC@)!Uo`so$ayoL464o7ATKt8ING2o~&8>l-jFs}pBHHz*qDwf>$TY*vb#*$Te@HG2=&+KVH9N8(G8_klzqOj9xIs7lqY$z};G0drz3 z@k>md2R4?U4?Qn-E#{z6D_*Fzj6((hKF=hpzs1R0i&^|xBC5`$I@SM<;cSqpS!jcB zs>7BSv7}{_++*;z`D;3P_R58!P>7zb5v0j&j^G010?E5}FUE+eh?hxtx?Un)Y9ley>99w<2DbyeyJ;JjMQ7sN(b zt=Bpn^uK`$#NgeSmi(Ium@LDkwIW7mv|8dIGRW}+vgU9W&qje9{w+#4{6n~Iv%P2% zGP+vX)?jKp*{_VUi1dWft4;OlHi9T`Yrz=0+?2gW$r1XL%^~BO&LZik))w_{9o~Hg z!abBbxRv)az)y7z`~C%eUKaM1BQ zG-71vIpt=x**GXN_G{a2YGQ_r9NcxP9JL*$NgP97q0&q&RvBlUg4hkhJ@YbRDRci~qSz_|K|U(?9Yxz$K~NGwrqwDE zwiBwH$$rRYmisCdC7^w{_%xQ^P(nG`lnUG-B`gDyQJQsVLMDvE2tOMoRk0=RUL8r2 z2Ot4P;=!^|iNZ>R?A8qSsnx+#8%OKU8cfIWIToSRt(i%)EN0T*wWFaSYODrObt7b( zI##WKcDLd68J$fsMgPru)K|N8VZ1;7!X{Gj-|btD#l#0tdVTbB-E~4aE1@*QEt|&I z%!y-L6s9+LC{xCFa(CIY&R>(2s<#&zj}a`36bx`kC%emIxEVkMf5}9ktJ-+j?l^d; z&8^ylmt%~*WFw{_VD5t$xdUUO(Ln_>vEREU%32g3u!31FS_ed8FDi?$WbfcJTTBnb zR4POZ(Ur+u&yzCe+Zxna4G%&d;=#cDuQHggK88!QJQvc z+nj72vBld$cgbn@4+(;#ndLelBkkdibLRCPEOqR9Jt{Kc6n1JiRO_YW##=lWaIJCi_& z$(|W0=89ev;4Ns%cnqgM<;E?d4>b;v&%bDu}gZd#X@S&$=z7de5RaDMI;3LTYf+ z7|9rFH8H#yOXLSOr-XWlYl;FeEFOFP;=Wh?;+Ng@3GUdqIvC-2w(a2|>HkCs%TeazW;oNz{kcxi|ycT z7QFZNZFRu)@6YDT#oU}Wz8=K3Obn1o<9xl%{xX69d9JVuw&)iK3x?$daIX4^0(Wd9 z^J@}zL9?!^zH;bFJ!2~%xDnu5kFWuHb4}p&n1mtpI45$}AmMuh`8+{tie@@#g#Vc_ zv*>@M*#qWh<`KWX1ivO-`~`qH-5{{`V3%fu7tHcsnf&r#(`cj%UfmG}`Rzn%R7K9$ z%7Iu9PCIjsPV~c$#h1Try<>RNJ?vK2*z^QSl-kk>Dt^v~bPe3Uk&t!2s3?2R8qjfD zOxC86zI;KD+gf8Tv|Bd8ZL>H$B^?M^#iae6^SuaexasMjJ9tbk#fal^!LCpvI?I>sZ6`BvGa}!bI z69bLjgES0{&#rqvQo{uYv40TzoW~SzPQOOIwvw z-qj-CB;TtvQ(&tw+kktAQbD3arRJ1R-Xk$&ISE-rU@RaWDzCQ~j*}h1nIEGxX0T{M z#UTzi-#~jBO&WdtMEwRny z`>*~;Ok?XZddZGvD>L%Z1-tCw1csFN9LBU6hS9$`!9 zSDo@GrdXu8H{4XssNLAOIm0CYL8)x>g`XhN3lF;#|7Lbs)6z&8R96Ms3-&zTKPI`D zQCiCn6Su~+g4&h=yTa0Jj=)&M*^J8lf#tQR5e1BTqn=c(K5=G&FZ=P<^^lpzYskLk zkESZ2VMD!B@t;EL0M58-;gzbAreZ`}De@-U;f2X~J-xBY>D{(!^k_xjhPxdMYh|ep z!~FGIh!?S4zjH;1rN;(kEm(x8Qkk)%c@Xjwr?1+TS0Nqv;bogf3JYb?l30(E=u=0n zOP#NU_YAXayA1k2?$Z?+$sPvS`RA~wDeUG;`_{o1+D)BLwx)=n zzQKvy?nvu0DxNahM>~8hT+&tnWvou$5eCt17+dYsa^GP@2d$KT+H{>ea z&A3@VuP6o&^0>!Ct1{4WMpjXzUI?%+7TwlW>w2S>w5(7;nC)Wj@z(93S5|0#njeZu zMnUhFqLLWr$8}spXiHHK-2A0hIFzj|LnuGT4jS|&+nLmLB6s{aYO^zA)%NHxS_^{1R&vi4|3*wRu8sIbKkIJoOur%bb6JDP~m~9eHS=Go2bO zgoMhY=)Y#=ewIxv0p}W+ZGp$H}96dJF0|igE$jGX}V) zc-s@QX1egr(C^^OZp}!r?#=WO$}g+~lo#L>dY9mi^(XV_3Ax8- z`JcZU9gGIp8Uc5s&6q=iT+Q3@Ro-6pB*Zq8r>=a%IiM&6Jvr5%>IgkGwtK+6s~+q%o)yP%U&eCpX5in-vxz#pb>&S=uZ(`Ku5S-?yyTOJNXBD!FWzmA%Ivb$c$kGEY! z`YtYJeYDVRggptD3dS&p$gu0HK-U89YQ{N{Fk7;MCZMSzEpUxng_KF0N_wA*2;El7 zpb?{IDm;BT`Sn>KE4AH((yt%n9;-wgBcW@+c*&0-1k)7-ej!Uy)ez=#Z#uPd>N zP$^I{@N6`2I9asc~0O zWd^l=X3KgB-OIEN9c*9n8C?1;+6Sz9e*9fb?;44@0D%-8;KU)t0mX#j4;Aa_80rx~gJ(Y<3PwK zK0e+)Ua%bb@*uG~9w!UlDFewRT@XQijrEgB!1<^-Mot1sXAI}I_esLyYoVBjNN)n_ za|Sv1o7W-!`)}RNW$K(YD_{5kUmI2fDe#i;Hj{%H5vGW!ZA13=A5&U_)!_S}9MIt* zdGv3r(L3tH5cBWBU7bud$iGuVQ0VSU9`uuH+>5AKc$3N>IjS{WJ&PyT6Is^Z-&Iy- z41H}pp0vKqK5~bXQDtX(UjAGuDf4enZ1CAu%?v(^r9iK!)XlppFa7Y1eE$E6*MX32 zc2M$Yq!-8iQlt~#Az++FomCY~@2f4ZawOA}kteTBWp5~#A9?;_jECbwP z5gxsqcxQRCU}tmhzks@NqVFDkdBtb2KKaB>aw4bHzQR|O&J78Lq*9*VO{pmO0;@_m znITdJ&=3^27~E!6jQ*(y_H_i_NV-|0biMEe^cCEH2lN?<7iSO)_A>1-Lw}^&rSF}1 zElf(ed>3OrM$WM&`5{GdZkjBX%8;murfH1@&_$PCcW!ko)Jg*@IH{YMJfcI?!H8aa zTLOpe{Gq19ng5#UE_T%rE|bLButrk|iEOX;z?-e?NYIwSxz{jI8NYY~LTdjT>o0o= zO`;qsXSZ>Dhnetn$Y*x*746e%4<@oBu$VU)eyg(I6^ zJkz4^cLQe!X&4mJ0bZ?{5S6at}i)i-B%C zp`2QvNM6RdrSGL-9U&=LVFN(-{r2_l^?wWZ2WRl8cxWa0Mc$P0*BTOFEX;197xZbK zGdW|X>pXhbug@`+vXibxFSN8YXzL?l_A{p~nv)VH#KP#noQi6|?cTC8m&b_b2R8u{8uN>5XWhdKh%$l0vFPEZHrrZLYZ@b_ z2DvU$Q*T8}9ojC-VpC_-TuxRQUBAsvJT+S}88u8t?N~ZiU9$A?qA&uX!>WBM zs!S)Cae`mKK=dS5XLjWhKZ2&~Ehuf#l#~dKEFzR{33+OMhww`3)lxBSO_<{Muf0;Y zN-@dJYYTdR7|>V@SiB_Jz2+=U7$0>JAVt^cCeBs$b1J@rc>G@gtp`&0jIT9`))b!% zSmjs#1Y0>;D%i0(+lUlL=^+vIsL~VFm%3Tf6Hc-XSKOel)TVI7Slh+va>e$4OVbmz z_KFpnzkuDa?=ubbRXlKQeFxkpqp!?RHzliQ?m^ z|LgKvfF^s89KiX2E}yAnhD;h>>2zakCDje#q}1}ZEi@z(#?9GQB*h?m@9mRGPKxVT zo(<^1N~vI8Qq+9p2bB-|28GN7-v9vs0006205BU-u3ry4^#B_P000000L1VSE&u=k z0MOe`n))04)d?^Na{vGU2>=2B000000C)joU}Rum&-us0z`*JGOZuM|rvXp|72E{? za9agM0C)jyk^>ATO%O!i&h+m0+qP}YN+qP}nwrz)J+gE2Md6{-P)8$)H2mm0s zEQEWJey%Oe>?l>O4rRh!6t{~M4hmD$&7!ee#uvT579`Z7Ue{t-~>&A@qBGBlgtXy&3>SXUrNf@kCX`i((KC&4}Yg>7?)_z^x%PtIlk|#tT3QL!wM8)ahmykd>nbc_2>E8FXs)t*;ErR zIL%nSuZHDmD7&TQqqq$rXE;gkHa-jv)6ou)L;Dqpl9SVSq@$lt5i3L8D23u9sOGNH zz><*P9VdZ^;~G%Yn$g1_B%ynQj=E_j#cTM1Vje|w&&<*9q>KKhtaeEht8x95B_jLH z|Fanku?4h@=99+8QODYoRI_qgFFFU8=o#xzu~;JV`$Y_Qqp9wfP&16jfG95Qg6`xK zKLuU+%x$8W+sS`!zU&FKa78F3vTKKbwaXvUKwj&h83`~Lbq>0_MUgJR1)T|A03@gTP}p}Rj3>A<9c2MI1+UlLrRi{7v{D4g)v?YXgu2 zuLH#c<^%l%N(6WW#|1nEe+AzLJ_c(B-v>qqTL*9lj|a8~)d({P)(I5}bP31`4GK*P zg9_^lEel8sdkfGD^bA4_ehkwM9u0#H-wsL+bPl!-<_|j$kPpBQ_z)ZrGZ0u1e-N4w zx)CxFkP+h&K@zAE`V({$xfAgeJrtA_uN4{|<31tCu%TOoBJk0Gfd3LI6)@`;gO{v`&9JXX|OX6A!0KSzJ+j3s?6{7Gg@`PHN^D`{F$)niCa z(>4wDDs&l9k^K?CiybE+;_^Q$7IR7!AvFL10C)joU}gY=|5*$v3|IgFDjxyS0C)l0 zz@xo^L7QO{BOjAC<0gJaAi162%0N|GfPq7sVLPLTwVt8~khz^H!oxxX%wi65Hc=G= zu~_1KZL}ppELJleB}sk|i>)x$%}5%=VxL$ZW2FpYanz*;SW1CdoFT4eYT_UkS6PC$ znJkFK-JIeFQO9$0Q&+MLh{Y=+$jiwFV)5A+smln09J5J)iyi1#1=re4371U15CQjNSurBO+4DXC^kqXZgn z_I=ZQXLn~?kyfRibdr7YFRcKU#|>Zr4PXJ#goYWw4`Hs?<-4mp-Pya+DL_;sbwCde z{7s|)3pSu_RH>GX$>QOVk3|M^Mn8Q_j|KlIYqgJEW%A1 z|BbAYudjG>OLPmW3KfEI6{@8ePm;0*j%6w z3(LruyOU0l&PvfKgt#RAx8l%3)t&r7Cx3X7Oo>hNH@%Lf_6?Se$H-Lb{7-ZCCTn#& z#*C3H-Qi6BPwuWixin38t}}P6-~D^XXm^ek=FkWWZs)EmW!YD3r5Ftu}BpGt#DN=%?OOG)Vc;>9xDNv|Lv1Sx4 z?rYWNfp%0KI(4C;8!%|dxOoc}Em^f@-G)t%ZTG-UnD7BH&kGQnj5Tjw55^LQgj7R9 zWQ%!v*kp#^vLD3cn)O}ur6xyuY9X-WqKcDw4mrUXoPv$lfg|A5|KO~EW(ZDqoh5NL zI5`WjUUWGVEc1>{_PF_Zk)O}aMkmZUdCMlRKoT5t99VJ~Y=R>X1FqN2E9Ti^snX!T zf?pnp$&!TBNX?k^j4I6tKUT9v5!ql_xyqS>bk$>^unrnQV~DbMiT% zm>uK7BP>w;8-tbgD;NpqEm>li5k?uS%!v^SYoT_I=z!x+Fv}}ZSOBGvB8m&=a%7$b z7Fqgo5H1M7M1T=*F^WJK7_wx;K_OP!IiVxKaR)Q9nPZ*>7Fmjn@RBvw+3=g-ab*Nl zlA$3}l1ffE;e-=T)}LUZhmRpJT8~dWi{x5UejRME$>V=^*mMyBm_FN(oOc$;a=z5N z5c9bPayMUK3ng``Jf8oXJK`vFT<1Ua=sbtU8G7*Spy z`VIG({ycxNN~fSwn@K3z*#Sh*^1G%hXR9FZip+ad2}b3t?xTF7^GR3^mV^IZJZ<>`h)e+v?Ul9s#eXWRy`;<4JwPr2QVTtE zts)0`xjX*4iCQgJgJs~WoaDdM02#rFGf#2|4V^md5wg5wj`rhV(;a}A&6W(#lr}B0Gh7sTHV*k30FzEZKY+)A*UuSfhji)9VZfUCiHINanDqQ zCRq;k5Mr*HX)qWk0#+6TB^dOZz+qj7aEl~nGL)cc(sm9`=sZ350%N8wGM4~r_cB}d zuE=|(L|r5? z;$S4E;3U&bh>@&V$cdG_I4FpXqSz_v6iuOM2~9h2=4F_CF5aZ^c+zR60iC0rfjgnI z?8MDJoXa;KZKe3)?$tsxJfvZ%;WN>3KMq|%p z^{3?w4$2)0sPY)b7$Sxlgkq8KRtU&a8DyLW1?EvpgvlboWG|rP$uFKEjKdI-LlYLG zQ9Qs_!q&1G%;3h#X}=`Xf*EEpgDuY>seL3gcZ&{a+_N5u1$63ZCVbRB`e`5eEQVcs zm4_4HXjX6onvo4qWW=|-9VkeUTk3d(8Zi3SJT$ez$n$x0!N=Xo#Q;n%nW z;NC8$wfZhU#}Xs_cL87vfFn*Y)CMX*{v`MdTs|*rfDiO)fN@|@@!@OR-Rp%-z(MMA z7N9PKsH1>=Q{T)DSXG>wG0nFeG3}uj-uVZ;5PX}~r@Fn$wGQiP-PVumZ@v(|)(!pt zKltSH$**>H~cP0*}=oc8wPT@s1i^1#G!i=z>?fVgKUsGDKMC%7C>r zj?76m1qMw5)>%6GhOHc5=ZAG1fNNw!O;lX7vz)F*oU-!wGsvHo^bGn%u0?W2jnrMg zutWW636n$D}KWOU||4i)Ye^A>r;VI*W^>NUOZwxv7o^TtrbDv0t zOb@Br_w6ML+C**}<-z+E=8S_r5PhVrNephN`kFjFF7mr;BWxEOMA`3hjoi3s9lg3Oq}7ozxDe2{%!bx^_d-5ps_Ixu>I(0LI47T1k1ni%K!gUfch}t zm%u7-1J?cm0R3s8?F`uUUx48m6`oWf4EMQGgkcKTHaxuX=9&Zfh2b3OF%3Lu2PYyd zh!&cue0SJyZ%`6EEUmpELU_1BDwjiqHv)X&$;6eR0L?sMTozS&9B};^sir!60p24P z{nmKFyMT*!yey;BXfOoX9TrcuKTC}1j{Xp3uitvbqSCW7`7o=);sta5RPVE}0(t4)wN8u|<57w7%X+oQ#O6(dewh z_P}gSls@z(G1qAw^rJ^sodO!uD4i^J?(9M`)(%K7NQqb2U@P0S2PcIh=m8R?vb{SO zFGRZ-kG3f1)P1T~@hsmmrWvoCOK$|*m@u3L^)wzQFpxxxmWL3>rft!QMTUle98-x< z(4Uv>5CtkAJg3hEaV6q}D}rM+R5I$9Xo!wWgv`m|_dN~@hy*Vi(KFag3$QMLD65U` zX#mh<>YB=Wr81j$cNdZu%645X2LJcC)lU>ddhJ(%RXcCq^OQoOUe&EVYOndpt>vgX- zqWNWfh0i|+XEm$HDljn7#pRdPL7 z-vBods-6dX?J^;EvO2yTucnr%v;c)e1ZzHIb*!PVf2e$ptAOadkx@T_ zbL3nYdC|WDZ2=U}7i4G)YJ_S!iAy_1(c*<(fRT`Y8^Qg^=kRZt@Eo04uKI1FybDbd zelw#r)IOH1|AfDkQhuh9B9zZPDcL+rU)XNEZr}=-eUGzU$-%}qmPA#hu%t0s%(*J8 zT2ZTYlLd#tCV?$fQ0)NWT;I8b%iz}V3JfuDf4NP^5@aL+o-c#CRgafHGvvW>jKf!i z2cYnlwta_xz@B6jcodeHw|8iFo8nzgVov+y=e%|g5`;2_KtducFJTrS3pu8k zcPP6QDzwSxerUv1@La>JPDG}5X|GTqj+1oo;!5#gD*`Wd8|P`I3*M9U%IgHz#iddR z^kxJ=w8%^}a;1FEsFkv}K(6UM*)Qo5RRDL?e12Q2>%2r2Vaq%uWCf~D)LBT&3^aIl zEayFA%^5}-vc(SR_%NXZ!Qge&fP_Pu=c#%$&h5qJ6hEtH&7UaqhHZ(@>Ve(j^&OJ0 zi|LLl)j`TS{5Bbt=jM=$wW+akIMs}6SDdKnK2XaJ7Y#?U^(44r8a_qA;r z4Mh)1YH%eFx=b+D{{x#RZmc?7`fdyDF>4GtBCc(>M|8pU`DN)3jCBE#IuH2^v1kZ+ zN{fX_2=X$om9dtbF_wRCW3_6a0Il+Zn#ytDja}=`wh#jFOBVi~+2x7eU3^GBO94u{ zk4=l#f4FUn*3jutRba5YdAT+94!ft7F%h}3wKts#5y(WtnY`r7h5PfcIYsCHB2$gb zjCEKT=Bl22+IKFC%;@Tr4TQ^kg<7rTcBFRgm1j#icd4Fbp~kq{EUkDnwCgr7=;ek$ zpRR}281BAZf@Fk|xX`UsvKHb*L0%l2kcDJ~TW6fN-C&2_sH#FCRMguSD`2rl;NoKI zB>jdY(l(6S;gLi>#+bHqVYU<;@bH?ZwrTVW?#9OCD_rByM;hSFsHFbksVfdWuIYxI zr#*vZBh-qVGj(;J_*@uGA{d>C@^EpswP`oD^!kR{Tz3=~(TZ%_dwmIISv8ZiP~ztr zROWQrxQu1-!b(yQWtL^q55LTYG(U1I5XSdo@3lV=G1AF;|891mYu1K%!?c0Ch6ARW z`^qYLfzkOSwzAf-9D7E`9aZG3Rs-mo+i2zKbzcf7Y!iA0@pY1lgROU|791V#pE1%W#(f!wi9+xlZewz_GJvG zdw3EMHf1){Qr4 z6Sr74V4Vb_!HAZim&9*M$oM<=^e<1Tf>(wFQnridVo$Pwizowj*@CCbaP;eD8HIwp zACV%hg{=YKU?3n2Ow8-tyM?X3#t*>crNG;sV(-tsm0pKp5`3*ZmW-FxEg|2g^F z$3QI{vLj;a6T^e7%bLLY>2WqPUdY!s#yZN^TZGdr;(}WMc$3ARrW&97U5Yd;CAreO zbY=}FSmp)eYEoE`mfUR?Ghb>r9i;#IQxxGa6X9>S~)inc)n~+zJ<6lgnKqNsY~nO--5FibJ@kG8o3B zW9Dq8YiRC*)3$Ur{r=HY^;QU>k7p6Csa_%N^&yU-swC~kiGk*#i3cf`mWBSt-UjN4 z>Iv0N|MI4X-*+7eIMrzlj}7QxQ@0>8z`2>JF)A^vBpY`5f5%W#sEN9Wn7NX=i>024 zgMZ4YjXbV^1h7j+B^w+@RKLT=Yhokw0_Y3K^T0GQi`SGA;(!fI#znNf#xqN6?1hxP zw@T6x3@i<$zlVhRRxLa$E;t#!%}&yJYZg|{%ysXvkd;u8Pyo`Rl-c&0pHQ*5^%O_6 z9qm%r*%)iS>;JJAwHGbY7n}bV6gp1|zo)icB0Qt1C(q4!?hM<-qv9h@lA|bz&@L+6 zM#$!+##9S33RPiL>ijf!UI%$)Xldu8pTstA|XQn5w z!TytdLVpxOZ04N4AS*#n`6dz&XIf=ONY4w-D5=Pz&B4AsS$MtP@tE^kO5-#Avo7M9 zi4Zx30RE*p#2{MR@8=WC$4|x`qB^{8hGP@k?@s>vmVupKdN4UXE;Tzd>27&iK9m_D z<8(Y`Zu$@m54LPjQa;4VNb_CZJ-9*Q8A>r zu!Q{f^86}la-@bNlau6^j!J>Y@PFU(J|Ssl_>gt|;4}O3Be=>R?R@iQ6T~BuLv_$a zGmY-rXOXcvedMCtegic#9c+)zIF@{tt7J=DX;RXUKyeZY5=|ZmANsquvif^}Ff4wE zS&kwB6yN^WkH|;9ix&_gGZkO$mLSJK4LQCFwDm;pDCPq&S zOi`N!HmFmb=iYs5)}jCg>h_zr6Ql0I6)rbI-y$42@soe{j%1qI6jRGGqL?l!mkPuc z#rj5M`jXC@=_f4nytw%DElfH{I%^?Ug1Nr^=nRbe`PkXE#`2>6l~cd6-%Oq9tZB*R z?b7V_3gyF>o2sP1tljeQP=XB;5W5sQbbj|M=AYU3BlHF&s|2eJN9=`$3U!bGlr3US4ovy#(!e zy9H-;S=B=8&dy`Z4=VK8!(&9xD4()PQetYNwlX*8%RozBt9hy{Ev@Y=%_NnLVF><^ zYoK?93--n5*Xl(YeSrh^Th>!nF3>mQ+&hj>bL+_G-^?ql%I@W+C*CX1fw}4%p($%A zq7i2Bg~SN)PuiSDokpj!P)JG}BLG_D9_|tTpDUL_wyO1q_008?8s>*zk$aoO{JBIi zGcUH~yyL5+=7N~C8d5P3bTT7;)!JV!X+`gE7rhFOUx*w_ZYnCxsfr1(DvI)UTa0qP z7tn!Oe^~@4WX;?iOCB$|S5h0jNe*$sg`(F11A3$$Vry0I!nzIAU9bcgo}J=<#|uFR z`@>JG+8)&2Yi+A~rjYTM2hp+0KSgcf@1Z`DIh^Mmxz>t?f3M>#_Y93@tw5Ilr2G;2CdmqVI3)JTi2d|!rJj^xc&~jx^ptaIn7X9HP9k$1syyeSX{@Mf02VJE3M4y z<^B7l`vDJVLoF)%%;X~}YbQ@=un{d0U{Y}!8)8BXC_{r+J!bk9Z3+`&IA zzcsC>IK$5W?&$CsM@d}xzNn%p3s~X;Z4rcc1_W5AIbikS zn><)FoEc4yHgi$P&o|aO+Sf;kt6Q#5hF4Ln@SCKPiW+_ZeessRl(aqA21olG91-IY zz1BI*$mO7ZVk7iPsG0FgxPYmbLxhKA&i`lJCZ*r%5a!Adu|b;;@gl@}q(!lKEYqh> zUiPY$ant0&G2L4g$;2p!w-&69`Lml&+Cho^Wv`0(xu2Q8{S2SqG-P+KCbiC(dm(qNv4w#cbVtz7rH9$Z)?)~iwmXmZ`K z80*|7=^-sq{!4cPP0q^K;|+q1Quh1W`=1XL()Hr~oZW&fwAH=TxfJi4nM7FRy?j7R zoUsY4ccdX~GkghNai&gZLsb~(N%PgJQYxx^(M38K&6rqnM)eeFiqSzl-p42IQCs&c zm>i`Ie4Sm_ti;gdsQC9kQ4`8TXEo%q&nC+a$!OI43*qv#Vl^v51xupfl0_wst)Cr# zIlWTJB#m%Cs#xdq!I@9%dFvlnpxy`jo#I%+iW<-Se~p%nR{t-< z&`YXf>g;5|I84T%f6l8gGH<`^#&;VZFYv6WVF^^Rj(yO-`p)-#e3~EZK6oG|X7Gu* zioTVub62vt0C)L@0p8ob2CC^>%GAqLZm;<Wt4{tI-tEilbLXjihqOI1_sALpS^dUf*__F!AJelkMe7|4E@Y3{VV;fc3%4s%~V5F zJI%EjKK(p!_O_->M&J?+O6)4CAU1?JT4j5#DE5eq_}i8R(0eRYMYYmg8(C&{kKhMO zwAiMy%$yp6v*vBXRF#W{&Dw#Evhf#Ntj_527@~DuHMOJ+lT~?*srnfFN3dmvZ#<)$ zO&9}+S=4retPgxa^P^d5YfV+<;A*cwb$GSB=Kei$zKgx7jlEBLbWlX^&)(J+@AfyT zwfYLWL4~tn#Ms(W$&YTVt-;h+T_#ZG=~lYa@wn;utuQ~;Wudz=J*B(cV?p*B?J&Dz z79XAv?Gexz-s&rv7Ncn(B~iobaX%qFr8Fm1!ReflP1H?`tMr^e6JV(%Vecz{5Kc#? z)GG5>Z6VAjO!uItnp#YA1%K=P3O>xnk+C>yB(Cp|Jp28t3on z?Tt5R&n20n3f)X~wG~8#jD+O^G2UH^ll>2^q+% zYw5^K1eHUU>6od%`>a^<<kge2IewiFoYY?!dyF-k?6zCixj z++hCuf*mkWZ{}~!NQQ>U140h>g{~5we5dL_5~H`FxrE5AA5O?iDXMR4E3F>O#5;$e zRha5sss_f($_GXpb*t%Pl0#z+bqubKL8f?nf}4TMwGH0b!4Gm&K^3#^Gy$(`aSow< zqb$x`e!&Dk*O)*X8dS5t&^Ng;+tpV6z&B7;KR+x65+n)T+L&n(8VG_p93>YW4{tM2 z`%1bnn+C-?r_p0(oDs7Zx5F)UaE96jVNp5;IwgJ6FM7$BWC&Svq;Pr40(4&Z#bnh;IKrX~05*X0fvTirzihSsi7k~oLKeDic;tBhq+dk=5Rr&uq8eJ+NyE)}x_yX>Zc z*5b;;ww*mQAHOJ1uS`GVJ~Zh=_dsyFiI|C!L7TbP>Pv7Oyv5kwHcT#zxbs#ytujJ6 zut=v8clyoq5Gd0RukU3m1(ysiY(Zu4TuM&KpO(-({hg`Qt}5jBV^V6`v-pU;)PjJc z<%EQL5kVs3Sy@jCbeu;LldOA1WvbpvJ;)f0*KuJ?Vn4%{p<|m@JKU7jIFT6W?x5dP zZPoHc{|g6MsQ`0T9=1io@_`I|=XV|Tdq0EZZ+Bg%AjWNRyi}zs`p+IQ*V9Y@R~X|m zzgXBWJ?`jl-m|BZ(e%WvyVu+w-|nfF+4z*^qDJtiXUkMWlMYN8FCNv^j4nsN5SR;$ zI=BdRf5@2}phc=R1NEnBjlars6s(E( z^OTsAJ{zLoqT)6|2z+?_=XJ<3Bjw&?>R`AJE|!?|C2cW4$wkq5IxuycN#t)ovakAa zW_tDJa&OI6Mq2HL+RCO2x$bm22ag9O7m2#QWho_73Mr**Urq%|3WUa6M2FbeMuoOU zMfTTWu4^WurYc|+p=ZQrOA+v{D9imm6bSBXV4`b1>fT@H4T<-c@O zMqNk=^#bFiZ5s#6C-#T9JI?Sk7jk=Q+a|zBxqXSi#c`THi^o&PIu4c>Msr;{xcApJbb+CQA3CuKc+hTLd5s;R~T43V>;72 zV>_7{&R_iGoq7>d>nq@2Pn~BNxEmXv9-pSvnWhqQAa$F>Mb5)3ZU7`@q5pOBKHU3sH0&^prB;dVm-Fl^Cm-M0Gfl&Hw$)ES@wux1hon{O)dM+UsYwL5m-?9szAf#~HAeL>s7{SSzQc`UgPoD-Um$c0X{x zJmR(rRsdkGpwwy83RfWtOBv8(Tm@)PH%2&twk_B&4H_jX(v&{5M$+e)Tb668zKxy!)ub7?IHmm(f-hh7wri^bLG)txtH=2yp;%6-r5qqB- zY11YNr?f+$Fn{TvE>HMU!?$7*3NQ|ztH7y7GSxm%_t-X3fp(IqIR-8%o5;QZbGFCgxaSlykphLu!u6l158vVc?Jkz^8!mA)CeT4E3KI}H1^4ofQHiB(r>>?t3sYNH0&9!u2)J1qzTD1l-X12m(6b;kHNh9L-0+6J^S@d9cgzef?rJXjFyH@a?8LE_E^L>J z73F+!xu;w+S=z@0mmHU$4})tf>5D6l{|^Qu*89v5oZ=0E$Z!+aXo(7(qZQEDHQ8yw zoeql{ChMFS%_R`<3ZV5@N{A07lU!Bfag}mSZ-i#dkc{vRg9jQ|SSHEafV>4)xs8V3 z52TD*b?SRnkt=~&E8Gg(PRTHX(UYJ)Whe3MwO;ihK|kbSpXoXDJbMeEf1rSOV5`rz z;I^~jiOak#=>d4bHkZ$&1L(n|($D!|NhAD3U{R90COw2w=!-%SrCm~`nYkfXP$-ZL z5i$}4?gxR0iza*Tk#sns@#?z6gFev0n9Kj$Y!mt_=SVt zs+l~ZIJaflOX!qR-i?}npO688I#k*Y8fR)x;DeuwqI1FZ0B_H!6mZR~q0!~!VB5cY zB9dYZ8NQFNP;FFbU@~5>H))8J*DG*81wS~#K92Abj_F*gx_N*K6@s0 zYfxmwCLI!Jy4%38huN`Kv6JE)3(Ecs4{6O4NAXv+nLlW z+|{sqZ~%SBWax4Wq1iB~Rz{KtdvVX9vLx=Wb{$nQq8n7up($hUJt@zNpP1vYv0fy9 z8@{WX;5=5*tC$oMsDM6I(8Bxq@3d_`%MJm8BQc61*s>9A!~j85IA?+_7x9t75^IKg zE;uXp5kCjIX=+!l-?A*jzvSi#8HUj z^^rEfjiGDOfdLmTVp@ACwiNUehyy z!o)1K@vsY;IXHVrdr>cFxX%&ce2;(ul6Kit)r+%YL(JWBaDF0E6XOx0F|ak(>Dd?; zQPjjphH8)>A3Thssy8Ijqd+=-kc)?yGa!ni2$Qz0yiD(i!-vS@5X zg)zfn7c7rn?6Z-|Q(p6tpufiZQ>EvNe3xG`$BejJ>SXPRc7p-~u^59ltMt`qr06^n z^16el86g)PpHC72BhL#n}ZDXM z48&H7wo6;a7^}ocD_(YI$f6vApW9CFyKEM-MM6s$sT2?HOm~Rj=~T;{w76=CArD`l z#sa6#q%7E~W;z;S${fRZG5EkcFoZ$`@c<|^P;#PQJ{1HYO0Ona#^|z1LPYWNR`UtK z-2s&38%+HnWQ9X~|Ijr}F|1Su3A-L8DB4s<*NI$up81uUFUGk5aQL?>5!4kQ;-Y4W ztPPOasDc&Qfz?n2M>tj`^~{^`Dv6pl*qvNCmZ|bK#ZIWLkoqS$JOBnQd+TnuwsfiF z;6kd`g61k1tsqd&)*+N5Cy~d*Ym5DgoVwvO-Wj!K?S#Y@9fWR?Z;{hsh*qiTmpL4* zNKIH5%wbcT6gxMn)a_@4AgrS+kq$KZH!ItvHZxvexyoYJ9TPaKOn8N3I2bfY5~L&< zT9ic_Ju!#g{Ej-o&*eCluCYsj>tZIu=uku!tbj0OQ`qcG)`?fJcBYgi z^LiPR`%e?#a+1p*nmi!G(k&E&Xv;EYI2JdO6*|}3A-7q2ukA-) zU=O{CcFC#>zJfP(mZZ0V-;(iD%a3?)GN=>+Anp0dI(Qy>ccebwxrARigzSts{CML! z!$nvjK{te%cHDnq$2d{xyd^MvI`))8@NMR8jom&^*uGSb{#6PzSMJ{da}qS`CJQTV zofgiin0x#4e z`rDTOE5pc`t-XI^$#AQGcOtaVOS?JT{YEQzCOjh>{Nkp1H;(!&--J``q?#LQ*)*lo zL$=k(a$(?K0@=hzyRwb9%50LUXg8E>yO_GN<{;U)^&@X|WN=J%iiK5}YPIY>#$7`P z5go}RVNip07ks3}-}b%_@c7Nxx`<{;+#~rU)WWc=HKW|qI(T6YtJae|XH@9(*;cnp zX>_w`RM;8ugag)?$`Y0322=Hk8>Ki(r9=ji(*-MkCaGqt#kjlBc0N^;r`>DBsOub- zLR?UWf>QnWw;ff=c#TaIV$dt*oPO0n;;W}Z*7G19H!g`%0&Si&O!NN(!^A z*_LcZhsl4tQLRr0OIP*iK0Ig7o_gUC=;=w5KXM6y1p!-MZjx+eW<6(Qbb=S~f)nN3 zf`qq?f~y3xt;s7$ChmD*yi8~<8`Tqnotm1wT@?MKVkFjj6&T=BhUt(=u%O|E6NYQ` zsBCvp?#jeCH=xYjD*$IqfT(j))4qb@&%RvP+X=Bt>jG>u`M7@Kb`r)?sU=qUtC znC$H7{alY4vW61r&zV_e#SnM-Lw}aCyq+G|0T16icv8a-D0qs>mLC#eaBe#nhMPf; zOZT9vi^~$0TbMc8{coqxCS&aGoab;Q`&do#5gh&Tf0^_w2zl4#n{QA2NO16(tlDq+ ztjSAfKsq;lCq^-H2+`|tUCS%7V(VWnK{X{*Da(XAllC8#X@x$-um?prI}ruKP6|O%Hkwffnb`#e5_yuo;eHF5z7@r-`}u-=TdGFCNw*cDhu<%FqGY+H*Bv=lubRlaJjmgTEx|d5 zXo*VxaztD}PGa|Q#9|7)W3_ktt#Xc3k(i~EGeB7i@lyS&$5(PE)&o&6I+#$kw-7QQ#r?V?ahi(#06-TS+Wj*0Zd5=)~iX5iN0PLI-k0GnMlz5m<_MMtQ1L0b8--+DlNwu61Xk$sn(#)V1CrEZdgD zavCL*1Z`ybv4D^SBy-qFP$Uz%%&T_C=podtq6(-Zm+nukL9SYK?~ZJ=kE{eAuw=Zk;f39s-3&PN(q%t<2V-t(Ewq!OXqp)T*nD&@|l9S-V4Z4G}A@!216 zr&N}+;vO=!Oh)953f@mbSDE{Ut3@9*7Tz>D=MvMogfLoY!+06hkn|e2bj{sw_L@~{h zYYA&zBlW4CzVr>A^{Ki3A+k7alraCB~L*otrmbioyTtm_l+{^ zGl8+lWODqQXAEIs^k&{3H6`zJU3)OEv&jJnBEZe|5X)ud?s`NzdZC_a=RWh*9rz~fp*XyO2IOi4E15) zkL_CTNv#go2PZniRml)0wa;*8E`s+Y!};+G$|Objqzq+b3E=x7reIN1H%b$tZ+MfM z5H?^iG5ZZ;)f6vmVpEo1+CN_N7-2M~5t~HGn$B>3eh$S6f$Ui3)cAvWyF`B1aSboV z+%Hk-6%g&3%d+pW)c_0tI~xG5p<~>Dr81M6^F74lPdY9cp!aN-a_JAS&y}s5fp3 z>K7r9qxwC_qqz5FbF-NgMl)Fg(rBqMkIF~aU{$)f23_MACv!H2!Jvv8d9=frXEQ30 z>nG*&TAp(aPJI$eYZKY0iJnx{&6LTlQjWEeXcfEC*70o5P-tTdvQtKL=L=*NKOXt^ z4(SocVdQHb{w|G74oJw>KwSLyLM3F)dArAI^Sb%<40Rl`&2=G&+S-B~OTV(6ifCjb>jC%7q zYjDu$JLPP^jts*A7FxJXi@*{Fx9}`sbe>jo4yK%$2x#O0A+==U)~q9xFDC@%nlV8z zF9H1V5hqM^Viki8FK@!xo{|CfCbWw@Ep#pjBuB&^j)bi!utqKpO1Rjumd70Ra zzu*Q1AL;4AQK!iO9)eH;t{=f27Vmp1l{9?MDmP!lO`XM|+of}LNW{^%y4;@YF#&QX z`by^@;d3<)`a~^{l)1J=VJ3%2VjBwDAE$7$r*P>VTOTPR=sYcPUW&}SV?pjRMa5lV zB+En5riV!jwiFX~;T`D<>ul1cPje{l$=eK<`zfAl-ZSS4L1Eu96>aETgN14PYxs5k iW}TvF68t_Y*SW=LUda36ErCkt`%axV{Q*}%p#T635GXkS diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/graph/dependencies.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/graph/dependencies.svg deleted file mode 100644 index 8feeab15..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/graph/dependencies.svg +++ /dev/null @@ -1,1140 +0,0 @@ - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_ApiDirectiveModule - - - -cluster_ApiDirectiveModule_declarations - - - -cluster_ApiDirectiveModule_exports - - - -cluster_OpenViduComponentsDirectiveModule - - - -cluster_OpenViduComponentsDirectiveModule_declarations - - - -cluster_OpenViduComponentsDirectiveModule_exports - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule - -ApiDirectiveModule - - - -ActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ActivitiesPanelRecordingActivityDirective->ApiDirectiveModule - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -AdminDashboardRecordingsListDirective->ApiDirectiveModule - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -AdminDashboardTitleDirective->ApiDirectiveModule - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -AdminLoginErrorDirective->ApiDirectiveModule - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -AdminLoginTitleDirective->ApiDirectiveModule - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -AudioEnabledDirective->ApiDirectiveModule - - - - - -LangDirective - -LangDirective - - - -LangDirective->ApiDirectiveModule - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -LangOptionsDirective->ApiDirectiveModule - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -LivekitUrlDirective->ApiDirectiveModule - - - - - -MinimalDirective - -MinimalDirective - - - -MinimalDirective->ApiDirectiveModule - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ParticipantNameDirective->ApiDirectiveModule - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ParticipantPanelItemMuteButtonDirective->ApiDirectiveModule - - - - - -PrejoinDirective - -PrejoinDirective - - - -PrejoinDirective->ApiDirectiveModule - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -StreamDisplayAudioDetectionDirective->ApiDirectiveModule - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -StreamDisplayParticipantNameDirective->ApiDirectiveModule - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -StreamVideoControlsDirective->ApiDirectiveModule - - - - - -TokenDirective - -TokenDirective - - - -TokenDirective->ApiDirectiveModule - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -TokenErrorDirective->ApiDirectiveModule - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ToolbarActivitiesPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ToolbarBroadcastingButtonDirective->ApiDirectiveModule - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ToolbarChatPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ToolbarDisplayLogoDirective->ApiDirectiveModule - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ToolbarDisplayRoomNameDirective->ApiDirectiveModule - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ToolbarFullscreenButtonDirective->ApiDirectiveModule - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ToolbarLeaveButtonDirective->ApiDirectiveModule - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ToolbarParticipantsPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ToolbarRecordingButtonDirective->ApiDirectiveModule - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ToolbarScreenshareButtonDirective->ApiDirectiveModule - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ToolbarSettingsButtonDirective->ApiDirectiveModule - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -VideoEnabledDirective->ApiDirectiveModule - - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelRecordingActivityDirective - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -ApiDirectiveModule->AdminDashboardRecordingsListDirective - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -ApiDirectiveModule->AdminDashboardTitleDirective - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -ApiDirectiveModule->AdminLoginErrorDirective - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -ApiDirectiveModule->AdminLoginTitleDirective - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -ApiDirectiveModule->AudioEnabledDirective - - - - - -LangDirective - -LangDirective - - - -ApiDirectiveModule->LangDirective - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -ApiDirectiveModule->LangOptionsDirective - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -ApiDirectiveModule->LivekitUrlDirective - - - - - -MinimalDirective - -MinimalDirective - - - -ApiDirectiveModule->MinimalDirective - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ApiDirectiveModule->ParticipantNameDirective - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ApiDirectiveModule->ParticipantPanelItemMuteButtonDirective - - - - - -PrejoinDirective - -PrejoinDirective - - - -ApiDirectiveModule->PrejoinDirective - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -ApiDirectiveModule->StreamDisplayAudioDetectionDirective - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -ApiDirectiveModule->StreamDisplayParticipantNameDirective - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -ApiDirectiveModule->StreamVideoControlsDirective - - - - - -TokenDirective - -TokenDirective - - - -ApiDirectiveModule->TokenDirective - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -ApiDirectiveModule->TokenErrorDirective - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ApiDirectiveModule->ToolbarActivitiesPanelButtonDirective - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ApiDirectiveModule->ToolbarBroadcastingButtonDirective - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ApiDirectiveModule->ToolbarChatPanelButtonDirective - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ApiDirectiveModule->ToolbarDisplayLogoDirective - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ApiDirectiveModule->ToolbarDisplayRoomNameDirective - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ApiDirectiveModule->ToolbarFullscreenButtonDirective - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ApiDirectiveModule->ToolbarLeaveButtonDirective - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ApiDirectiveModule->ToolbarParticipantsPanelButtonDirective - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ApiDirectiveModule->ToolbarRecordingButtonDirective - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ApiDirectiveModule->ToolbarScreenshareButtonDirective - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ApiDirectiveModule->ToolbarSettingsButtonDirective - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -ApiDirectiveModule->VideoEnabledDirective - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule - -OpenViduComponentsDirectiveModule - - - -ActivitiesPanelDirective->OpenViduComponentsDirectiveModule - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -AdditionalPanelsDirective->OpenViduComponentsDirectiveModule - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -ChatPanelDirective->OpenViduComponentsDirectiveModule - - - - - -LayoutDirective - -LayoutDirective - - - -LayoutDirective->OpenViduComponentsDirectiveModule - - - - - -PanelDirective - -PanelDirective - - - -PanelDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -ParticipantPanelItemDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -ParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -ParticipantsPanelDirective->OpenViduComponentsDirectiveModule - - - - - -StreamDirective - -StreamDirective - - - -StreamDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -ToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -ToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarDirective - -ToolbarDirective - - - -ToolbarDirective->OpenViduComponentsDirectiveModule - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule->ActivitiesPanelDirective - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -OpenViduComponentsDirectiveModule->AdditionalPanelsDirective - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -OpenViduComponentsDirectiveModule->ChatPanelDirective - - - - - -LayoutDirective - -LayoutDirective - - - -OpenViduComponentsDirectiveModule->LayoutDirective - - - - - -PanelDirective - -PanelDirective - - - -OpenViduComponentsDirectiveModule->PanelDirective - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemDirective - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -OpenViduComponentsDirectiveModule->ParticipantsPanelDirective - - - - - -StreamDirective - -StreamDirective - - - -OpenViduComponentsDirectiveModule->StreamDirective - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective - - - - - -ToolbarDirective - -ToolbarDirective - - - -OpenViduComponentsDirectiveModule->ToolbarDirective - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise-inverted.png b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise-inverted.png deleted file mode 100644 index e95ccfb06cb8d81c827263438e91851ff27a2ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21782 zcmdqJcQl+^8#sy(B9TFegfMyyqW2b2MlV4`i$sYYy_ZO0^wAkc38M$mi5Ah@h~A0b zd++xh=X~d!-(Bn8zwf%%vc{VC-TUd!e%cnKrXojxPmYg)fk6O~f1!bafdxkY;@t+m z`E5|&2YlRqt0?yZ_ym4VrE7eFk2@dabsd2fBj{hu=gdiNz?ZmA5M>$MIegIFr*y=D zoAVeL)EJN#QZL=cH zpxlz}Yf)+Q+#~B%>+Mg&nT46tsY`f&PqhzIP>YlVN!}tLFwipa)H3rrhIPhecb65Juqzm8^-=J_yZHtdPsV9$_r!MWX>LKYmJQDs zpV^keo-{@T2*WSAzx>VEd9vem@{XkdygD@+jD-eL`*91km`|UK7(Tm>07qG!_?({^ z)i)F2N{VBog}Z0&A58IdiqWw=ZCYvvVKUQULNPGB=rcCHm=c4+Y}!=p`%QanX73s# zclrFTd$Y=trMNs@Uq!7P*6r1O9@g5l=1z!cP?5#MS?tSuBmj=JB`Z8&59 zt4 z-B639WILrni}WQ<5z1(q=(dNthE?W7RL>$Wd05PJM-&)q=e8S^660bu;`uQZxLG>N zAx_yu%⁡o2i6#7+sQ)@X@Afox|jWgz-V0+VV31+i8GVW0pdd$o|bh6LKm_1)ED$ zwf-OfF#JQfkd@9xT(63v+iT0lBrmwuX9TRD@+fYPSetps+p zomamjgsg_glYA7NBnu*E2{9xyS5th)`!t*aK{hNSPF;o1Iu=PN1)sJ}aH&N{*b`uo zw&C=B5ie`v<=>l?S$={I+pcz5)K0&J#sq115<+IK;~n+5c^BhCrUI%HjHv(>p@Kt{R)Or)oV5 z8h9Vjd<>07)bUr+NEy=8@UG8-mkCv9Wu(UWK~^9r+ixsh#z5h|FPk6snIM(!FB0cD zlJ@EPUUJKr;p#pES62}ulPS4K;$YPLgTNxop#@*u zpR5eLpF?(%$Bq#bYeT23$k226TzunDlOqxy(|i3WI%3c3J;w(Q5zkB3&fHsQY2MEI z8SSuEDAC~PyYu(sUE7@k07-oN{z5a_#FvmL`=^kM zSw}t1d^#ub&09#xN25Yf`Qr|2jGCwl)h~E|C^5G6^kVPnVIzo65 zT)T;dVM=49a)}Kdk5W9jTT#>zs!51_svi04y~ccY5WuxG+moHCcz*pV2U7|;tWGKZ zPJ;!-)ab6vLmWL#5}Dxcg#{874GH=WjZ5JKBN8f3fO0z1QQh(`^?loO$tK~}#-}Mr z8^LdGwU#YDCw!pDXHn(98JMoG+nEbngl_!skteJI550T(#Cug!6Lz{4twZU(`rzEr zbdV`rTCHJ@X7!sF$>i9hfUXAD3lUEt;fUMUA1=noyd^B_t5HB2i0@Q2vCmsuB0Tj%o)_&$01)|%DbnDW01@sNyTO0fN11vtY!cE z^u0*UKmHQ6ATEH)`s3+`&rVBZ649svCFi%It+oWu6q+aZ`A@=Qoo< z&2U~Zl2^U7SjW0j)l-m#lXg+n+mYjy9_QlVT|y8x_Nm{GhrkE%l4kPqhED^xXIx2m z(4KUP)+0}`c?sI%*H>RynE#ZIzPNLU(|ik4N*n`?C(e(B`e%qg1m2!L?c4&Jpi>$H zoN)aO);`{|CadDU`$a8TpYHnCqy1dq4UW`QczDR4^Z3*7;UAUD(5HO|kbUWN{|0%H zqk^~*)h_x8<=Y%p_kq3FDA&BGslL3p<19(dpSmXMIcr*YigIA&cWN(FY7*9@6YiJ2 z{@oZRo6)&c!k~{evF=F1$|aJ`{$A{RTz(=WHI>M7$_Vl=k)Y;x4v#QD(z-#mcotDP zlZ@G^dAi%0(CJ<1MMT=djphq3^V3lkzqw%p3BZQn1*wq_Zy74DpNmVFb)mh2^*&EgMk>61U#D%$V>qcB2vS!|Sza7?cp%x$QszMViOi9+B zCZ#jjX4S8b4<*0x33TKawrc9R4hOLF1Ne`Y);3A)Oh`ZinM8AL zMQ5ld5TqQ3?{68sdG8a!dRgWsWKTSTUcVVetk(%f4i|Kf~aOA-(ir^%@-?$A+S z1u$R6Hh{xk^B|OMXIZoVx-PcYi8WVgV{Y8!}|5Qip$|;%S8~w=i?9s9r8%bN=d0 zFSdvewz&rOgMHTAegTjyDUP-rjXz-F>y=MQ`YRBjLv_x?S;W9r*sL7-Q3MFs=Oc;R z_-aNycJkr{b2b;#2ZNc~%TD%xG5MwMaqzg{ShwjbT6-XSbo(ZDW4^Ti(JnXXCMHh= zcyTZT+sZTMIkUO)deIp@K==Q&=sNA|C(aT6%gBJi*L~`^T`;ec4{ZabItta6!Z1E& zU@O4?vQy#7_mmv2Xl4bVw4az}{AfON&bArSDNqgJ%TuauVq5O5^O;dgl>sOl6$+R3 zb9+g>wq<>ms6D!C4Ext8TQy9erWT77YC6M{9BBWp09cp(4yB|SN%LP4Izlh;`B zo*qqFa7!VmGhlrsES=R1$A(@%qxI`z(Po%&@eE5tQI(TyYonn@8+n%xnW_u(u@L() zdix-&Onf8pt&)#Y`gK2gqQR!FR_Da7Ut9@) zNLsRi*}3+XV2yEIgZz}nwCMehyGL9#RUQjm$Fsu3u#r3MeevSO5<2!WVEr_WIdxY$ zs-oRj{0~yRT6VX+KFa49dI-n+j=%J>ZTgPX8$w#?M{lWpQs{%eH&GL>eJjF;7eF>d2#5pC}lf)zZn z4y`w$uBnpO`g#FDe$><~&___)Ic7O`uW)EIcInrT)lZg$s%sH zIX@{@e(u(Zrt2@s;HZVhH)2LjPCtghT%broOA!_|=rEeZ9axU2|pi7UyajB=_Q zHa2hsqLqMkSXa&kaN@+>1H=tKK~uwPOEzd{^To?fgjoRP0wnm;Ceow%r5d_N#($y^8*Y#Jb-Cv;lxCz z$aIl0H#)3kMuem{50}65Y47y%X^+7&inouN?q9k3R)~d(DFwt1&9`>_9E^n|h?N;w ztj1mr*N90h@Ozf0T|`t%eLqa9G^){^CE^_ii`T&RhO0-kC)ll!yH{~ey(Ubjv#9YhQ zWpEAL&%)F#jW>+^Nw3PBqEwy0%19M8$g%2udJ)0bSfRIWC`vCY`RH%nMP;9#3}h*~ zB!X-pY$F+uvRE(7(}CFHZ&G;M7q8?sqRIA%02`4av`(t?StR%W_c=*UfWw;UHgEDd zLnLr&{4GKJm+yoQ9SCK%QUmY*Bc=Y;Cs(hu^i{+Neo>F|y3VsV&O%;JP@sMLZW|bXC1@@NM$;^3@O0SL^qYtI@P{}|#))K;)*;LK+7ZB&EHeKn+%%1munXvVMDpnKL9bc(GX@g4Qdh`!XmVw0%Yp-Xe^}JZKsjB}F|7VfY z*2y;M;-Hb-ivIDWv%n1G!@uZaEzx%7Hq4qm)|dV-kyCf$x3?FBz2AqZYH|=f&Oiub z`2#00+KuFf@`o}co&h<{GQf3Q8Es6EwTZO^Q8(Z{v7{MHNHe?Z=u*AzO`kJ-W&m0frvHKI;dMBK#v)DeTU;{=-sM?>g1R!ON34#g$3R&Rn{G#VD4nXfFSH z3*cAYCJ{fcSKNxEBszKld<%70l@(i{C*wExKXl{$CoI*@+;ckcNB^1L*XQ}mLH{Zx zaVz~Y@@_35sLNebWvcp*#DAV?q`5ZkeTh0celA}7`0zvD#)mVV|LC&@^lKzM3 z76&6sZDiKUS@JHfi(30#=e9}ZXhS@TC5e~K#iII2cP~`WN$2xN{B&tfile6 zx3GME;wS%t^^-vXiR_ZH(BaQj^B1@O5i`s0f$9Scp`PQf?A7h5oTIPV76<=vl=9|f zQjId{h_iJ(gPj_oO2Y>DeRSNBE zy(>^gE?$IH6AyHCrBxbhF>y+7lXgFf5tdybXKbGdL|9YPO^kngZ&hmTSd(rOM&1$T z#Rq-vIj(5Y43dZ#yVmfLq2Pw4~Unk&*p}X z@RZN`X6^n<~$n_~#s_DbmR zj|?OX#~F`Zm+z^Uq3x2|*aUgl=d}i7fyJ|aZ$^ix=Xb+XynEL?gCc~#5Jd#T{9ZaO zWK6e6e`J>urCv0@*vEeeJ5uLETv*EhwKM-#L>8hL62>#&{h+n_4{37-$`~6tM@LN> z4a*+c;MtyZmzYuOowGj;+IEjL#L)2m8BNN&I5#dk^!;S4n4FSyEAn-`SWy584!u(& z>5JQgH9(NK>AfOH=Ckw*-*7FK2xRInr+UX$aP8aotuxH#Tb<8u?3Gf$0z65WJA0zs zQQxCMYm+Trq@=gUlA}^$ZPqFAfKqK6tAA>8`rs3tYRxwdEDe{_Q4T7e$@~HORgy{# zXL@SjSPt{=%oSlN{ex4Tn=&+pj~veIWy5=5XhSG2v|VUatK@`%MO!y6Jfx){*~to? zZ+R!;OnbBLc~>s<+?8##V5Z9(?=@{X$7JGrZ7*i;_!SInERUyOiZhBjBKZuh}{_RQA7m7)-<4~X`E*Mh;2kKjDfi;EvXR;tC~}Phvn}kDYNp}R$RKDqp12% z&s0=t-dJ|lJEKU)7LYGC$D@Sett=~`MkIMb7%{kz@oG1R2vbTl&EYa@vQQ)}0O4O( zp*14T_rfwk_aYSX2wQ;ov7g@w9d&NIT<)CuB6|OpQJ2XH^TaZzc!4>wvqf(8p-sK{ z#uof&O~Mu6lp`ec#iqAEl~)kWdnpOnIP*h(mDeg$o6~x+=W%2Cs)d2w1JrniDaA)| zxHpIpMZ8#~v)IkyMkBJf$2Arc!h_>@mhW=?EBr+3Rr1{{XgdaWGbbiQNxYvJ#!5s8 zgmo&t7Xvd-$BJue|A@%u%^i*>ceWk4#lA|8=BwoO4F_a}UhqP^{~@Rs;35WRpuWqV z!`eVVo(Gu1C1m7EZFZir((oJ~5Ky2ImPUzJjH0M0DX?|zPx@s*Ktj$VaRqCa_spB0 zoZ?MY-eCG5B5EOHa&8t5$ng)s)Lk6}^;muMQBuzkJJ?oX7VVglg~nSd^#PHnNe0Kk z6oQ~k0L%Q0yuYUV3uBECY8{8)&U)U!OIG!Pa&Zt7b5~O`I0~i^BKHN2WYPDQkR;PB z>+t6FJD>jCeS!msi6mllZ#Km3r98mPo$%+Kxz|!JyS1+GlkJqK{PDkfyl(sBBbr)O z%peAEeUKa+y^+LueTSvzM!VXpp>uKq6a4j2{STCp0HqCB8sEK6SgA~j(Uc;OKQERl zzt-MKYkVW^+|^dm>K|w2LXb*>)+rrH{3y^&3!Nz-mY*|8yE&-Xm*3T2eH5@W>aej* zaf1KGNy`4#FiUhJavT$l)0~I9@(?tdVrmm_vwBICk2i;TH516dKQWobqE+47 z1XD_Of`|Is5dxNV!bvSv5G)soR%5N-Q`HyE07F%oIi{3L3VO6Ed+8eNrWSoch%Oa7 z%1c!=Vb?hHIi|aTEP!ixsp|VMyP^%-BsHf{QS{uYCcUrY?BoxJ>w1Ci|6X<8WmZEg zJ-PMnoLR@TW~XqvxroU`9@DPV&h+DGj)9e5y+Co;?I0 z5U;Nc?vioW;K`}K38M3Y+NslwYGj*-W zIai$FccFfgQ2-D{QOEQ&brYEx6vjF!qCUwp6 zNy57~&ST(Q zv=z98Am8=Ba^32%=$sO01MQx8*PM-@B1qpzqlCKd-SZAw@w0pY8`+XNq@flGhL$zu zR{${+md^vz4cLIb?@`cd=d@U5y5_SCn6lQ40gnkz_^;0#ZYJZOT%Cw0)xze~IkC76 zMGcw2=w(+?oY_8x;}ad1wu!QK6Po0mG2UR@?S%ZRn(WrZt2_SPBR~VfY&XXl6D}`G zZ}Cgu$YZ1ejOhAeh2X8+5_Zq_O|HmUp4aF2^T6P49J>pufMw!#l7pq7hoi1xQ~8$c zVF5gUQnHpT@Yb^Ia+xlhmh#u}mifbD>TEko*NQ@+mCuQ!APXjN+&k>gM1(s}ISlrK zvT95O2UiSgtPU!~NSw1Z@9>f1^L_V7@hF^NuW*yscw}NLCz=-5{BDElB?TRI4Kc6* z9eBd{W(VqrK$mk1==7;)YV)x-wtt#BC#kR2YuxzwLRR?pcJkN0o-mwc7o|b_FUA8M zr6Wc9(w`*@0^8QNrG`YXxZ!R}tT(KQ&Gu~EJMLV?2byQ(_d1+IbBt4c_%=qE;#r=G z@Kt8&(y2NzpTFHlX7=Bu!SkQ4rqFgJq*M!;Q}4mj2y~P0N9vkt3ZGML8cfs!`a&;( zLx+vc%GS8`d|8U$e|z>4;*5EI2c5(3y|@6)j( zC`WBTyWi`Fuwu{Oqa>loJi-Xz2u_Oxp%dbdoqaVsgF-@g1z0-rvRcAD7Gz_?SX1B5 zBBDbQK?$C{1gbG@JCZPPFpR8SapFst$8^0Cm-m?GA=dqJQJW zv$_-fZx$d4@D*gck7{sFlRuN|h`#MW=U9>qDSMmG!Q(`57ViCpgsSZakJUKmW^4RN zfFk%JI>Ao!I^Yo8d;f!E27OM^Stfc`M;?r2E{lfu#$Zr)Q8@QSbbomBC{ zN2wZH>f}%Np@21=aN2ZplK>`*jA(EiPzA;O=)~0lS&i4^{M?@IFTSUJpB!<{+J||_ zN>vY(8RpcZywK?>Qtmi?;GyC;&?Yt!gFD>O7vwH*KX6FDwWce|%1#Xll5NJn2QX&*@ixZ-Ei`0w(I%txMFo!r)sqzq@){&>40*k ztYj1ktoa6UYN3iS-Uh|~mq0$lV@Ir9*)#Ti&js+Zu)VwT{d18yf9>^21{K0W#-q8= z5u^CWKlQ<5Kereo$$mmu^IvS@^&m?TmQ&dV@;_Z)OHXE}Ss*Kt6zycAwg{4Ay+K#) z7s1T0eHnDlrNQB5d-j9ESJeq)PF)-mqA98oeZwExcXE43gvWv^kRV->MPdfZonq75 z?8!LJ^&%l`@CFm=R)U!^nd!0?@TuFI zqvVDS24Rd{c_YbA1}f9Y8yFp22E^@SI6xI6*kL+G(-n2e)&~GO!_rXMWlp*wcOx<7 z%Q{(CSvJU~!z1ebn*K9x$0CbsX#m~GLcbV2Q6P{-dzzX+kPy(QqjPGsbX|-ULUZi^ z8%aE;?sAGwsom&$ol^$hnwg*ejp%FvBa=q+(P`mnu^Om`Xq(+ zS=EORHGG0fvg8)HaC)pW+#e@|e%(SpZ#MDvQZah(f`Q z7$)H}!xY~}*mY(;Er=|3{FEix8x|mC8-(mRe7Fh)29o~IT)DBZ4i&b4X)epx$7mii)zLoqoXUje+?R=fGe@>1 zu@9QQ3=~8!&zJ!Xl^2T+^S?`P3REo@Ix6+KrB3bvA=Yk=!S2p;w4jhF_9z%jJo8>Q z!Xu}<0j(^9g>G(iXr5`n4p2rufk-;<_ll^CM~8SMFUE#v(J{l#I}A7P*exK?MF_cc z3&PJ0aL4rmZ#2>6Y*f=XW;=K{OA!l4cm}k)la2WC%MaF$Ij259H=BtTp1c^4OWOtk zIk;marzXej&Nne(pXX>ro0yv|xOt-|^_`KWX97zUSd#-zUG)VmlEHd6H})Ig`JyB4 zDj|^VJ)o2kve2T)p%PV!4kd10;kGM8eG(M=cqw zH)dr?pt%5K`3U!Y96bjyjNP0EyE)`&rHFWK3`AohEkIvhLuIO?gOA@Ah$@>i#G5nn z{#yCbI>tTKizPc{e}SEhOk8X}+$t5V#5thd9O0WS@+6=rpoL-^Nvmqt)d7OU$X4-x%VMJjWpT{P+ERh`9a-(2e9ccXKRn zwzmA`1fgCP1&S9o44dsG7Uq>BQ&?NKBFF`Br|8TVT*wnLeMvcBFmN_HLzqX2?2(KS_3OBJ+MHOqB(q_U6!RU}-g4>)Mw;2kWd z+==$%Cog6$c$O7BYJmOS_lSg;n6kSYZd5AUZSWgf=7F4{0U3a`ALmrGX#(Q<9(2QW z0Q`;Ds1*c7W+2W4e^Kw-p>5=ljf(FtQ9}$3$_~_oJo7;|yJmxQcn;NZvp{JDz)MGT z?JsSAt9qioqAuhtu_yK%hk_;hK7d(>+*CUnvzY4uUkEiE7~Hr__+TGJVsZsWI~(A+ z!Hp^dMQt1_)wnV!u>BHyJoTf*>g5DjxVEDp92-G+mS05hegy1^PLd3{IGH5xr`l0u)Tpwa_hQAAr{AnuK% zS)N7RMa7e7|Db$VE+z_8x_&W@Z`GdS+$Ms&*#OJpJF|KU#oY zaAr_R*_N4}Gz8uUh>;YHK)Yth$8EdStF^GYi9rf2{*D2YPB_zygL+kp!x~V2{peOZ z>(fM&kT6}oi7QwAp&aRcSh4*-m&weGP%IO4oS`bZ=e$^A{0T8VJf1F7VDox#I8Ro` zunpW3<`HSVMsNBn%eCiqLsVWCx}rNzrS#_cBTQp#`ups-_b+X9I4BhQbCf7>Zy%KF zRIFU~ie(qomB<`}2x8f9HN~rg$gn^09Iu^__Mt1{&-$9~Y+#|I7M9Nqw0R$A)!X>K9$fKr^w3ibi7P8#ud2}Ii*bS^-j;*b3Npf}_xCmkD!Unk0oAz0 z=#PM5(cpf55|O-n(EfX@<;rESbx*p!Y|->`x3o7d20W*z&IJrCozq03sr){0jt`}# zLU*r9=w<{L66k#UrhM&8I~D+*$_G~vm6!~DE9Bj!=3G9wkK+HWT|rP5?d_+Se>O6qW>_n z5QoiY1yQFOW!SNJuwE}-u(mn0Kc>DtKE8x_SXQypJZx5%SWxOn!FDePK zXNMdGz6po0fdSuuapO@wkCm)Y+F1s2_bRZivB$HIeY0KP9$~Mm^Y|LDC!P3fr+{a; z=xry?KMRnnTlz;049A)D!{tE#uj0z*&@BO6qQ{saQ_v&)HPbyFm_w;%-{&ucHw^(} z9)Ft@>t6AN4@8c>8l?{3qIfcxe0lk!)K`-3p?l@b#J;qOwT=3D)kVZJym}$?rnQDS zg?|Y&<`ApeHz?(S8$Eq*qh+OlQ=7*sfvnbj%*2z#y{vq!e~zys^dBtz|Q`w2Ft7EK&Y$-yQaCA}pWc9}+*0 z=?WdPNTq!_1=Uhc4kE^nyn8_I*JZggr#~~+IhQ(R|6#syz0+^5>kkI1Gs~{!-6;fN z!u17OisRYzdOxjjW!d`!u55l3_^P>r?z8DN2EkX2a~ey3?01%+FCJP5iadpoKO30(B>lttjT(pm7Gof-Vq-ON zkju0^7M=h22KOA=v#mrQH;!O!NTPu&7HzV~=1EHGOKH7po9i!*g;ZzRE* zloR85XaFVE$e$2rjfN%T6+>iUw(LE+P<%yit@aZWOxkEiifC=BeE=o)OtI9ou@!u?&kQRV)<}o2nC5t2#@P;ZKB#gzaAXV0{oqSNO`Av6RG3e|*rvh(Ch<0u>oV~R zSh+AJ#}niCfGh~GJUu56LSWwuZFCPU5Ey<13UQIV*PhoITVv0jeTd=QyhBgvCf2h7QFi`y# z-eDVoR0c$y(a<{qs#ONvVt;Sj7i7~jUip=V@^SRRi(x|p$J8X(Aln`XQ*_VbFYKM5 z6V(@TQK*^S8Cp0M1=ab_iOtJPa`{|89hQy0h(7-~v*f}4sP{hdf3W!Yc)g9s4FtS` z*@%Gx>y0aeeZC3WfEjW#$fk&%S+f!lUswVs!7%86&B|v}y8o0W%s3;)9@HSaE`Vs% z!cDpJH;{H!VOh^<9Yw&JrhxhF2q!noK|~dqUU<4T0QrZ?jLF(yDMw@ zKFH`T_K~9$ipN8VSB6vLBSkunSCpNPjdLX#41Mhu18hi<0;ocx=bU?~0J zU$+&sw>GyDzz%x84Y$QQK|*<%r@KX0TlKf9JAXa^09k(alUBP_THWyE#dBm*91nFP zfdXUqTx0IB)p*JGZ7ql8%uxNHqe(?@Dxantp8(5zV@6{Vd16Bk>FsDPn<)Z`$W?ER zJnvg`>eA2l)TNQ4SQ@1Og<^N(I0drTz2A3zaCsFevlc>I0DjV6gd1>h(k?$X!Nt>U z0vqMc2eMN&W)`%a^WCNc^SubBqvm6$iZVeNtjI|t+gq~?#y?5g*;x&loA>^XU+(T7 zqufl4e$#Q#A^1JlLTnDxUfu%mFF8_=PIIJ)sW5ZhcSlQBx>*SNR?Hv;v9^l*@k8&+ z_UB9@l~hAR*D5~JOz{ckG&0v6yUd6cT$VNX9Bi#ur&Dv>LE``n*M9XItOe?oBfm(& zAIxUgY)(Ndh~3&>T>lxxBpGuX0Gk0=&fF z9i^HqIc}i_lPb9U{A<3->%SX%lQLkagshCjBodXq_G0sQ zO|WW9Y9MX~&|Slm6<-U4$V#rMi2fk^=hBCXTuiCHZpBb+NSVtAwe{Q388rzc1K!4< zg{JvsPm@)pLyP3z$fSzg|14*&jJlmpdq5v`=QG*ubb?nksN=gC9lBiKK>VG9#5GreR$8WK;mA@ruqzO zjF{DTcXL$RPjjTRoQ}lEZ#U*foolz<6(bu=0xG=~eM_3&gdj+#Om%Q2%>xssmx}8= zV7C)Wi3R+RW$=ovfKX1Zg=fsky zl<1?w->=ehAxhO4z=(dt?WuiLk=N*34=qrZcxt@G1rLvcOJM-d2#_Cd%E2vQw2Usq zWJxMLw@W@Nb?YX;xOw=wxFv*#v2FyY@9cOKL~B064*nI$LWTj{u;_m?AwQtuuBI}D zEb*>$(fKUJ4Cz&Ba9pJP3)S4ogHLxa-$UKG7NhP+!w+sTf$+mHB&Vd@opam`lN)NK zvv_JFK%gvrEV6bMHNr$?=CFJ^Wvb{Nl-!M+iDo40?ZE?(kK2Nf#tXMBA9k%iU#@*0baognlzd^967p zVT;_-UGC51m#8{L4e7**E?M2MCE3deSipxu8c5Ny;zfJm5|0CwNK*w;AWv;%QiiRgmg z2Dtu{2S|OfKh~)AS4Rm48;rc?&9g?qbgU=*hi{4S1MNEVM}UH1q{<+X7lb$diAt$j zu+n|Hm9NHL7V{?=GxzQ9rAbExmG>b(wEN5Lfhz;;wSbZ0f7)?CF=Dt4H8|j5%QRMzh7U-H+7!NL5=VMFvf!))9IvbqY%j76P3+hmDLna@QZf#Yy zdDZE?=o;qW^hLVr+25ek_b2;f6t-6!=6Go3CpVk0XPf5E`P!?CB+bexcuQ94I93hR zqyX~L>PI~$CscbAy+yh8OiD@^-Jl#NhrqoIGRKEE0Hl>dcsRinK7t?4Li9-}O-crf z>RP`WuL8}IndZKmEl{hkYu(1%C3j%l$zWYxfiN3vj+NvZduLoZ3N&xrC^>t5+me#g zeaqTW-MTRePd{_izD2caE!%%aOTjO>#I!Nj{1wM}W#$r85K{0LY8d#LgBKCMzi^_) zs@9aBKrnV<{iHGeOgv~T7^|kx@is@Zfwz1jlp3!d=;&tpFSY=c{ab#^mrsC8a0YE0 zJ`*{2uhq@$W^{e<0J}p&dWpVOK=>Kforw@eyPAlH^ZU|31#!7lVA6|44tT*@nxL^G_ZFn8_=O*S{$;=aa+nqWMFJMisbp zg#oC_|Kp$NJ8XZy@c;5B`f3)?e?!0f*PqRFO*DXnjLin<`5@%>C}(@%cJJv~C5} z@-kac&kWB%Je2x{A+AEp6=BzFpKGDtIt7 za0)2?7#9+FZK9V%pG@$EwdvDGZ)KFn`Cn{U!AvlrDiT6aPRi+ zagF!$HH>3dIdE?evIdEaO58W&=`!Dlr5X5HY3!*RbKH5)1{ly2&{-rSkH|##Ra1A$ zv(ib9@u_!a0`Re!1+be-1&TBDd}@t*L$0+u4n7v&V?9MbB0t=n!d(i6k3oB^!_B?V zi_MN;W)dnsXzZ2!3> z!$ue1VqhkOeuvKNNG<5x{tKM4Bbhkro{G8Ibys)A>mT|CYY*V?@&%F4Ut=cDO5m4} z$H4N9ZP$~YAO;tYiE3kWthZ*+CA$(xzp0sG7d5z7>DjnFKA@tA6xwH7Pl~y5&||#+y_x#-boD^GINoKpC38)Y>Z(a(*WGtvUI{v z`~3%@F*o3>UqK>*|JDo_KIW}$Sjb=c7`UgCzt_dtqpHWyQpxy!V3(zHDFV)}sw@6f zV!K`}z)p$l_LcaTzHqkACvC8WeL(m4e|V8i__lY~C#K#PL3JN>!8SI{&Eyitgv^dk zFLJbaKT4{yK)n*iCb~C@4U`yW-kYUzmmV)2TxTyJS)!PpEm{GI! zdelYj2L`vn?jzPuUZUn^Y;vFEtXwnMzq9N1iGM5| z@t4kMGlzTjY*4Zs&<*r#geO0#1SgGg$%vZhCxX{zP-hn|8qu&?wS#RF{H@*|Ys>Dw z1%^|W_@I;2j;t4oqcCrm{vz|94O}yq?>`^y0r$&8(Ek@ezx$9fF*STU`On1_cnhi4 z?X^Uwt*gTNy&yZ*IMI|lg|F0GBM!EyDr>Qm0OwmsRqJxzuW@Xn*(X_;UqAIqcld4e zO==aJoSJf+ePs?0;d#pjH!nt=~q5SSgUK{N#h<6iON&i9z~K~ikeA}!*0b3C*LiSuh3~yK0;TJWg4#0>x3%?;cPe%Xc)IAT zl3f?&KH0Krbz2g&(IoJ?)w8eC$z0W{zT?B;xAVFVbAwQm1{Nqt61Et|F;UZ^L^5f&Tu?Hc9ZM#NfHao-rgo z{CpX>;J=ROVjMLRf=EOh)Ze+XSJjOv1}l3TIzc`(w%Thcq>m zHcc+$A>`M=m*&8~3}`k0c@e@G9?(0H{`z!^{N8HdOw4~2*Sc8awoc7@U=s)-9(8F| zJpKIr7L&zt@hNuI+dVdM{nkhrJHNK;+sZq`NnE9xJ=W6CRhvOe&{RFf(P1Tu{6@8I zwy$@)MEC5?ePYZzRfZen#8-=I0-Ys@To0OB*XT)j#P-;E^vd!#7qcD2ja%v-A2ty~ zkK16+Cv8~jw4%WU27Ha;-#F~+uEnGbn>$#J8f+fW_t+H^ufJb#Y-!#1-g5gB;${+@ zunq2- z7EgZxsrw4m*W*3YC*<2}#KQu<{zxklU~^ zuCRnLID_rJ7{7M%J|@q(N$5-gY;4$$?ELI?{d~BH$4(~6A{}=rtZfpSbZ4= zLus;Wh~tC2w^!U3%={rP{!^8mmjUIwOCt{2B4ozsYS4uqZE=N8v&;R2Hzxa~rfW@C zcK&9>EE32U` zp0TbIsDMMo7+8DvRbIQdn=6sP=5okm*3>_Y&&I@+LyEVm_KK&w#}x&S?aB?}uc&(8 z&`gvTdr;X&Wg2mnx-+!eOB2z0zwNg1vYOnke8{FGvtdMAG`=*0eB7HFTMSDQmh#>I z^7-sAse1mS>K>6R`FtFH#o;p7IGm@nlA&y>A;dlOD*fjnpiG{MwYyF&lh6is2R*x> z>g0LNC>ZqV$8D9-(MrL&ofNF$(>~t0T)$0@Q25AUbON3A{JV`V(+!HKC>W{t>Xu^@wRxf{ehyY&xyw`Mi|7v?@sqM1+mqO zCAxh(_zP<x7!7a@ylbUY`xrPwRLTWsx}vxxjDy{9k!A@^_A{UTC-0{UKbQVY!O!u zQM?<=)%uX!46nC}Df4}9zbmplY4;#5mj;p_9XjtNRk$lqGxO5e*X^LH0qlx8)XHI> zhs_Xap9mPW`tr1CxIMbHkU<|FTD)-=RUOaT*M3p!h&a0q%G$xUj+#>vqMRSAu6We7 zq%f&n*jm_CHGq5GR@Jx}jH@x8Do82}V*gW+-E_CgUHcZ)vkcS#m$U?N>{QxO9v|2hpB zm+C8Tej`&?ONHIIr9-ZJ_XG(i7OW)+&+9Runp1d$Sbw3b&87zbD&=Tp)*r>q%goC(4M|AmuwP(yu$h>+ZDK>k+ie zg_wi%A3&rPBhUML7DK#FWTSB@jcIt>Ub!?231~1R^S=ar;)=6Tq7Ki8h$mV}iYMN! zI*m_Cp#5IA4; zOS40eibb<#z$6`eOkpGq{@UasbSB3IwXXcofykY%2~+kPN^6NmF8U&nWIfhA}`yN zvpB-WbYg^`QfdP#?&rFm=eqCfxxUx) zxv%Gbyi@PY>^-@V!BSUG`0~LU5@B@et>IV>Kvv!nekX>7n2OlO;iVveY-c56mFzN4 zeRWB!b0kU_X1GJ&JuqFk^$SrMw!Jex-RIWqBS7GFrInRV`}0o^)+uHbtoHR!9lq#* z)pwt3b_5H9yv777yyz-N`v!UY^RdGRojQFiO9Q^>i7bdu3#N?u;L@tiJgs z64I7Aou!WMJ3nq#!;q>P*qz=ZxO~L2+oukuzH<$R-#5k8gj!q9Tju)am;8CfrtXVX zWE)*Th`RMlaYJlACDgbDs;!{ep71Vx`mx~_NhCT>ntks2kR&$=eQ>3-=z}AwFgfdYFBer~g$3XE87=w;-&aK5S_W6CI@{fjaVY`s6pu&jQd zxrFVN!A4a9uhY&_JLHWh(43ucFIBW!Z(bK2m^!}Wl^%gJ?~X_ORmJ@q$qsn$pc91j z4=xlLn6nc-(l@>`(7vg>*%L@MAS7Rmw1jl;gyoHXYlz0y{w^Nz2Y=J>(rA1ui`n*8 zAi^jFfpwN(S9%Vl1&nk@^5gVg>_gsvwpZc~RkTH(tGNi=(T0PmtVJGK~`=~^TWmL9wp^zj_`&@KV zt*QV;FMkdu{#&gP1L#E~(7&%l(%5Ys5Gx3`^CP_3$or~ zb14%tMx=l4ZcgJc1$snQzj?j+O(fz}wbA~!&{NgQdA{C^rIxFV@nB>fIw=}=qRXMI zpTS)Eq_5beXu$gXc+FXFCjt*&RL27^DZZx)E$41pw6PylEo zYmJZUUFkDIZVvC>MVdc_&q~ff{B7GG4^FG?lo=soT=Ci+$e8def-HnI1$@R#`ZQRY z5Zk6anq}*%t_!inCtY5OMzZsU@TYmAK?(7HtqzgEo25Yfv*STH1>$xXFtn8W` zaE>2`P@!uJkCU*A=+lc2_c5hq$ht6j`hwoT^!Cu<0r7kJF~K7W;As%FHlH%l+OZ@3 z#9%u6I0WEt#@PW~WnGaU8HM>lgz5VPwzOYMOd!W(pZ32})$69e-*im{R%Vx)Heky$11C`*%?r<*nA^=SQJ&))t0nY{e;bl+ zfQX4F<||wl9hb@L6*H2!mnGv2^yMF{8q~?lEEL=iI`g#o>gvr>wRgamRrPb-8ka^9iU>X+FN&Jlc205;No;S})ltio7GT_Br{59g^b$pYS zjAbc$Ts(}Nm_Eo37Z&%r2;3l17j#h<9gM96S^J8dzvanJhOIg`XFQv#fR@r)Me?;Z zZ)W5qxa5lzXo<6pdumCjzIA5p?aJPNxt(iDl|LL%rxI|XPVITX@tI(Sq@*9(A3`o2 zR9$|W)3_r!eU0~+_FMKmrA;9^jA=a(wY=uAvSpXZ zEnRq~?x|Nc^2YAeOg!1cdw3A;`4iMB@HTQfo}peQg$-Xad5b|{hvQ`ouQa@0IpamBIQ59E*aq#F4wUww) z1br*tVvO&xPuY@n$saypI~^bp9!b*W-0-EbY+qc6t+o_$_D_W@PtCL+t;3Ka;tI#r zMZw>!G(Hh?$`%TJot9s|>LXI)*X=^jjNb!^sU)-xzxjS4Vx~K$$#Ai1sJipoiiJ=Q zT5L))IK+beC+grxhQ-)w$IpLT?-4B4*4)?rrcX~Wvl0^5znPE*0vFjrN zLr!O(ST;VNYp(s`s9v@(CNbHVQ0Z7pr8b2s?qmXR5$!-LpRcsdw%`G^qSe`!4m$Oa z;3FZ>nB}wJ37h=7TdXTX5$7_;XWN^0KlUa@O+L4p@@w1*<#8_zn8I_GS?SOq+ zF|f{_lIsooRVPv^3MY{(rlwE`=XdtK?x1btH8(+U z1mwb-d`WZ_@YrLN6K4E6P|>^w+d`}E2L$J2Wqkr=(phkY%qp+V5kEZHuxS~!o%`_? z=669aD92Fv2f12&QS3+N#eWuU?ccEvD7b;Z&=ay3zb$Q}F?6Z3;0|q6{GxWVjlEY6 zl1$2QZ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise.png b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/compodoc-vectorise.png deleted file mode 100644 index 8137403549b3c75b477151c50079e72c67be879d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21325 zcmdqJWmJ@1^fyc?C5=+jASEE(As{d`jC83qNFzNAsB{l0DczuSqk@!3cgoPskkZdJ zc>nL)|A+Ve{H%wyW?i%9IkVSW`WLA2HoPs?RXtI0U$l@%l}E zJw`#HLjlP>eeOBEo$i&)r2U}+%EC~^Znv=sdFqZjr8&O4dAC$PmrVNEdh9duH_d$! zec8HJ&dvQ#@VS(=R za;rUkr;rR^U&<;5H90?Lc%*CVVIT%l*#8IqH1tKuDlVP&zMb~1sh~WU3Id~`^oJ{4 zgylpY`R7XW+Ldje2A{vRdm!$sOlyUSa)yEulD>PAU|Lg|Nq(4#$#nQ*aC&cGw&_^j z^>_@`3I|z&m7>WuVWB0@BRuy`obL{^-A{poqc*<17R1wjN|Xas6b=5laGlam@WU z4z>jeE%OGh0%!Cn-Iyp}-n(%bT+^HN-E=ljagL{C#?hkr`=X$1%j;f*3Bc4qwij&! z1lYq1_H+B;_G!*2%jhVZ$rIB9lYDu4|wkR+#R-(m@L5c81@s9)K^OPGVy6@1L_+?sP%4xarjB3KDs{+}t zbXizewnbOB=V{Ym;^GUvr{vw;_s%+-=F~5s5?k|zG%LDjfJz^O)*Va{0vwR$;hj&g zpvrfZ!Q8X;%I14hE+P}uU{q!XBNhd~UvI4mE=4@)qp(VwX7%+}M zd)9lG&CjpO#$LF8>W)gdB)sk6?F3o5^`S%yLs7%9eb3zh`EQHEV)_TNDDLkBwo!hm z1uv&o850tKa9#^0?&wkV_fBtruYKvcRlBrs+-Jwqyj8&o;T{!1g2U&=Y2eosp>MF^ z{=Slul0xP6MQ8FCzWGOI=UrY~T?HET$&PF9`=m3M?J< z4uxZpMwR}sZfkm72RqBgwWoMU5ud;b4Ne;%pukR*JWRZB^o%S-%1!rFbVgU)GPj+5 zE^07{vKL>w(X2M3nWe>Tvs7fu;f!+#wMIS+;B-R1-Qq@<(&9_5>O7+n&bXJ%B&_0| zia}#M8gVhscqsR~JQoAGs@vIx4i@Fsw!PGMS{#n?v(b@ktatoPP0hvu`4U+BUT|_p zf-8Zfa&$!w6Tlk<`;#k^Ysy2<=y0Yx_$m#GFe?@J-Sb5#izsp+D56l23*{S?a{iX! z0-2c$lF!95-@XX>fW$j)$j8W9*&03A+w$VhpT3wx>D1S{V_i0<2Jz0GbRPYj`E(-x z&nt&&7zvmw3ol)N1;#50M@6DUye*9AgD|CU%NQE<9LF$muRx;KZ;=V@XTjof$|G>G zN(isBA8)A>S8_v+y%?+$Uor!t=}!!M&J<)hv_xdcvBD%h0ZZrtiGB;LHJ7#0sh)l* z1)&)F(}l;>mq9>@K8j+t5>#*^W$I>Z#fGw;n9_y=vC!}D+V?JGq`087+L#0$?=>fO6{b z;NbIjV_Ya24-QsF)m^eUpY}O^g2-A%h!6aT4kMM%p_Eic!uF>9`>AnktJCr3gMN(o zcdyBfmX$I|FhDI|$Jy`629Ec3cV}k%g;+J0*;6_Ch9TwHlovnuS-bAAJlBCPPfVyU zMMw{)NvgZ z+AOLVp3cf+*aRid13Z8OAX86;^rU2PCa z8LBOb=GA#|H9Q&irn%F6&EDXUx&s~cspQAj@93xj?MB<;s3?ex4K9d70ZB5-)Z9libm`B_7NzElx-X*v9~PgnSsNu9!Zg&pY9= zpjui9Zl;quaPMrD+l{=$<*4wt`1~2Zg&Ts2_SP2#9^fyH=GN=`lC_iSy! zy?rVh*F9UW!)lf0xm>GeQ+gUK#TMCgf{vUR)+~H1xmCWMwa2Z)=DTcGuVhn86YUiD zhCW5rGPdpglK)0z@$NNt(wFk{hk;6c9o3#cF(+KKN60(O_(xHTG|A7T#q)!R2wC6S z^WNy~M)aoho)__+f1EzrU04hDWKIG{b4YcNSKUX1U@+2kV~*x|($Q%!MJFHiB+TCY zIJ=Cos8!wLuR6l3&`#%3$%@FN)k+TeopFN>sDiqTjH;2pJeIj+0_i4pOefKKeMd89#1V_QxOgNVU~SKxMv7h3#}XTkF^K}&Q!8iMo9=p z&~)qX8J3J?Ra9;Ba|%=)bB+|3lOM`Pd}eeNoIj`itJ0;~d~lj|NDVA9V`|8v?7B

                                                                                                                        rDyEFG=J1n~GGY}B}aNyqxGRbYf; zu6q@Oe<<(Q-CY<<%UCqTe~k{viEn632IAK(!?$&MMi0AD zs!0M@p#3MtW{N_*Xiw;V)k}xzyjK@cMyX}9>mwhe6=Dc(>HNFtMCy0&>zvz)6a9+>x)Cygw*QW1KWvypgB;8= zwmB|L|1yAhf*Q1Ore0G`BI0wc0^4uiTIY6wO!TZu-*cUy8VvpTR6y5l^y{jE zq*49SMqo+a#}vOVN>b#=^KX1WfRSrC<-A=q0x{F2F;j3W+8L2>4{o*e8OtKd>!mgc z5Ia4;fb;$WPnB<9yBN zq^Hlm#eVH5PLa>*;rm)eRRPle;i!iR=Sksw`65x$sV6|)^;qYDyd+`tK|7Wrr$md9 z@X(ErZWh<*M?cG^W89fC<=1WVu+ea1lE(!!36MNYLISIoNRh+$ni%FL#7>JFiKB%u z%*VfcObLCvndge=g_MoKWLkYbRyN9^H-2|#550`3)a6fqe^uI&>%GiVUmw-6q>ARU zeLt1p7kl~oJKX0=;+qZ~OL!T5`Iq2wQA7(j3HF$>$3@tH!TrpcCrlgo0-N3=g{B;3 zT1WH`X<~4dUl;hy|B9o6jz55RGgHko6*CyH5qxy<-d=jy1y54tzIM^B@{r~Wvr&O*gfaTolfPg2N_w~<1alNkEK1@{V}wrQ zU?SZ;w|eSv-F652L43&A(H1L7@ADVp9#ZNz&kch@{pskigUJChN{fHgXq-;E`E1_0 zBx88D>RqM#sc$sB*LhygdT{T$NUE>AVod@#8Uy@9s%`a=1e<#;u@|;fWF0moeKzb=S>it~Tp@XZ4>PcYbhx@od zQa#|BcY7?|J=iashEthN%6#F;WmU@cA`u}#(OX;US-tFg=JKj|oSpSm;Ex&pZ0^80 z11V9d+>XS){pPQG4(Dh2DL07!D)e!ht~Ct;3-n56bC=(+#ObHTHci!P#^+E=jSDgx z`U}cAJt0(oK=p3GZ+l9MY?xHOihcFCzy#+hd1r0e&>4Nn;Tio1juDp`Q%l*`OOWv$ zG_<$>D6sPFt^-qwlGeB-$8)0%@=G0*1O8*U~VQUb14!N&AO+6U#H6pBD@9u1uw9xXdY0U0Iaq6f_2;`iS=QZU`9E%0vH^b%%mK&&#)S1&DrR*3z3+R6?%*{q zu{8(1mc(Du(#YislHRDrS!v!=Vyb3-PtED*fYlSS;~11NJ++pH@3YP@|7yxyG+65S z{UoqD+QMON--6rBUI;!g#GV4vX$Ly2e#NIV)MfLjwK97Fja~4Dmo72Ie<*$F|Ndjf z;#iPunpm`|_xt43hwY^QReSMAp3A0#N`q&{X-LCTl*wQHCVxgET-^%*T;*ck`K&X! zf`t0NrloZa2R15G07kRx4;}qHRd@8<4Vr0HcKc7A4#>AGm(8p<775`EKZN=2zWbLK zc(EJ>tJ21l4*b}EPd#Vm6Bm^DR_ zHy+FFai_CsZ`yoA|H93()I7p1fCT;$9e{{x>5A;HKGBXI8+_IqMg{hWd^t3a(zXUJ z+5dk1zI^mV!(q8Sa(?h8Qs3hk<*%20%e_T2u4zOB3QAsHIBW$`|H4Y_roJZzjt4_s z6|9@TicmSWh5aQ@==F3X;;tb_$rHDn+F+{|fq1aOe}k=YCh2D-?+;^ZWkQVpG%~Yo zDdN9i9|2`@=-wK7lj7!BBz62XgYbWRM4_To=q)k?)bx>;V&whrh5zn}1!k{x7Op+E zjK};7yVSp><;}r6;35X*toM%13qPBdI?MhtnX}X!i;>#g?<|!c-Fs5DX?k2n>;=0N zH#oPWkA43T>ET8t#U5};4ITE)eSZCzy4!G&+p*ujSsz_%=97wd+GXTm_ep`dhdJqP zcejJRc74^;_OG8v7-=(jzBXU$rv5aG#v`Gxc|HH%{7-Y0_~eN)ZT<3>fb`L^$=6}6atrNN(9aL=Hx<8MHnd1c5|{g(W8}%Tf5a2PUR>Ns~Js(4k|2X z%F^-u<7`D-Rz_QNnFL5j>G>@ZOfF%4+g~f|1RkD@d5qBDc*j8=@xpw!sKrjNXK3kU zHc92B*(K4mhGL_=$q2mM+2E+yQcIb-pFFFhSRuW*_lXEV2b5^4Vy@womMl%go#cB0 z9Xb6kF>>LIbob+;ttNKse$C#ITF@JSBi_Xg_ywAv5JSGiaa#9&ua01yL&%iND+K!F zuC8#irGNDQ-Psh@?e9$%qt7T2eZBt;+WhHllD9>NEZbfvxFt18@epUz}24$z<%cEUy%S|8ZJ8H596JC)R6Op1mc*=A6;CC zWDAo_dQd^iSTQ5&Q}K_lNdYgTSoDnhhl)pOeBUu? zS~g=q6p|qOD0Sn~chAnPQ=488v|6EEIiZub%{0kd>xv78Q;_uGG`2o-LqXH>LS+m0 zRbi$P;Gzq`jE9cW?dNaHT{71G$SpnWf{C1IdpX~Ol0$PEZmx;`=>&eDS?D=hh!n{E zwSt1Ye95Dh{Q`oXg}MS!xng>acE3FC8&#iqvQT_!=~==UxfRA@&(UOLd7{Q(UMr=P zqm)DZO;|)(ikYqWwEzY9azEIr`C5O=u_0g`1)~EG6{I2=c0Zbuh_C~leZsLvv(rb2W z6+)1*6UFGQFghR#d6A7D9Po_Ahkrg;J=WeqoY@bRe4<>sO6~^aE_0SlQAS+CQ~4pk&jJX((K%o%K0b)8_7p~9F8tKG5}X9i zRNSf8tzP`JQzOk7YosM@0!fiHuqX8S8#pEAn9oDd#oYK?ie_vu=C#1$nYqE(ccNee; zZiucjoTv(^41a^mrl{mFE#3uA6IIDca(nqGDRs(cwgF!tD2mZxkBYEW6@NvH#HH)} zEA4}05AHghHN;8&{d?-I23?->js+ElE${xPtfsgUDNuH{jYwI3Jk7Lk;jUr6_6iSy zge0VQFLxOdhb#yI8r2pLLl!K4TYhq%g$#%Y7&&j)#?QqTHJZ`*m3s}}Ebu)NtMXcI zyCo+XVMXG1#%$!UlDN{3pQc%gnKLp@@;sT+31kExBj#IHqr@t2F#vSif@^+678RI` zii$8F03vjYxb~G|B`gTHUjh1Hzk;v7lZdGO{htT>dmhu#fRW_Tes=oe(C7IJk>gOj zPS%U{v|{1;Se60~^0Z5_jJ4zbNv9vcq)JCOMo(AdO%y$Z#$ehgC`^X%FYci9dHK-M z8oREVeRi1LvBJb7T42lOmk^jG#k;d9pxeKgh|uolvYsO&F;{t0OPa}x4{R(|PKF@o zq=WvtaRT;IWAaE2P}=Cf&cPw*OA4BWEGXZU;ga4B)KhBDlf!%-=WpcNF6Da?Z?(5z z;uw4l_{%DrJw~auv!d;;((1B#wJ%~n?W&xcu`?M{&K;}4 z(Z~5Ur;>{oUx&R(3C)gs%6;;ofy$`GckGl6S9r?@Ups1@d_7Z3FdmScDgN4p!x6OV zwdx~x_j#PBC*H;w>;a|Su@x0G-JXPE01pjX7P~rO%;I=d!I$U;4f}D&C>z-R;+yqNSMGe`(Kw$hv(OK+YoZ)&a&LWm zZH*fuVJ5#?GYM?>WNN~@Qum(9FGwyvG=_GA1UP7hF}M@WfCvGh(_=2x%h3Ed-etSx zc?kiR2@{+qSkZe*{PWE=NI)aBM!_5r!?d707wIX@8LF^L^PGy2E-o~f|7&*_7da{r z{CODiJt|7&RAYpLy{6a(TYh(EisR-ZmzV2>8N~*<=Zi%7T0zpZ86K0am5a!NzPV4{ zoJ43f3^b0dnA&?--Ou4XdA`Uk)bot;XB?7rIVDEcKSG39M+8fc{2)qgHM)QnW{dSXYn4d;VM%=?NR@V zg&NSS^r>M`SmS+rFT0p|-i}S=>r8t46nbt>uMZj~W~?K>gF+_1bmM#C1iR4ME!np@ zUT%fnE3`m#&%JX2KY2pI{GVKaxp%W_GLh^wvCGI!*+*javlAJzX(EG?K?8;U&@--B)MEyka$H3o zIFY_2a#h}|Fpxb$kTCX{tC|^WPH)II;Mn}6gDw~dY7z_v}q6YBJ?W;Ov z@!4a~CA%QRZ(^sY9Hv2T(k-FEc4%5*o}`?&yzF_!%*br2)jtej2!(*9J&w*$HVRSE+ zVj7$%^_CDFUHyxF7fh-iS)2iH9u2vzHAj~0JrYGhu(tVkaMFD4MeYfu#U}@ac~)MP zX|DqtKC9+T5(1jfL+=>eH@|jFz@^(;9hJO@T$7IE*aDB}`%JR@4_Rjbx7N zF=O+9(YF+{i+JYuw;`67$;hVkQQ7J||(G}3Q8vxD?r=G+-{NRGPjB(lY_he$FOCXM(Mb`~n*PrmVCOo%`9J}G|-uH?F6=^ec`(z}QU4_+Icc&WNpGSIzrb@1c~s8wxxY%LDJ^4hI>K-eJm2wWxjm z81N#B5^;DfxJ-G#9)G>N$w({XMjSYxMHCt%oMe!=Dv0}m1qDVs$B6s!QLWtxaI|XvHG@t*}FQuAP6Uu+Xf!kfEV;(`AvflfOdW#G+8><+e-|ghA8ZWD`Z(NIU?Va<|8e?N^x_yEDK}U{cM^5pd_W`ey z&p!fIpb@U@{r-EP|NIz_8)@^=V9)32w-S!s1a&rQs?7!AP#5jQ9*Ez{uK?FfxOE?6 zO08+^_;42PK0!QaDzXPZK!V%BS{(ajg0^uGe+%YIzUOya*%Yoh_NVguvAm4j zLuA^)96*FKNuGNl3hAK=W4D9rIj&j)m;g9*-p91snRCZOstgHLP`y?8`S-o$=OS-} zmfKI84Ox-i=qgm<=k2Tdz8_r~Q?K)o882V%I>dvMm=+4sMCoYWu+j+JnjFr~xv>pE zDnd^i#gua135E2x2stt!QI|p#irfw-vd{9nDhp5w3N+QyI zJHtJ&fFy&iUp_@p7G9uJQ$(Q`veOu)gL9Zg@Q=wlz}Qyu65`xgDM96QNV$L_xVJ^Z zBo>2Pfs=%}?$iAh`)s6M$DA~8{?PrJ>N+pOoEpHg^F82!xsSPl)#dH`KU7x(4nD-5 z4VwT_%MaRI8A8H7do~j!NORYDj{Y(CRDTU(ws41@%`NX!@?|O#T1>cR(ydycs^h{D zgEW9G82u^@dL#Q@fL_2kvBRyUVYx+PV#-=2BnK~%(^ACE^ekRmV@ z#x>L+_ga(A>0?oWb^~r1hIW)*{hB~TOHBgl{>jOcqf=H;y-%Sf^t4TOnjJD&-rvzQ6t|N~O zI{s9`_`Q2lUNJXY1(tYe5hq?&inax~mu1I~X`(>bpN^(!&QbWz(nwYL@!*qv$E50y z^HFn@S6dOxbD0b{IBQyOa%pC_YQFZEJ>JvGCzLSU!^tW7 zW}3f+IYBL#Itx!Ap4tVTmfI4P`E$zi2m5Vx;K&=`SMu2@`h$Tchfl6sFRXD}Gw`jg zM~BBBq|Xi)Z}|CgxCXy_$&xrp$taMY8lB;_7fC=&4_FCEyaAj{N8cKO=%QHN(eC9^ zwmfFUkXTAeb#dv8w6I?(Ny%>>jdK;6cgOl8BSIEOE{Kgh|AjlE zDQgiNH{ZqAE_+@crflyNL@sLapB4@S*p#=tBB#j=mBst-P1rx=b z)1aQ6zho(GtaV*e=lHy*GcW>6e86dMKSm!(Ve#&zg)uN5F2CTPk8H#c0Tut@b(_eq zWYw*Ui|7(JvDJJngESk!7?zy-92YWk@tKW2z*&S^z7>+P|0u?#t+4r3!jx+JURA5| z&a_neIOr!u`si$~jmepnHdRX}pQXLg6^Hj707@X|2UxYeT5Vwdq3f`|do?yaZ*t{s zJs6ub(e`wjoI1{C6sX*i!;|xzqTFpk`FLQ?!!otueAAx>6`)s-K(?M& zi8*fh-Vj;P^yETCO^bxL=U~faOngLCFaP@T>Lcoj(Zc6Mb8pwqCVno|uRbpK{SPzC z3z$b6Gj+a6%=1z9q@AhK-Oa5LdkG2ehM)skO32Mlm0;=1-aG$xSHA%y2kOGkTprF$ zC(yd+nr1dq_Yq7nCJe(?Bh+krRZ?hQMNGB67@77m+WB`pF)`2r$D(e}(`FvVj=e)i zZ!D-#KRr6On+)owJ_Sw=<5E*cMIQmlP0fx!XFM-Vo$?p~Cqjo@vJeAV3)9!F4Mn3h z;VG$OX&R^%#k~YQ=JC9h<7%m=w;72g5C4@f`D_b4s=-kfdh;2tbA3lu)nIzKIPfQD z=>2_f=G3wD772ryiGni5-Id^KuZ;f8`P$>=u8F;`W08Ox^uKk{eJan@ASr7$&ewMw zg9R;#XWB~6=xI}Ut`;OOJA#z!EB~c+=m&0Em)V7@;-=HXIEdAr+dH+_HsizNHi!rN zl;1<}YCby_>~2yGLeOPd|*VqJ=j>gAJGL}`dvza>hP_Vae#VUQiu&oVL8*#30qSEuU5S!FkVU*KL7cCjHJ$~QwcxH|zo#yfyH=5u1j;@q(xQ?&1yi`nlah$9rFlqUVlExGh z6M)XwTNPSby*!1-PZPJ})a*dY%DI;@U+z-&xslW2*C0GG}G>i@JN5Z%@FI6f(V+|??-7W^>ICQ)j2^C3A!{44SnRspHy7?sr; zjtqzsm+oVrLm=e`2%BL$T}vw9H}mtt*iQYd@_hfymJg_>lQjwNQsM`hEvWOH(HGRH zUUXVz%pN(H>tJB~@nPbxRyl&xoaXW7#GubN+>si;bd_hZ;!R0avecBxI-~!YVYM*E z>o{MK(fICvNoq>%)OSS%I9TUAiHuxyD$1k&)rbc|0!2N_s|V?irIwRbMpi2%E>i29 z0~vs*DROYZiTK>d*l!Bdn-9)6Gcq;??h%Mgw91>g$$)dzY#oM)@bC^)c#{q|0JlIv zK00^xZaVSjW<=t+`sLWjDI~oFd3JE?J)@I1984Q#d*_)zhVt@9TdgKmru%{;r`4<@ zxp9WPfcsXH?_{#?pPrbIw0>YzELLgs;Xjz?7HcbhXXPF$+|+64sN=7g?7MrIW}cI< z|I)_s$pagV#t(_5ro8$|fQTsQbXy{`ob?&8s%Jn3(2>&%BIHAvLi#w&22rPEo4zjA zKE9dt6}4<Kjaj<}upfoj( zqH1WD-Hz4v2d({PCEp)b0xQ98{6aQSQiw&tT*`OyGxb(mL8h;lHqpBP4W%VN;@`>5 z?~sKxKB)Ljr4M22x7Pvtb;DL4S;%wF9Gj2E^k2HHHm3G37ynmbnZ=%Qj<%E;5t9o9 zi3yZNc|R|d_8!Rc`WdisUjc1FNe z=7@P;9C`nmFG^dvFc=rLUqAZbGcfBjH->Ix|0@I_JCMkj*vf_GajQ z2p?P@?2M2U^oeS%JC!^iO`8&ZG*TFk9(~slWW}|H^R6iQ^L2h^_vSmTYzVNilznob zDa#~|rd0*l;GcU9K;lT&c8m;FvCzGmmoGFtP6#%O78fh)%xW`xX=*IgfPCpJ4dRCY zZ*A|%OWKBDC`j8Hh%@z2x@J+~#mc0ny4xI!x0K}RXQqlNn|=^dSgWqFHHlyzDS-d# z?8FPfl%vl=s&V(_a?agQFO1yP?`9XUQx)Z4Mnh%+-A2wSx{_EYINUs|RFEKgz5M#= zoY<3(0Z$sTX%Z%o1LxfYKrXC?w5^FaQxTAAMnGkE(-l~|o#Mjw zp2+Ua&99is}nRCG?STED)D`jiuNBF65#0+OIn+GIFN%a8?$#-sK~ZF623itD;*LvW4GyD56m3UqE~@-ikTl~>*G%7cLBTLPK| z@?7P13Th-J_@4_P30{o*sog>Pkr<5k?PaaYGVbNB$yd^zcblCW^=PA65XblsMW4S< zixxFE@Yy42T}yxT!LhDo7V;E`R5I;6>`7aF3jjuV_r9ZSukuE6{_2|4mP&xOm1ZFI4OB`@3K^I!X+Izq!K&kZuE@ z!-sr;f4BQ1jGV*ye4s;hyC}~J>;R&_;UkYvN{Q;<`0ij+mVgfg zk@Yc67?RqjQ3q}a00r5x8EG}DCZ)+Jm*kX5h4;D0KuTWMj;DHc-k1P%2|(g#p(;YJ zrdOylV@t;H?GqsWOm3{^h9aHElZIBP?OvPduJ}T0jna-g{%BmO#!OgjyF-a=AbA^z zgi=M468|yIS#^bSOMl=N8P!r5Z>I^Jjr-JzecsnnD(=YRNRNqT)w;I05F~XzrZEf; z#cn)&?OkWp7YKu7=DNWye%uZhhi-*wQyyeyekd9eL3TNhi%R`*&o#Z0@Q7-rP{=(C z%=@CBI>tRs_TEO;sW0hb0u6p4@_vx+XFXm;8^R~W6hAiD{gI?=?V>2NZ^mh+;c^(s z9pO&owTRAw-+`zA{!aRGO1%W1DIZe6641e1 zov)2Q+3e6iHvlq`H3L)DNYMLlr6pc5X7(Qb-m;&R4$Tcii;$L0ZHub z(bB34hpQ%e5J%8E`USi*#hZ=U$U47ZQ!Hc|O3O8Djs?MwUw^zVOwf6${GH3etnv^^ zMS%T~&r9z;(qn5*z*#lQrLXl#njuSbB90?F)R#C&{YU9_sEc%?Pq|Mbt{-Ey%a*=| zPnf*RG!gV^FRODpK`LM9Dk>&wdGFK*%3X3OOVzLbiZ%n`z3SN55?O@@^nubGs!P^- zL6@_?XK%egGWkSMe?JmB29ThC=^i@r+7d}6WXQ&9n(m@U3&`5fwFJVN$e#nXZ2dwU zFLhUeTOkknnNaG(y4X;hc0zweZC|R|UEA+=3Iq$(PU~l^L4NYh*S=l(P7c)cU%GmT z^88MEmq)W%$8RXN-GYFo9~Kbf21NCjOJ)Ub<6L&Ffz_x1Y)}-#KA+J8@w1TzD#w<$ zeCWWf&roDkZdL!F{{My>pv4sJY$zy&pp*FO7o%-HOcLL1P*G6)bAP{O65DhYE5I=N zxtSSv0!BKIi>0;>gi%MX*l{5WlluiKL1T9`O{>W=9^jtTr?3;mBk z=&XU^7Ur@fw~Ab9>{`3>+&cCB8$4xirQvb3+Nz4&Qze76h55A0&&P`1oY2R0 zN{wp6im~?g@keSPWoGJFspu-EnpNo5Q_z6YxxF7$2sBN6cqYoW5QUgz-{1k&ezB)! z+vxK(dYC8`Y}t1P)f$!uwe>=SsAF>6LE%i)3^q^@?m^qva$%apBX7y5%*1NYummi_ zqn^8G`69*!W^mB82i8>^cwXcs>`A6Z>dQaC7VVxAK zkSjC9Xc+wrKRa2yEtghVlyk9`E9OXuxmJK&61pPK4*K49Jc-ooMOI+baw*pAy&?3h;~NL;S`eD^nB^x- z^0CbuNt&?8m0%_SJ_+h|1xn_0#tkWE`$STe;avw%o#J`h8D>W4?{CR%O)V+})jyaa z%-pkL1?$Qgu}88XGUb#ty#>GK+_r(tx*f35#K6kMe)u7QGfL?6r7rVv;^3L8Ta_M# zt06(mQQH{{LU`u9G55!Tdgcl&+L-J@b17s@fcfE%XeI%bp;{f#LbpdsUPjZ*VVm;s z!OO#Jei~fnIokHm;;FO<<&+JWWD;#d7++K{lko@I26iF)GqY(O^O<1gD>^AS7<87* zvJvh@UjsCFY!Q~%!?bS(qv1pdm&4rn>p&qSj2kzsLdP#iE{(|AN%X<3vg9iDWfe;2 zIlR5WKc$@a;LF5fEykItkBDO04~3?L2Mh~xEi7W9*SaWn>iHjqQc5r!uVI^b&~h!_ zrG6%JEdrg3e}`)(o{tL398V=9ikFq-J;RJ?O@@ZgB&42mu&gP0(|4L-F+-qXLu~$U zlXc)DZ$<}Bh~=N+#~!_)m}yi_woCv?miIuRA6!OsoT=OEx@<;5v3plP=HAEt5&ScH zbSG>vl_VmdP4z|fQZa8AVySnfjp>=IU-hf(D=GF3yI$4c^p8f8<8Lo-XgF;WatGEF z%Dy>ccpH3JUZU<@K~d#T@U6-nP!u(6V2hAF>~bp21v6iT=HB%DK*;g_p73^^*VM{U zk2~H{UsWKGDmIFm5R<=pKl3$8N z@c`~wxG3ms^4L6H?jkcjzF#UUack8hI;^A#T_}S_z?YI5>3_DaE9xJdW{c5mFwM$SwSCNtIAKDFVZSQ4% zE0kEj6Bln7%YX9FIJNE3lDYZ{u}Rmi9mIq|sl_US`t!wuI;{{HgW>f1yBLmKPV0zd z=ZGe)%&tRqQ&6u0Eb}n_ha2~rB)6i5Wbc)J0X&?%zc>10gVRF@Psmp;Ki>Y63SHll zPRfKIJmeDIBz3-zX%x;)bsfCijjGw}BANy}HeOjL9_geu_&!)-q#D54%bbX}?AU#=%snoXXl@U7u;?lQ`#Q>BznX69u9YmBC2rg4 zRpsl`bO>FIWqy5l7qrI)f7MdkvGBN$cA)BvrBdWdfnWXLQ6Rh zZjcjc3vri9guabrr}gO|Tzh&QdiZRG_~qJiosSdtRmYuPRc5)JIKM1-5~Cy70eh#` z_i^1yrp&1>!s{V7t1d@=$@@c}&n_d3ISuj+OkJ=0Am^t{5T~>o$1)e?p>T^R7ccW1 zl0~ru<==k%0l}>$2_<7-Tb0PJglS0V)f&?kdY!maK;E=OR!PhNV=r?c;7dShrAF{6 zxe|Pt`>m94%xBfEsV>+rG1Z6qmlBlyIUcpa;k;44uXVW=otsmgl^R6Zsm#0?{Nx%I z*AP1LeLCfLWqFik$dbI4mohF{2dc4a+mc*BP~&H>eO!rhXvs?IH)0*v0{tqlS_Ghv zzn4aw`(a;oXDmg?%oZ%`jO8+y4gKa&R9b}A_?UFCVV|^dPD|MMH7Ql(e0E85Jv4Uk z_=UsvEOU>xZ{ae#UzMiVXtDhBOjGHXHmQb?{-fd$MpUixdY#et-zVG zXHz0$vo#Bb;+{pGj&ziuK05bpQ8^e&hi*o>pkKWqx)720CTY34#N2xV%`wt)BAt#` zeih;Um?dF9Uc#NZn;!er)W`bNqB*a->zgx8N2^|t-|u~A8gHc!el~-+1dR_BRWdA(BXDp@+4awRiG__-{px_hK<}cMx-|N5 z{s|hTDe3UAs*JODMK%5%chq5w?rXeUDathu<3}h8Po7118|h`$az#$|H$69!{APWk zRh`!?CV=?l$96!ZbRNzSy?FI(w%Sz7S$5^-AtE{Zc?3W~s(9sfj>I~~EwA^@-CoJpEq3<9JV;N4ho~TM5B!ejIgT zPN9V(~EJw+L5+F8P9CuSIS*E-%WFKK>1 zoDZdy7tg4|om}lA2`eblE4B7AmI@XACMek1s@2&_&vo{@R~Suu*Cxy{g6{xMhA`yY zL{&S?BofUjRWc@bQOL%<@eHDrQuG=fumT#dCbS3FzUE8HOZsx*Cb(s7Pr zv57mOzG8yW*CTOhLa}gGOb%z|6C2anTv#FsM76KWHQdDuwd(q1a9wr>$Z{jorf$oGD0*7hczN=-NPVl#Aq zZbRECU7UQe2`|O>jcR=TZ(~0UdbPXv?Uk})PWma^0-n;Wu7=r! z#puR6bcWeqkCqnSN3kdc_O}Zh7Z)(%)_duoD~P(?Yok!GCE(n5T##H{;AWfdW}%}E zb=8njhdNiaW#ef}!8F9O-KHIxn{9&%a|m$5NaI|-JClZ<2pp%TcIn{tvtJW0uly>r zfVI8)UNtx=;?&oc2`849G%~BeT7Xo(-I*1Fp9-;zMil^%mcuyM@K#o8LKZR$&$r#4 zrCNH6W-U!UJUkW>1XY0>HqvdgRhufdr%V=;tDc=q_#}|G`TH{UUt%rn6u%H#lfU#+ zm)Tj5+BXKvHGNgROKQ(v#GDkK(qoGD>@lEn34-Kf7WzsSiKfee2B`(BTY zjaq?P{Gx+I4`d#F^9Vl7v|X>x@+J@2p9>;~*QYEqg3%9R*?z5>Iy8pIM@N`-1^7DQ zxHI-@xX9j_p~&mjQu^Me=)j)c`qkq-VF^WcGovMIknsHdA7kWQwK&j)PZ4WvlM8ID z2YOmSR|*1BKWnr>ViL?r>mr=+(+lj+DH~!bW+4*+As6;#Fku=la8sOlGscwC#K#XN z=9du?i4=bnqZlvC^_8O*OiR=dGazvgs_)@{My2Z0(hv9iq_V^1VX9|yX3bIAw(GGi z97CY?)!{Y3zO(zU*TRX~q*$`t<)(H&>cMq5A!g_m@x0e!+cU#vxr(RvWs1Jsod8>LKdKY zZ*MZRt4~*%?so-$_r0?BSkE_p%(x`}cw77HNkrYAjG5K;>8djjbtxyxJD6Jx%P4$M z;OqA6wOyX0Of<2HK)WVUE0y&DPIfdisiV^R`DE5?i0UZIj%}$k-~Vad+=JOpyEwkv z(p}oEQi`Hk!U`!iy$D*-xylJf2+iw~62wnJ-k5jZKi>b}^Vc(H&hwo!bIyF{na|Agx{y1f7BQG2HhuYCI;V21 z>^lImzg!R7?m@($vb~p2f6R=-?uoqdAi>#o{s{XQhWLv4%~iP}NbJf%gEmiH#!AGe zPv8`HlE*(We5f~E_6^_m91QOXD35yxtRL8dQYT#?O{KVMI2O?L@AB}kuos9&J! zl%B8FOQXq!_kui_>2EH6M};fh4x?42Gb!E49POY?>iRvHbjq%nT5pJ?xy83$p8nV& z$`^8`-qq$|JNhr=Y|PP=8sgRwE%lqd=r_uphMo{{D*h79SP-I5lE6( zLxl+H$K@M_NQRX1ASdAv^m(HgCDbU{VRPqpjep(d@ckMsaD=d1a>F42{t7ZCIB6^y z>I}Uu{$woaY3GR_hJdWN+%JrLbpG6B<#w1kZP+WZ#nu+_dnr_{d6Zw9lMMOegJmR? zZ=)9>(m<-e{X~;l(0!)bU2oTKP7Ge4y)sY%qdPU$;BxpWrVkP>-W51erlMp%wr!x} zOXC=~OzK@O07QIaTyH-)4-i>7;QCg^XJq5jC7tS^B?9G`CuDzB6KU|-0?())t)P5g zWSHtVcs%jK9Q0)cOMmH7$eGIyXWKK+kY)N zMBOZj6ZC5KG`E(#Fhd-dV(?Q^ryTa@Iv8u>xJ&b$Q0>-$^a_a1l9?BFhfapT?XA(6 z9(jaOno-CZ95kGx$D-&}Esje#KZA%QB`Cj6Pkz><=$3jc%A>gbvLk!PO^u9;Ij2k) zX6kLk_mxH_Kq~47KyLXOkX0tNWa`izI_6kzT zcye@9q)s8LIXtTO2QP=}o5^Ro!BT+wx#9cbi8`)Nt_dj2ALag>`TK}g<2fz?PXQ32 ziyK9ioz$z3W;Smqu!IEvq%&wtV911t1#K$F{CL+w@epe(i`dA3Z|tLn?NoK%dNkd? zf`F^WJfOSS&o}Ae z=@1h6*Ca**IDO~$vN&jNQ(Uxiubv}NSd&Y)G?NmpN-@`Zl{9;(n2sHqZ_j zj}X-pz^zk!WwQnt!s}YtX&=X+VZ2+ODkUEWdE6}3wDXTlxAhvRFFgtwa7vvGtr~ew z3f^650%oshlgf_wq&#}vU6;}rvHXB~EGbfoC;AU5*JCw!btUvlvb+8V!LcTI z5dBy5UGAIG*V5+Lf*HrR(hb30$8A$32&FyOE1~Eeq{31mkUnT({v+{XO!Y*c5DGp z3szxh)ZUaNwor-@WWR8a_G-CZrV}Q2ja<61k{;_AwL@ST+3VJRZA8f!Pg?)*bfseQ zILGtlSTh*(3Jk*Od^|mm+-g?@4SvaKHIC_%Q`!ek9WnmR<_DKfm*`4c4eOuc?Dwqd z%J>Lbd;ZEXpK$qsjRE|L%$fUid4;uwcp`>F&|H7KkzEj`nSHo+94$l=u3& z#Mv30la<>hg#R%OOM45-2bO~r-enOm(8Y?w+Jij|SF!4ej1R~8r;r@)C?jD?YG|1L zcq_AfHh4*%SJ$=QD3|)PnRC1Qp;nIU>zHa@4b!-nGW%5JJc%&=*?sOzZCt`6sbuEUgS9iYWK9krnn;Fem zEdgzVKtlzOl|9BTqJQp+$dk)Y-b-~I#mzg}OATx~V_kPNvg$NatvU{DqeFWmi;>Hp zC9x7xT=pP`u$IO6B@zmCplh*sP86EJu$qot)ma`8LI8}|+q@PXR8{7DU` zhDs095h`1)!~L^X^l{Vmj}_`|zHC$7sH22(mFz|^=Se_MhP8@n-A%O~H~KXl4ll<{ ztPMc$SZ9hP1LxCn(aQ+xx8uUYJ>~if-Je>+7{c`;w`b=-qXZBP{cA`$c~GP#+&@m= zIx#@Mp#bD0p=vz`!Y)#t*2H^F@D-{9fX$mZ9f*CxYB0z{5`C!E@<9FLYo0*xbUblz zv=a3X$Co$d8WYwl>@op$BiqhVEN4#YzjEq!4tlV*(B02|%szCB-9%Wsvxh1!biwp& z85noF{n^a8-l{%Gy&^|#WPs&%TceEWx6-OJSX4U zRU&caHg#JpYEDOER^dF9%a-qswoln!0_LrlCCoVOMB(3Vic=^wo1IC!GX+r&`tc(H zQ-8^i;s+6t_$dc{qFxQ@Ru|M8*p$H@MGxiz9tA%E%-ifL2g>!){Y0(vQ&0{H4Jdak zOZw)E879? - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/favicon.ico b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/images/favicon.ico deleted file mode 100644 index 0e2249ada68ec5cab2034721dc193285c27175b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmc&&eN2^Q6o2ox;0z74F{f9TU#+!9X2#sY&6#cG+%jk7$GvdHRGeG+hii#qr9`BK zC}qeHvGgi7)2x{@AZJeQ2i$vM6vot;IU_|SM7+HB^gGY{zHsji5d!CRKhN_%yyy9y z=RD^*=iDnvI!P}LA1>iDPFi7n3LB+bNp^oNLalA8=H z`-6iYNhVd-0{wN8JM*q}0bsYHpWyM3&HpH+LU-f&>6Fv>650J0N)zjuDZSc6C3#&o z_*8vxN9x<4|6}uZ>X2_!&8_cgL&Ni8P1fJjXZ?H%g+e5UI_YNcD%N;b@b^{!L~|as zb>5(}El$d8mIy_@DizA(Ef{Umop0o%=3L z^zNk@HLHP)NK~()6z}r(9R;IG5d)tho~Gi=Phk!9{FF1`IJgHmKAUu|POBE<&`n0{ z`~Z38{s^(X>5?n*o?(vf0mpJ*5OLQf2{sP^oM*-XGXX8nWQp8_iLj5h--j)QuU!4l zcm1^+@nJ!H#Q|OZ7U$!lB*+;+9Dv+6c(yQ?ig?KRuwfJA2(}$O93#xR6=(vGv*`&y z~xQi3P znSt>+$PP%p-|K*(fL5#6->6em58#f9dwT`8?80~sWW3~-#d&2N8zSU^9Ld0NMuE9` zU0^h@05}9(1DKb=<5>W|Bh~^3^C#l|mcS33GlBq1_=8XjLYX?ZoD}Q18pHgh+Z66- ze$}R7*k=mX&IQf`8gEb?pMo3@gvTHA^LejSIn_MHHi(?nVsPI+KE`|0k$G@(@{ufk za@hw`GHPh@;V|Gi<mXv<+e z?JUxZx*lZ%pG7N>0j{Tk)4)w2h#25=kKmu+-A8Zu9~bq?9x%)HTCzBv z<}(v)1WdH7#zYzCO!UcqJ;5j8e$dXO7+miGTFj}u8oyGnCVO|&BL7&yuk%i zsKG{Z1cr3|jsG4FTb-HKRv4)`Ul+lTz4KX=g1b=NZ`i&g`KPG-4s~s=+cv*}R@5fY z^4bx!s75b1H9NxVI(!8m80m{I2Zui`V8NdClu`E>xo&(z{#z#~@8WCVA4-dTdicT8 z z^&i{7;OFL!i&WH<-o?MF$|U?hxcu7wWwjTU;e#OEk^iAfw|%th58DIf&uq~6m3`ll z+vv~sU(ws|L~J~V80GI655oUS{H_4L!-1#x4w~zmNelgx=yl(OK4W2E0;N`2gZaB-FQW#Z2Y(}YtARXVOz-?$ zhq`ST!m( zi)i-rQ~rkcXLa|*I`Mr#?Y$f-H}m%b?o0kRPC_@yT2a&0b85DL6Me7fyL#Eb=7)Yt z<+qnctna`%57RiqCFc1ItiTf3xEV5c5b-Y7nuT@a!Z~{y<30WkGz^lziwzJVMc>6e TedKQfJ#jzGxv-xC9?I}vocwV} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/index.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/index.html deleted file mode 100644 index bcf409e5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - -

                                                                                                                        - - - -
                                                                                                                        -
                                                                                                                        - - -
                                                                                                                        -
                                                                                                                        - -

                                                                                                                        Welcome to OpenVidu Components Angular

                                                                                                                        -

                                                                                                                        Build powerful video conferencing applications with ease using OpenVidu Components Angular.

                                                                                                                        -

                                                                                                                        Introduction

                                                                                                                        -

                                                                                                                        Angular Components are the simplest way to create real-time videoconferencing apps with Angular. There's no need to manage state or low-level events; Angular Components from OpenVidu handle all the complexity for you.

                                                                                                                        -

                                                                                                                        Getting Started

                                                                                                                        -

                                                                                                                        To get started with OpenVidu Components Angular, visit our Getting Started guide.

                                                                                                                        -
                                                                                                                          -
                                                                                                                        1. Create an Angular Project (>= 17.0.0)

                                                                                                                          -Example :
                                                                                                                          ng new your-project-name
                                                                                                                        2. -
                                                                                                                        3. Add Angular Material to your project

                                                                                                                          -Example :
                                                                                                                          ng add @angular/material
                                                                                                                        4. -
                                                                                                                        5. Install OpenVidu Components Angular

                                                                                                                          -Example :
                                                                                                                          npm install openvidu-components-angular
                                                                                                                        6. -
                                                                                                                        7. Import and use OpenVidu Components Angular

                                                                                                                          -Example :
                                                                                                                          import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                          -
                                                                                                                          -// Other imports ...
                                                                                                                          -
                                                                                                                          -const config: OpenViduComponentsConfig = {
                                                                                                                          -    production: environment.production
                                                                                                                          -};
                                                                                                                          -
                                                                                                                          -bootstrapApplication(AppComponent, {
                                                                                                                          -    providers: [
                                                                                                                          -        importProvidersFrom(
                                                                                                                          -            OpenViduComponentsModule.forRoot(config)
                                                                                                                          -            // Other imports ...
                                                                                                                          -        ),
                                                                                                                          -        provideAnimations()
                                                                                                                          -    ]
                                                                                                                          -}).catch((err) => console.error(err));
                                                                                                                        8. -
                                                                                                                        -

                                                                                                                        You can also customize the styles in your styles.scss file:

                                                                                                                        -Example :
                                                                                                                        :root {
                                                                                                                        -    --ov-primary-color: #303030;
                                                                                                                        -    --ov-secondary-color: #3e3f3f;
                                                                                                                        -    --ov-tertiary-color: #598eff;
                                                                                                                        -    --ov-warn-color: #eb5144;
                                                                                                                        -    --ov-accent-color: #ffae35;
                                                                                                                        -    --ov-light-color: #e6e6e6;
                                                                                                                        -
                                                                                                                        -    --ov-logo-background-color: #3a3d3d;
                                                                                                                        -
                                                                                                                        -    --ov-text-color: #ffffff;
                                                                                                                        -
                                                                                                                        -    --ov-panel-text-color: #1d1d1d;
                                                                                                                        -    --ov-panel-background: #ffffff;
                                                                                                                        -
                                                                                                                        -    --ov-buttons-radius: 50%;
                                                                                                                        -    --ov-leave-button-radius: 10px;
                                                                                                                        -    --ov-video-radius: 5px;
                                                                                                                        -    --ov-panel-radius: 5px;
                                                                                                                        -}

                                                                                                                        Usage

                                                                                                                        -Example :
                                                                                                                        <ov-videoconference
                                                                                                                        -    [token]="token"
                                                                                                                        -    [livekitUrl]="LIVEKIT_URL"
                                                                                                                        -    (onTokenRequested)="onTokenRequested($event)"
                                                                                                                        ->
                                                                                                                        -</ov-videoconference>

                                                                                                                        API Documentation

                                                                                                                        -

                                                                                                                        For detailed information on OpenVidu Angular Components, refer to our API Reference.

                                                                                                                        -

                                                                                                                        Support

                                                                                                                        -

                                                                                                                        If you have any questions or need assistance, please reach out to our Support page.

                                                                                                                        - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                        -
                                                                                                                        -

                                                                                                                        results matching ""

                                                                                                                        -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          No results matching ""

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          - -
                                                                                                                          -
                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/BroadcastingService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/BroadcastingService.html deleted file mode 100644 index 4a176ede..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/BroadcastingService.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                          -
                                                                                                                          - - -
                                                                                                                          -
                                                                                                                          - - - - - - - - - - - - -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          -

                                                                                                                          File

                                                                                                                          -

                                                                                                                          -

                                                                                                                          - projects/openvidu-components-angular/src/lib/services/broadcasting/broadcasting.service.ts -

                                                                                                                          - - - - - -
                                                                                                                          -

                                                                                                                          Index

                                                                                                                          - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                          -
                                                                                                                          Properties
                                                                                                                          -
                                                                                                                          - -
                                                                                                                          -
                                                                                                                          Methods
                                                                                                                          -
                                                                                                                          - -
                                                                                                                          -
                                                                                                                          - - -
                                                                                                                          - -

                                                                                                                          - Methods -

                                                                                                                          - - - - - - - - - - - - - - - - -
                                                                                                                          - - - setBroadcastingStarting - - -
                                                                                                                          -setBroadcastingStarting() -
                                                                                                                          -

                                                                                                                          Set the broadcasting BroadcastingStatus to starting. -The started status will be updated automatically when the broadcasting is started.

                                                                                                                          -
                                                                                                                          - -
                                                                                                                          - Returns : void - -
                                                                                                                          -
                                                                                                                          - - - - - - - - - - - - - - - - -
                                                                                                                          - - - setBroadcastingStopping - - -
                                                                                                                          -setBroadcastingStopping() -
                                                                                                                          -

                                                                                                                          Set the broadcasting BroadcastingStatus to stopping. -The stopped status will be updated automatically when the broadcasting is stopped.

                                                                                                                          -
                                                                                                                          - -
                                                                                                                          - Returns : void - -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          - -

                                                                                                                          - Properties -

                                                                                                                          - - - - - - - - - - - - - - -
                                                                                                                          - - - broadcastingStatusObs - - -
                                                                                                                          - Type : Observable<BroadcastingStatusInfo> - -
                                                                                                                          -

                                                                                                                          Broadcasting status Observable which pushes the BroadcastingStatusInfo in every update.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          - -
                                                                                                                          - - - -
                                                                                                                          - - - - - - - - - - - - - -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          results matching ""

                                                                                                                          -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            No results matching ""

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/OpenViduService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/OpenViduService.html deleted file mode 100644 index 09988409..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/OpenViduService.html +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                            -
                                                                                                                            - - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            -

                                                                                                                            File

                                                                                                                            -

                                                                                                                            -

                                                                                                                            - projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts -

                                                                                                                            - - - - - -
                                                                                                                            -

                                                                                                                            Index

                                                                                                                            - - - - - - - - - - - - - - - -
                                                                                                                            -
                                                                                                                            Methods
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - -
                                                                                                                            - -

                                                                                                                            - Methods -

                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - Async - connectRoom - - -
                                                                                                                            - - connectRoom() -
                                                                                                                            -

                                                                                                                            Connects to the Room

                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - Returns : Promise<void> - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - Async - disconnectRoom - - -
                                                                                                                            - - disconnectRoom() -
                                                                                                                            -

                                                                                                                            Disconnects the room

                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - Returns : Promise<void> - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - getRoom - - -
                                                                                                                            -getRoom() -
                                                                                                                            - -
                                                                                                                            - Returns : Room - -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            Room instance

                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - getRoomMetadata - - -
                                                                                                                            -getRoomMetadata() -
                                                                                                                            -

                                                                                                                            Returns the room metadata from the token

                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - Returns : literal type - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - getRoomName - - -
                                                                                                                            -getRoomName() -
                                                                                                                            -

                                                                                                                            Returns the room name

                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - Returns : string - -
                                                                                                                            -
                                                                                                                            - - - - - - - - - - - - - - - - -
                                                                                                                            - - - isRoomConnected - - -
                                                                                                                            -isRoomConnected() -
                                                                                                                            -

                                                                                                                            Returns if the room is connected or not

                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - Returns : boolean - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - - -
                                                                                                                            - - - - - - - - - - - - - -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            results matching ""

                                                                                                                            -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              -

                                                                                                                              No results matching ""

                                                                                                                              -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/PanelService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/PanelService.html deleted file mode 100644 index cdabb84d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/PanelService.html +++ /dev/null @@ -1,618 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                              -
                                                                                                                              - - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - -
                                                                                                                              -
                                                                                                                              -

                                                                                                                              -

                                                                                                                              File

                                                                                                                              -

                                                                                                                              -

                                                                                                                              - projects/openvidu-components-angular/src/lib/services/panel/panel.service.ts -

                                                                                                                              - - - - - -
                                                                                                                              -

                                                                                                                              Index

                                                                                                                              - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                              -
                                                                                                                              Properties
                                                                                                                              -
                                                                                                                              - -
                                                                                                                              -
                                                                                                                              Methods
                                                                                                                              -
                                                                                                                              - -
                                                                                                                              -
                                                                                                                              - - -
                                                                                                                              - -

                                                                                                                              - Methods -

                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - closePanel - - -
                                                                                                                              -closePanel() -
                                                                                                                              -

                                                                                                                              Closes the panel if it is opened.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : void - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isActivitiesPanelOpened - - -
                                                                                                                              -isActivitiesPanelOpened() -
                                                                                                                              -

                                                                                                                              Whether the activities panel is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isBackgroundEffectsPanelOpened - - -
                                                                                                                              -isBackgroundEffectsPanelOpened() -
                                                                                                                              -

                                                                                                                              Whether the background effects panel is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isChatPanelOpened - - -
                                                                                                                              -isChatPanelOpened() -
                                                                                                                              -

                                                                                                                              Whether the chat panel is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isExternalPanelOpened - - -
                                                                                                                              -isExternalPanelOpened() -
                                                                                                                              -

                                                                                                                              Returns whether the external panel (a panel adding by the final user) is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isParticipantsPanelOpened - - -
                                                                                                                              -isParticipantsPanelOpened() -
                                                                                                                              -

                                                                                                                              Whether the participants panel is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - isSettingsPanelOpened - - -
                                                                                                                              -isSettingsPanelOpened() -
                                                                                                                              -

                                                                                                                              Whether the settings panel is opened or not.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Returns : boolean - -
                                                                                                                              -
                                                                                                                              - - - - - - - - - - - - - - - - -
                                                                                                                              - - - togglePanel - - -
                                                                                                                              -togglePanel(panelType: PanelType | string, subOptionType?: PanelSettingsOptions | string) -
                                                                                                                              -

                                                                                                                              Open or close the panel type received. Calling this method with the panel opened and the same type panel, will close the panel. -If the type is differente, it will switch to the properly panel.

                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                              NameTypeOptional
                                                                                                                              panelType - PanelType | string - - No -
                                                                                                                              subOptionType - PanelSettingsOptions | string - - Yes -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              - Returns : void - -
                                                                                                                              -
                                                                                                                              - -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              - -

                                                                                                                              - Properties -

                                                                                                                              - - - - - - - - - - - - - - -
                                                                                                                              - - - panelStatusObs - - -
                                                                                                                              - Type : Observable<PanelStatusInfo> - -
                                                                                                                              -

                                                                                                                              Panel Observable which pushes the panel status in every update.

                                                                                                                              -
                                                                                                                              -
                                                                                                                              -
                                                                                                                              - -
                                                                                                                              - - - -
                                                                                                                              - - - - - - - - - - - - - -
                                                                                                                              -
                                                                                                                              -

                                                                                                                              results matching ""

                                                                                                                              -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                -

                                                                                                                                No results matching ""

                                                                                                                                -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/ParticipantService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/ParticipantService.html deleted file mode 100644 index 86f82eaa..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/ParticipantService.html +++ /dev/null @@ -1,1145 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                -
                                                                                                                                - - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - -
                                                                                                                                -
                                                                                                                                -

                                                                                                                                -

                                                                                                                                File

                                                                                                                                -

                                                                                                                                -

                                                                                                                                - projects/openvidu-components-angular/src/lib/services/participant/participant.service.ts -

                                                                                                                                - - - - - -
                                                                                                                                -

                                                                                                                                Index

                                                                                                                                - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                -
                                                                                                                                Properties
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                Methods
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - -
                                                                                                                                - -

                                                                                                                                - Methods -

                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - getLocalParticipant - - -
                                                                                                                                -getLocalParticipant() -
                                                                                                                                -

                                                                                                                                Returns the local participant object.

                                                                                                                                -
                                                                                                                                - - -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - getMyName - - -
                                                                                                                                -getMyName() -
                                                                                                                                -

                                                                                                                                Returns the local participant name.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : string | undefined - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - getRemoteParticipantBySid - - -
                                                                                                                                -getRemoteParticipantBySid(sid: string) -
                                                                                                                                -

                                                                                                                                Returns the remote participant with the given sid.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptional
                                                                                                                                sid - string - - No -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - getRemoteParticipants - - -
                                                                                                                                -getRemoteParticipants() -
                                                                                                                                -

                                                                                                                                Returns all remote participants in the room.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : ParticipantModel[] - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - isMyCameraEnabled - - -
                                                                                                                                -isMyCameraEnabled() -
                                                                                                                                -

                                                                                                                                Returns if the local participant camera is enabled.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : boolean - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - isMyMicrophoneEnabled - - -
                                                                                                                                -isMyMicrophoneEnabled() -
                                                                                                                                -

                                                                                                                                Returns if the local participant microphone is enabled.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : boolean - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - isMyScreenShareEnabled - - -
                                                                                                                                -isMyScreenShareEnabled() -
                                                                                                                                -

                                                                                                                                Returns if the local participant screen is enabled.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : boolean - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - publishData - - -
                                                                                                                                -publishData(data: Uint8Array, publishOptions: DataPublishOptions) -
                                                                                                                                -

                                                                                                                                Publishes a new data payload to the room. Data will be forwarded to each participant in the room if the destination field in publishOptions is empty.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptionalDescription
                                                                                                                                data - Uint8Array - - No - -
                                                                                                                                publishOptions - DataPublishOptions - - No - -

                                                                                                                                DataPublishOptions

                                                                                                                                - -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - setCameraEnabled - - -
                                                                                                                                - - setCameraEnabled(enabled: boolean) -
                                                                                                                                -

                                                                                                                                Sets the local participant camera enabled or disabled.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptional
                                                                                                                                enabled - boolean - - No -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - setMicrophoneEnabled - - -
                                                                                                                                - - setMicrophoneEnabled(enabled: boolean) -
                                                                                                                                -

                                                                                                                                Sets the local participant microphone enabled or disabled.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptional
                                                                                                                                enabled - boolean - - No -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - setScreenShareEnabled - - -
                                                                                                                                - - setScreenShareEnabled(enabled: boolean) -
                                                                                                                                -

                                                                                                                                Share or unshare the local participant screen.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptionalDescription
                                                                                                                                enabled - boolean - - No - -

                                                                                                                                : true to share the screen, false to unshare it

                                                                                                                                - -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - switchCamera - - -
                                                                                                                                - - switchCamera(deviceId: string) -
                                                                                                                                -

                                                                                                                                Switches the active camera track used in this room to the given device id.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptional
                                                                                                                                deviceId - string - - No -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - switchMicrophone - - -
                                                                                                                                - - switchMicrophone(deviceId: string) -
                                                                                                                                -

                                                                                                                                Switches the active microphone track used in this room to the given device id.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                NameTypeOptional
                                                                                                                                deviceId - string - - No -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - Async - switchScreenShare - - -
                                                                                                                                - - switchScreenShare() -
                                                                                                                                -

                                                                                                                                Switches the active screen share track showing a native browser dialog to select a screen or window.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : Promise<void> - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - updateLocalParticipant - - -
                                                                                                                                -updateLocalParticipant() -
                                                                                                                                -

                                                                                                                                Forces to update the local participant object and fire a new localParticipant$ Observable event.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : void - -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                - - - updateRemoteParticipants - - -
                                                                                                                                -updateRemoteParticipants() -
                                                                                                                                -

                                                                                                                                Force to update the remote participants object and fire a new remoteParticipants$ Observable event.

                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - Returns : void - -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - -

                                                                                                                                - Properties -

                                                                                                                                - - - - - - - - - - - - - - -
                                                                                                                                - - - localParticipant$ - - -
                                                                                                                                - Type : Observable<ParticipantModel | undefined> - -
                                                                                                                                -

                                                                                                                                Local participant Observable which pushes the local participant object in every update.

                                                                                                                                -
                                                                                                                                -
                                                                                                                                - - - - - - - - - - - - - - -
                                                                                                                                - - - remoteParticipants$ - - -
                                                                                                                                - Type : Observable<ParticipantModel[]> - -
                                                                                                                                -

                                                                                                                                Remote participants Observable which pushes the remote participants array in every update.

                                                                                                                                -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                - -
                                                                                                                                - - - -
                                                                                                                                - - - - - - - - - - - - - -
                                                                                                                                -
                                                                                                                                -

                                                                                                                                results matching ""

                                                                                                                                -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  -

                                                                                                                                  No results matching ""

                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  -
                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/RecordingService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/RecordingService.html deleted file mode 100644 index d3e88c36..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/RecordingService.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                  -
                                                                                                                                  - - -
                                                                                                                                  -
                                                                                                                                  - - - - - - - - - - - - -
                                                                                                                                  -
                                                                                                                                  -

                                                                                                                                  -

                                                                                                                                  File

                                                                                                                                  -

                                                                                                                                  -

                                                                                                                                  - projects/openvidu-components-angular/src/lib/services/recording/recording.service.ts -

                                                                                                                                  - - - - - -
                                                                                                                                  -

                                                                                                                                  Index

                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                  -
                                                                                                                                  Properties
                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  -
                                                                                                                                  Methods
                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  -
                                                                                                                                  - - -
                                                                                                                                  - -

                                                                                                                                  - Methods -

                                                                                                                                  - - - - - - - - - - - - - - - - -
                                                                                                                                  - - - setRecordingStarting - - -
                                                                                                                                  -setRecordingStarting() -
                                                                                                                                  -

                                                                                                                                  Set the RecordingStatus to starting. -The started stastus will be updated automatically when the recording is actually started.

                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  - Returns : void - -
                                                                                                                                  -
                                                                                                                                  - - - - - - - - - - - - - - - - -
                                                                                                                                  - - - setRecordingStopping - - -
                                                                                                                                  -setRecordingStopping() -
                                                                                                                                  -

                                                                                                                                  Set the RecordingStatus to stopping. -The stopped stastus will be updated automatically when the recording is actually stopped.

                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  - Returns : void - -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  - -

                                                                                                                                  - Properties -

                                                                                                                                  - - - - - - - - - - - - - - -
                                                                                                                                  - - - recordingStatusObs - - -
                                                                                                                                  - Type : Observable<RecordingStatusInfo> - -
                                                                                                                                  -

                                                                                                                                  Recording status Observable which pushes the recording state in every update.

                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  - -
                                                                                                                                  - - - -
                                                                                                                                  - - - - - - - - - - - - - -
                                                                                                                                  -
                                                                                                                                  -

                                                                                                                                  results matching ""

                                                                                                                                  -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -

                                                                                                                                    No results matching ""

                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/TranslateService.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/TranslateService.html deleted file mode 100644 index f25f26fc..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/injectables/TranslateService.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                    -
                                                                                                                                    - - -
                                                                                                                                    -
                                                                                                                                    - - - - - - - - - - - - -
                                                                                                                                    -
                                                                                                                                    -

                                                                                                                                    -

                                                                                                                                    File

                                                                                                                                    -

                                                                                                                                    -

                                                                                                                                    - projects/openvidu-components-angular/src/lib/services/translate/translate.service.ts -

                                                                                                                                    - - -

                                                                                                                                    -

                                                                                                                                    Description

                                                                                                                                    -

                                                                                                                                    -

                                                                                                                                    -

                                                                                                                                    Service responsible for managing translations for the application. -This service provides methods to add additional translations and to translate keys into the currently selected language.

                                                                                                                                    -

                                                                                                                                    The pipe TranslatePipe is used to translate keys in the templates.

                                                                                                                                    - -

                                                                                                                                    - - - -
                                                                                                                                    -

                                                                                                                                    Index

                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                    -
                                                                                                                                    Properties
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    Methods
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    -

                                                                                                                                    Constructor

                                                                                                                                    - - - - - - - - - - -
                                                                                                                                    -constructor(storageService: StorageService) -
                                                                                                                                    -
                                                                                                                                    - Parameters : - - - - - - - - - - - - - - - - - - -
                                                                                                                                    NameTypeOptional
                                                                                                                                    storageService - StorageService - - No -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    - -

                                                                                                                                    - Methods -

                                                                                                                                    - - - - - - - - - - - - - - - - -
                                                                                                                                    - - - addTranslations - - -
                                                                                                                                    -addTranslations(translations: Partial<AdditionalTranslationsType>) -
                                                                                                                                    -

                                                                                                                                    Adds multiple translations to the additional translations storage.

                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    - Parameters : - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                    NameTypeOptionalDescription
                                                                                                                                    translations - Partial<AdditionalTranslationsType> - - No - -
                                                                                                                                      -
                                                                                                                                    • A record where each key is a language code and the value is an object of translations for that language.
                                                                                                                                    • -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    - Returns : void - -
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    - - - - - - - - - - - - - - - - -
                                                                                                                                    - - - getAvailableLanguages - - -
                                                                                                                                    -getAvailableLanguages() -
                                                                                                                                    -

                                                                                                                                    Retrieves the list of all available language options.

                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    - Returns : LangOption[] - -
                                                                                                                                    -
                                                                                                                                    -

                                                                                                                                    An array of available language options.

                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    - - - - - - - - - - - - - - - - -
                                                                                                                                    - - - translate - - -
                                                                                                                                    -translate(key: string) -
                                                                                                                                    -

                                                                                                                                    Translates a given key into the current language.

                                                                                                                                    -

                                                                                                                                    This method first attempts to find the translation in the official translations. -If the translation is not found, it then looks for the translation in the additional translations registered by the app.

                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    - Parameters : - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                    NameTypeOptionalDescription
                                                                                                                                    key - string - - No - -
                                                                                                                                      -
                                                                                                                                    • The key to be translated.
                                                                                                                                    • -
                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    - Returns : string - -
                                                                                                                                    -
                                                                                                                                    -

                                                                                                                                    The translated string if found, otherwise an empty string.

                                                                                                                                    - -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    - -

                                                                                                                                    - Properties -

                                                                                                                                    - - - - - - - - - - - -
                                                                                                                                    - - - selectedLanguageOption$ - - -
                                                                                                                                    - Type : Observable<LangOption> - -
                                                                                                                                    -
                                                                                                                                    - -
                                                                                                                                    - - - -
                                                                                                                                    - - - - - - - - - - - - - -
                                                                                                                                    -
                                                                                                                                    -

                                                                                                                                    results matching ""

                                                                                                                                    -
                                                                                                                                      -
                                                                                                                                      -
                                                                                                                                      -

                                                                                                                                      No results matching ""

                                                                                                                                      -
                                                                                                                                      -
                                                                                                                                      -
                                                                                                                                      - -
                                                                                                                                      -
                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ActivitiesPanelStatusEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ActivitiesPanelStatusEvent.html deleted file mode 100644 index 94415a94..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ActivitiesPanelStatusEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                      -
                                                                                                                                      - - -
                                                                                                                                      -
                                                                                                                                      - - - - - - - - - - - - - - - - - -
                                                                                                                                      -
                                                                                                                                      -

                                                                                                                                      -

                                                                                                                                      File

                                                                                                                                      -

                                                                                                                                      -

                                                                                                                                      - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                      - - - -

                                                                                                                                      -

                                                                                                                                      Extends

                                                                                                                                      -

                                                                                                                                      -

                                                                                                                                      - PanelStatusEvent -

                                                                                                                                      - - - - -
                                                                                                                                      - - -
                                                                                                                                      - - - - - - - - -
                                                                                                                                      -
                                                                                                                                      -

                                                                                                                                      results matching ""

                                                                                                                                      -
                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                        -

                                                                                                                                        No results matching ""

                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                        - -
                                                                                                                                        -
                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingEvent.html deleted file mode 100644 index 93315414..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingEvent.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                        -
                                                                                                                                        - - -
                                                                                                                                        -
                                                                                                                                        - - - - - - - - - - - - - - - - - -
                                                                                                                                        -
                                                                                                                                        -

                                                                                                                                        -

                                                                                                                                        File

                                                                                                                                        -

                                                                                                                                        -

                                                                                                                                        - projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts -

                                                                                                                                        - - -

                                                                                                                                        -

                                                                                                                                        Description

                                                                                                                                        -

                                                                                                                                        -

                                                                                                                                        -

                                                                                                                                        Interface representing a broadcasting event

                                                                                                                                        - -

                                                                                                                                        - - -
                                                                                                                                        -

                                                                                                                                        Index

                                                                                                                                        - - - - - - - - - -
                                                                                                                                        -
                                                                                                                                        Properties
                                                                                                                                        -
                                                                                                                                        - -
                                                                                                                                        -
                                                                                                                                        - - - -
                                                                                                                                        -

                                                                                                                                        Properties

                                                                                                                                        - - - - - - - - - - - - - - - - - - - -
                                                                                                                                        - - roomName - - - - -
                                                                                                                                        - roomName: string - -
                                                                                                                                        - Type : string - -
                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                        - - -
                                                                                                                                        - - - - - - - - -
                                                                                                                                        -
                                                                                                                                        -

                                                                                                                                        results matching ""

                                                                                                                                        -
                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          -

                                                                                                                                          No results matching ""

                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          - -
                                                                                                                                          -
                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStartRequestedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStartRequestedEvent.html deleted file mode 100644 index 5cfa3c06..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStartRequestedEvent.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                          -
                                                                                                                                          - - -
                                                                                                                                          -
                                                                                                                                          - - - - - - - - - - - - - - - - - -
                                                                                                                                          -
                                                                                                                                          -

                                                                                                                                          -

                                                                                                                                          File

                                                                                                                                          -

                                                                                                                                          -

                                                                                                                                          - projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts -

                                                                                                                                          - - - -

                                                                                                                                          -

                                                                                                                                          Extends

                                                                                                                                          -

                                                                                                                                          -

                                                                                                                                          - BroadcastingEvent -

                                                                                                                                          - -
                                                                                                                                          -

                                                                                                                                          Index

                                                                                                                                          - - - - - - - - - -
                                                                                                                                          -
                                                                                                                                          Properties
                                                                                                                                          -
                                                                                                                                          - -
                                                                                                                                          -
                                                                                                                                          - - - -
                                                                                                                                          -

                                                                                                                                          Properties

                                                                                                                                          - - - - - - - - - - - - - - - - - - - -
                                                                                                                                          - - broadcastUrl - - - - -
                                                                                                                                          - broadcastUrl: string - -
                                                                                                                                          - Type : string - -
                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          - - -
                                                                                                                                          - - - - - - - - -
                                                                                                                                          -
                                                                                                                                          -

                                                                                                                                          results matching ""

                                                                                                                                          -
                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                            -

                                                                                                                                            No results matching ""

                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                            - -
                                                                                                                                            -
                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStatusInfo.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStatusInfo.html deleted file mode 100644 index 19283367..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStatusInfo.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                            -
                                                                                                                                            - - -
                                                                                                                                            -
                                                                                                                                            - - - - - - - - - - - - - - - - - -
                                                                                                                                            -
                                                                                                                                            -

                                                                                                                                            -

                                                                                                                                            File

                                                                                                                                            -

                                                                                                                                            -

                                                                                                                                            - projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts -

                                                                                                                                            - - -

                                                                                                                                            -

                                                                                                                                            Description

                                                                                                                                            -

                                                                                                                                            -

                                                                                                                                            -

                                                                                                                                            Interface representing information related to the broadcasting status

                                                                                                                                            - -

                                                                                                                                            - - -
                                                                                                                                            -

                                                                                                                                            Index

                                                                                                                                            - - - - - - - - - -
                                                                                                                                            -
                                                                                                                                            Properties
                                                                                                                                            -
                                                                                                                                            - -
                                                                                                                                            -
                                                                                                                                            - - - -
                                                                                                                                            -

                                                                                                                                            Properties

                                                                                                                                            - - - - - - - - - - - - - - - - - - - -
                                                                                                                                            - - broadcastingId - - - - -
                                                                                                                                            - broadcastingId: string | undefined - -
                                                                                                                                            - Type : string | undefined - -
                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                            - - error - - - - -
                                                                                                                                            - error: string - -
                                                                                                                                            - Type : string - -
                                                                                                                                            - Optional -
                                                                                                                                            - - - - - - - - - - - - - - - - - - - -
                                                                                                                                            - - status - - - - -
                                                                                                                                            - status: BroadcastingStatus - -
                                                                                                                                            - Type : BroadcastingStatus - -
                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                            - - -
                                                                                                                                            - - - - - - - - -
                                                                                                                                            -
                                                                                                                                            -

                                                                                                                                            results matching ""

                                                                                                                                            -
                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                              -

                                                                                                                                              No results matching ""

                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                              - -
                                                                                                                                              -
                                                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStopRequestedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStopRequestedEvent.html deleted file mode 100644 index fc36f173..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/BroadcastingStopRequestedEvent.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                              -
                                                                                                                                              - - -
                                                                                                                                              -
                                                                                                                                              - - - - - - - - - - - - - - - - - -
                                                                                                                                              -
                                                                                                                                              -

                                                                                                                                              -

                                                                                                                                              File

                                                                                                                                              -

                                                                                                                                              -

                                                                                                                                              - projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts -

                                                                                                                                              - - - -

                                                                                                                                              -

                                                                                                                                              Extends

                                                                                                                                              -

                                                                                                                                              -

                                                                                                                                              - BroadcastingEvent -

                                                                                                                                              - -
                                                                                                                                              -

                                                                                                                                              Index

                                                                                                                                              - - - - - - - - - -
                                                                                                                                              -
                                                                                                                                              Properties
                                                                                                                                              -
                                                                                                                                              - -
                                                                                                                                              -
                                                                                                                                              - - - -
                                                                                                                                              -

                                                                                                                                              Properties

                                                                                                                                              - - - - - - - - - - - - - - - - - - - -
                                                                                                                                              - - broadcastingId - - - - -
                                                                                                                                              - broadcastingId: string - -
                                                                                                                                              - Type : string - -
                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                              - - -
                                                                                                                                              - - - - - - - - -
                                                                                                                                              -
                                                                                                                                              -

                                                                                                                                              results matching ""

                                                                                                                                              -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                No results matching ""

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - -
                                                                                                                                                -
                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ChatPanelStatusEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ChatPanelStatusEvent.html deleted file mode 100644 index 56b795f5..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ChatPanelStatusEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - - - - - - - - - - - - - - - - -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                -

                                                                                                                                                File

                                                                                                                                                -

                                                                                                                                                -

                                                                                                                                                - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                                - - - -

                                                                                                                                                -

                                                                                                                                                Extends

                                                                                                                                                -

                                                                                                                                                -

                                                                                                                                                - PanelStatusEvent -

                                                                                                                                                - - - - -
                                                                                                                                                - - -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                results matching ""

                                                                                                                                                -
                                                                                                                                                  -
                                                                                                                                                  -
                                                                                                                                                  -

                                                                                                                                                  No results matching ""

                                                                                                                                                  -
                                                                                                                                                  -
                                                                                                                                                  -
                                                                                                                                                  - -
                                                                                                                                                  -
                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/LangOption.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/LangOption.html deleted file mode 100644 index fece999f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/LangOption.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                  -
                                                                                                                                                  - - -
                                                                                                                                                  -
                                                                                                                                                  - - - - - - - - - - - - - - - - - -
                                                                                                                                                  -
                                                                                                                                                  -

                                                                                                                                                  -

                                                                                                                                                  File

                                                                                                                                                  -

                                                                                                                                                  -

                                                                                                                                                  - projects/openvidu-components-angular/src/lib/models/lang.model.ts -

                                                                                                                                                  - - - - -
                                                                                                                                                  -

                                                                                                                                                  Index

                                                                                                                                                  - - - - - - - - - -
                                                                                                                                                  -
                                                                                                                                                  Properties
                                                                                                                                                  -
                                                                                                                                                  - -
                                                                                                                                                  -
                                                                                                                                                  - - - -
                                                                                                                                                  -

                                                                                                                                                  Properties

                                                                                                                                                  - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                  - - lang - - - - -
                                                                                                                                                  - lang: AvailableLangs - -
                                                                                                                                                  - Type : AvailableLangs - -
                                                                                                                                                  - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                  - - name - - - - -
                                                                                                                                                  - name: string - -
                                                                                                                                                  - Type : string - -
                                                                                                                                                  -
                                                                                                                                                  -
                                                                                                                                                  - - -
                                                                                                                                                  - - - - - - - - -
                                                                                                                                                  -
                                                                                                                                                  -

                                                                                                                                                  results matching ""

                                                                                                                                                  -
                                                                                                                                                    -
                                                                                                                                                    -
                                                                                                                                                    -

                                                                                                                                                    No results matching ""

                                                                                                                                                    -
                                                                                                                                                    -
                                                                                                                                                    -
                                                                                                                                                    - -
                                                                                                                                                    -
                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusEvent.html deleted file mode 100644 index 251797ad..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusEvent.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                    -
                                                                                                                                                    - - -
                                                                                                                                                    -
                                                                                                                                                    - - - - - - - - - - - - - - - - - -
                                                                                                                                                    -
                                                                                                                                                    -

                                                                                                                                                    -

                                                                                                                                                    File

                                                                                                                                                    -

                                                                                                                                                    -

                                                                                                                                                    - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                                    - - -

                                                                                                                                                    -

                                                                                                                                                    Description

                                                                                                                                                    -

                                                                                                                                                    -

                                                                                                                                                    -

                                                                                                                                                    Interface representing a panel status event emmited by the library to the final app

                                                                                                                                                    - -

                                                                                                                                                    - - -
                                                                                                                                                    -

                                                                                                                                                    Index

                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                    -
                                                                                                                                                    Properties
                                                                                                                                                    -
                                                                                                                                                    - -
                                                                                                                                                    -
                                                                                                                                                    - - - -
                                                                                                                                                    -

                                                                                                                                                    Properties

                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                    - - isOpened - - - - -
                                                                                                                                                    - isOpened: boolean - -
                                                                                                                                                    - Type : boolean - -
                                                                                                                                                    -
                                                                                                                                                    -
                                                                                                                                                    - - -
                                                                                                                                                    - - - - - - - - -
                                                                                                                                                    -
                                                                                                                                                    -

                                                                                                                                                    results matching ""

                                                                                                                                                    -
                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      -

                                                                                                                                                      No results matching ""

                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      - -
                                                                                                                                                      -
                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusInfo.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusInfo.html deleted file mode 100644 index 4c1e6ed0..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/PanelStatusInfo.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                      -
                                                                                                                                                      - - -
                                                                                                                                                      -
                                                                                                                                                      - - - - - - - - - - - - - - - - - -
                                                                                                                                                      -
                                                                                                                                                      -

                                                                                                                                                      -

                                                                                                                                                      File

                                                                                                                                                      -

                                                                                                                                                      -

                                                                                                                                                      - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                                      - - -

                                                                                                                                                      -

                                                                                                                                                      Description

                                                                                                                                                      -

                                                                                                                                                      -

                                                                                                                                                      -

                                                                                                                                                      Interface representing a panel event

                                                                                                                                                      - -

                                                                                                                                                      - - -
                                                                                                                                                      -

                                                                                                                                                      Index

                                                                                                                                                      - - - - - - - - - -
                                                                                                                                                      -
                                                                                                                                                      Properties
                                                                                                                                                      -
                                                                                                                                                      - -
                                                                                                                                                      -
                                                                                                                                                      - - - -
                                                                                                                                                      -

                                                                                                                                                      Properties

                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                      - - isOpened - - - - -
                                                                                                                                                      - isOpened: boolean - -
                                                                                                                                                      - Type : boolean - -
                                                                                                                                                      -

                                                                                                                                                      Indicates whether the panel is currently opened.

                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                      - - panelType - - - - -
                                                                                                                                                      - panelType: PanelType | string - -
                                                                                                                                                      - Type : PanelType | string - -
                                                                                                                                                      - Optional -
                                                                                                                                                      -

                                                                                                                                                      The type of the panel. For example: 'chat', 'participants', 'settings', 'activities', etc.

                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                      - - previousPanelType - - - - -
                                                                                                                                                      - previousPanelType: PanelType | string - -
                                                                                                                                                      - Type : PanelType | string - -
                                                                                                                                                      - Optional -
                                                                                                                                                      -

                                                                                                                                                      The previous type of the panel before any changes.

                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                      - - subOptionType - - - - -
                                                                                                                                                      - subOptionType: string - -
                                                                                                                                                      - Type : string - -
                                                                                                                                                      - Optional -
                                                                                                                                                      -

                                                                                                                                                      Additional information for the 'activities' and 'settings' panel, specifying the sub-option to be displayed.

                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      -
                                                                                                                                                      - - -
                                                                                                                                                      - - - - - - - - -
                                                                                                                                                      -
                                                                                                                                                      -

                                                                                                                                                      results matching ""

                                                                                                                                                      -
                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        -

                                                                                                                                                        No results matching ""

                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        - -
                                                                                                                                                        -
                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantProperties.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantProperties.html deleted file mode 100644 index 34bebaa7..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantProperties.html +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                        -
                                                                                                                                                        - - -
                                                                                                                                                        -
                                                                                                                                                        - - - - - - - - - - - - - - - - - -
                                                                                                                                                        -
                                                                                                                                                        -

                                                                                                                                                        -

                                                                                                                                                        File

                                                                                                                                                        -

                                                                                                                                                        -

                                                                                                                                                        - projects/openvidu-components-angular/src/lib/models/participant.model.ts -

                                                                                                                                                        - - -

                                                                                                                                                        -

                                                                                                                                                        Description

                                                                                                                                                        -

                                                                                                                                                        -

                                                                                                                                                        -

                                                                                                                                                        Interface defining properties of a participant.

                                                                                                                                                        - -

                                                                                                                                                        - - -
                                                                                                                                                        -

                                                                                                                                                        Index

                                                                                                                                                        - - - - - - - - - -
                                                                                                                                                        -
                                                                                                                                                        Properties
                                                                                                                                                        -
                                                                                                                                                        - -
                                                                                                                                                        -
                                                                                                                                                        - - - -
                                                                                                                                                        -

                                                                                                                                                        Properties

                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                        - - colorProfile - - - - -
                                                                                                                                                        - colorProfile: string - -
                                                                                                                                                        - Type : string - -
                                                                                                                                                        - Optional -
                                                                                                                                                        -

                                                                                                                                                        The color profile associated with the participant. -It specifies the visual representation of the participant in the user interface.

                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                        - - participant - - - - -
                                                                                                                                                        - participant: LocalParticipant | RemoteParticipant - -
                                                                                                                                                        - Type : LocalParticipant | RemoteParticipant - -
                                                                                                                                                        -

                                                                                                                                                        The participant instance, which can be either a local participant or a remote participant.

                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                        - - room - - - - -
                                                                                                                                                        - room: Room - -
                                                                                                                                                        - Type : Room - -
                                                                                                                                                        - Optional -
                                                                                                                                                        -

                                                                                                                                                        The room in which the participant is located, applicable only for local participants.

                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        -
                                                                                                                                                        - - -
                                                                                                                                                        - - - - - - - - -
                                                                                                                                                        -
                                                                                                                                                        -

                                                                                                                                                        results matching ""

                                                                                                                                                        -
                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          -

                                                                                                                                                          No results matching ""

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantTrackPublication.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantTrackPublication.html deleted file mode 100644 index c70515fe..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantTrackPublication.html +++ /dev/null @@ -1,565 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                          -
                                                                                                                                                          - - -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - -
                                                                                                                                                          -
                                                                                                                                                          -

                                                                                                                                                          -

                                                                                                                                                          File

                                                                                                                                                          -

                                                                                                                                                          -

                                                                                                                                                          - projects/openvidu-components-angular/src/lib/models/participant.model.ts -

                                                                                                                                                          - - -

                                                                                                                                                          -

                                                                                                                                                          Description

                                                                                                                                                          -

                                                                                                                                                          -

                                                                                                                                                          -

                                                                                                                                                          Interface that defines the properties of the participant track publication.

                                                                                                                                                          - -

                                                                                                                                                          - -

                                                                                                                                                          -

                                                                                                                                                          Extends

                                                                                                                                                          -

                                                                                                                                                          -

                                                                                                                                                          - TrackPublication -

                                                                                                                                                          - -
                                                                                                                                                          -

                                                                                                                                                          Index

                                                                                                                                                          - - - - - - - - - -
                                                                                                                                                          -
                                                                                                                                                          Properties
                                                                                                                                                          -
                                                                                                                                                          - -
                                                                                                                                                          -
                                                                                                                                                          - - - -
                                                                                                                                                          -

                                                                                                                                                          Properties

                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isAudioTrack - - - - -
                                                                                                                                                          - isAudioTrack: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the track is from an audio sharing source or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isCameraTrack - - - - -
                                                                                                                                                          - isCameraTrack: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the track is from a camera source or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isMinimized - - - - -
                                                                                                                                                          - isMinimized: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the HTML element associated with the track is minimized (made smaller) or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isMutedForcibly - - - - -
                                                                                                                                                          - isMutedForcibly: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          - Optional -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the participant's audio is forcibly muted or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isPinned - - - - -
                                                                                                                                                          - isPinned: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the HTML element associated with the track is pinned (fixed in place) or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - isScreenTrack - - - - -
                                                                                                                                                          - isScreenTrack: boolean - -
                                                                                                                                                          - Type : boolean - -
                                                                                                                                                          -

                                                                                                                                                          Indicates whether the track is from a screen sharing source or not.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                          - - participant - - - - -
                                                                                                                                                          - participant: ParticipantModel - -
                                                                                                                                                          - Type : ParticipantModel - -
                                                                                                                                                          -

                                                                                                                                                          The participant who published the track.

                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          -
                                                                                                                                                          - - -
                                                                                                                                                          - - - - - - - - -
                                                                                                                                                          -
                                                                                                                                                          -

                                                                                                                                                          results matching ""

                                                                                                                                                          -
                                                                                                                                                            -
                                                                                                                                                            -
                                                                                                                                                            -

                                                                                                                                                            No results matching ""

                                                                                                                                                            -
                                                                                                                                                            -
                                                                                                                                                            -
                                                                                                                                                            - -
                                                                                                                                                            -
                                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantsPanelStatusEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantsPanelStatusEvent.html deleted file mode 100644 index 676f1956..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/ParticipantsPanelStatusEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                            -
                                                                                                                                                            - - -
                                                                                                                                                            -
                                                                                                                                                            - - - - - - - - - - - - - - - - - -
                                                                                                                                                            -
                                                                                                                                                            -

                                                                                                                                                            -

                                                                                                                                                            File

                                                                                                                                                            -

                                                                                                                                                            -

                                                                                                                                                            - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                                            - - - -

                                                                                                                                                            -

                                                                                                                                                            Extends

                                                                                                                                                            -

                                                                                                                                                            -

                                                                                                                                                            - PanelStatusEvent -

                                                                                                                                                            - - - - -
                                                                                                                                                            - - -
                                                                                                                                                            - - - - - - - - -
                                                                                                                                                            -
                                                                                                                                                            -

                                                                                                                                                            results matching ""

                                                                                                                                                            -
                                                                                                                                                              -
                                                                                                                                                              -
                                                                                                                                                              -

                                                                                                                                                              No results matching ""

                                                                                                                                                              -
                                                                                                                                                              -
                                                                                                                                                              -
                                                                                                                                                              - -
                                                                                                                                                              -
                                                                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDeleteRequestedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDeleteRequestedEvent.html deleted file mode 100644 index 91b632a6..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDeleteRequestedEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                              -
                                                                                                                                                              - - -
                                                                                                                                                              -
                                                                                                                                                              - - - - - - - - - - - - - - - - - -
                                                                                                                                                              -
                                                                                                                                                              -

                                                                                                                                                              -

                                                                                                                                                              File

                                                                                                                                                              -

                                                                                                                                                              -

                                                                                                                                                              - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                              - - - -

                                                                                                                                                              -

                                                                                                                                                              Extends

                                                                                                                                                              -

                                                                                                                                                              -

                                                                                                                                                              - RecordingEvent -

                                                                                                                                                              - - - - -
                                                                                                                                                              - - -
                                                                                                                                                              - - - - - - - - -
                                                                                                                                                              -
                                                                                                                                                              -

                                                                                                                                                              results matching ""

                                                                                                                                                              -
                                                                                                                                                                -
                                                                                                                                                                -
                                                                                                                                                                -

                                                                                                                                                                No results matching ""

                                                                                                                                                                -
                                                                                                                                                                -
                                                                                                                                                                -
                                                                                                                                                                - -
                                                                                                                                                                -
                                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDownloadClickedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDownloadClickedEvent.html deleted file mode 100644 index 74d990c2..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingDownloadClickedEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                -
                                                                                                                                                                - - -
                                                                                                                                                                -
                                                                                                                                                                - - - - - - - - - - - - - - - - - -
                                                                                                                                                                -
                                                                                                                                                                -

                                                                                                                                                                -

                                                                                                                                                                File

                                                                                                                                                                -

                                                                                                                                                                -

                                                                                                                                                                - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                - - - -

                                                                                                                                                                -

                                                                                                                                                                Extends

                                                                                                                                                                -

                                                                                                                                                                -

                                                                                                                                                                - RecordingEvent -

                                                                                                                                                                - - - - -
                                                                                                                                                                - - -
                                                                                                                                                                - - - - - - - - -
                                                                                                                                                                -
                                                                                                                                                                -

                                                                                                                                                                results matching ""

                                                                                                                                                                -
                                                                                                                                                                  -
                                                                                                                                                                  -
                                                                                                                                                                  -

                                                                                                                                                                  No results matching ""

                                                                                                                                                                  -
                                                                                                                                                                  -
                                                                                                                                                                  -
                                                                                                                                                                  - -
                                                                                                                                                                  -
                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingEvent.html deleted file mode 100644 index c8bea4ac..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingEvent.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                  -
                                                                                                                                                                  - - -
                                                                                                                                                                  -
                                                                                                                                                                  - - - - - - - - - - - - - - - - - -
                                                                                                                                                                  -
                                                                                                                                                                  -

                                                                                                                                                                  -

                                                                                                                                                                  File

                                                                                                                                                                  -

                                                                                                                                                                  -

                                                                                                                                                                  - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                  - - -

                                                                                                                                                                  -

                                                                                                                                                                  Description

                                                                                                                                                                  -

                                                                                                                                                                  -

                                                                                                                                                                  -

                                                                                                                                                                  Interface representing a recording event

                                                                                                                                                                  - -

                                                                                                                                                                  - - -
                                                                                                                                                                  -

                                                                                                                                                                  Index

                                                                                                                                                                  - - - - - - - - - -
                                                                                                                                                                  -
                                                                                                                                                                  Properties
                                                                                                                                                                  -
                                                                                                                                                                  - -
                                                                                                                                                                  -
                                                                                                                                                                  - - - -
                                                                                                                                                                  -

                                                                                                                                                                  Properties

                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                  - - recordingId - - - - -
                                                                                                                                                                  - recordingId: string - -
                                                                                                                                                                  - Type : string - -
                                                                                                                                                                  - Optional -
                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                  - - roomName - - - - -
                                                                                                                                                                  - roomName: string - -
                                                                                                                                                                  - Type : string - -
                                                                                                                                                                  -
                                                                                                                                                                  -
                                                                                                                                                                  - - -
                                                                                                                                                                  - - - - - - - - -
                                                                                                                                                                  -
                                                                                                                                                                  -

                                                                                                                                                                  results matching ""

                                                                                                                                                                  -
                                                                                                                                                                    -
                                                                                                                                                                    -
                                                                                                                                                                    -

                                                                                                                                                                    No results matching ""

                                                                                                                                                                    -
                                                                                                                                                                    -
                                                                                                                                                                    -
                                                                                                                                                                    - -
                                                                                                                                                                    -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingInfo.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingInfo.html deleted file mode 100644 index aef8ca00..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingInfo.html +++ /dev/null @@ -1,748 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                    -
                                                                                                                                                                    - - -
                                                                                                                                                                    -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    -
                                                                                                                                                                    -

                                                                                                                                                                    -

                                                                                                                                                                    File

                                                                                                                                                                    -

                                                                                                                                                                    -

                                                                                                                                                                    - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                    - - -

                                                                                                                                                                    -

                                                                                                                                                                    Description

                                                                                                                                                                    -

                                                                                                                                                                    -

                                                                                                                                                                    -

                                                                                                                                                                    Interface representing a recording

                                                                                                                                                                    - -

                                                                                                                                                                    - - -
                                                                                                                                                                    -

                                                                                                                                                                    Index

                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                    -
                                                                                                                                                                    Properties
                                                                                                                                                                    -
                                                                                                                                                                    - -
                                                                                                                                                                    -
                                                                                                                                                                    - - - -
                                                                                                                                                                    -

                                                                                                                                                                    Properties

                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - duration - - - - -
                                                                                                                                                                    - duration: number - -
                                                                                                                                                                    - Type : number - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - endedAt - - - - -
                                                                                                                                                                    - endedAt: number - -
                                                                                                                                                                    - Type : number - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - filename - - - - -
                                                                                                                                                                    - filename: string - -
                                                                                                                                                                    - Type : string - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - id - - - - -
                                                                                                                                                                    - id: string - -
                                                                                                                                                                    - Type : string - -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - location - - - - -
                                                                                                                                                                    - location: string - -
                                                                                                                                                                    - Type : string - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - markedForDeletion - - - - -
                                                                                                                                                                    - markedForDeletion: boolean - -
                                                                                                                                                                    - Type : boolean - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - outputMode - - - - -
                                                                                                                                                                    - outputMode: RecordingOutputMode - -
                                                                                                                                                                    - Type : RecordingOutputMode - -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - roomId - - - - -
                                                                                                                                                                    - roomId: string - -
                                                                                                                                                                    - Type : string - -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - roomName - - - - -
                                                                                                                                                                    - roomName: string - -
                                                                                                                                                                    - Type : string - -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - size - - - - -
                                                                                                                                                                    - size: number - -
                                                                                                                                                                    - Type : number - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - startedAt - - - - -
                                                                                                                                                                    - startedAt: number - -
                                                                                                                                                                    - Type : number - -
                                                                                                                                                                    - Optional -
                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                    - - status - - - - -
                                                                                                                                                                    - status: RecordingStatus - -
                                                                                                                                                                    - Type : RecordingStatus - -
                                                                                                                                                                    -
                                                                                                                                                                    -
                                                                                                                                                                    - - -
                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                    -
                                                                                                                                                                    -

                                                                                                                                                                    results matching ""

                                                                                                                                                                    -
                                                                                                                                                                      -
                                                                                                                                                                      -
                                                                                                                                                                      -

                                                                                                                                                                      No results matching ""

                                                                                                                                                                      -
                                                                                                                                                                      -
                                                                                                                                                                      -
                                                                                                                                                                      - -
                                                                                                                                                                      -
                                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingPlayClickedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingPlayClickedEvent.html deleted file mode 100644 index 9724f51e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingPlayClickedEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                      -
                                                                                                                                                                      - - -
                                                                                                                                                                      -
                                                                                                                                                                      - - - - - - - - - - - - - - - - - -
                                                                                                                                                                      -
                                                                                                                                                                      -

                                                                                                                                                                      -

                                                                                                                                                                      File

                                                                                                                                                                      -

                                                                                                                                                                      -

                                                                                                                                                                      - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                      - - - -

                                                                                                                                                                      -

                                                                                                                                                                      Extends

                                                                                                                                                                      -

                                                                                                                                                                      -

                                                                                                                                                                      - RecordingEvent -

                                                                                                                                                                      - - - - -
                                                                                                                                                                      - - -
                                                                                                                                                                      - - - - - - - - -
                                                                                                                                                                      -
                                                                                                                                                                      -

                                                                                                                                                                      results matching ""

                                                                                                                                                                      -
                                                                                                                                                                        -
                                                                                                                                                                        -
                                                                                                                                                                        -

                                                                                                                                                                        No results matching ""

                                                                                                                                                                        -
                                                                                                                                                                        -
                                                                                                                                                                        -
                                                                                                                                                                        - -
                                                                                                                                                                        -
                                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStartRequestedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStartRequestedEvent.html deleted file mode 100644 index 9eb4bde8..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStartRequestedEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                        -
                                                                                                                                                                        - - -
                                                                                                                                                                        -
                                                                                                                                                                        - - - - - - - - - - - - - - - - - -
                                                                                                                                                                        -
                                                                                                                                                                        -

                                                                                                                                                                        -

                                                                                                                                                                        File

                                                                                                                                                                        -

                                                                                                                                                                        -

                                                                                                                                                                        - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                        - - - -

                                                                                                                                                                        -

                                                                                                                                                                        Extends

                                                                                                                                                                        -

                                                                                                                                                                        -

                                                                                                                                                                        - RecordingEvent -

                                                                                                                                                                        - - - - -
                                                                                                                                                                        - - -
                                                                                                                                                                        - - - - - - - - -
                                                                                                                                                                        -
                                                                                                                                                                        -

                                                                                                                                                                        results matching ""

                                                                                                                                                                        -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -

                                                                                                                                                                          No results matching ""

                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          - -
                                                                                                                                                                          -
                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStatusInfo.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStatusInfo.html deleted file mode 100644 index 14587fe2..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStatusInfo.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                          -
                                                                                                                                                                          - - -
                                                                                                                                                                          -
                                                                                                                                                                          - - - - - - - - - - - - - - - - - -
                                                                                                                                                                          -
                                                                                                                                                                          -

                                                                                                                                                                          -

                                                                                                                                                                          File

                                                                                                                                                                          -

                                                                                                                                                                          -

                                                                                                                                                                          - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                          - - -

                                                                                                                                                                          -

                                                                                                                                                                          Description

                                                                                                                                                                          -

                                                                                                                                                                          -

                                                                                                                                                                          -

                                                                                                                                                                          Interface representing information related to the recording status

                                                                                                                                                                          - -

                                                                                                                                                                          - - -
                                                                                                                                                                          -

                                                                                                                                                                          Index

                                                                                                                                                                          - - - - - - - - - -
                                                                                                                                                                          -
                                                                                                                                                                          Properties
                                                                                                                                                                          -
                                                                                                                                                                          - -
                                                                                                                                                                          -
                                                                                                                                                                          - - - -
                                                                                                                                                                          -

                                                                                                                                                                          Properties

                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                          - - error - - - - -
                                                                                                                                                                          - error: string - -
                                                                                                                                                                          - Type : string - -
                                                                                                                                                                          - Optional -
                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                          - - recordingElapsedTime - - - - -
                                                                                                                                                                          - recordingElapsedTime: Date - -
                                                                                                                                                                          - Type : Date - -
                                                                                                                                                                          - Optional -
                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                          - - recordingList - - - - -
                                                                                                                                                                          - recordingList: RecordingInfo[] - -
                                                                                                                                                                          - Type : RecordingInfo[] - -
                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                          - - status - - - - -
                                                                                                                                                                          - status: RecordingStatus - -
                                                                                                                                                                          - Type : RecordingStatus - -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          - - -
                                                                                                                                                                          - - - - - - - - -
                                                                                                                                                                          -
                                                                                                                                                                          -

                                                                                                                                                                          results matching ""

                                                                                                                                                                          -
                                                                                                                                                                            -
                                                                                                                                                                            -
                                                                                                                                                                            -

                                                                                                                                                                            No results matching ""

                                                                                                                                                                            -
                                                                                                                                                                            -
                                                                                                                                                                            -
                                                                                                                                                                            - -
                                                                                                                                                                            -
                                                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStopRequestedEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStopRequestedEvent.html deleted file mode 100644 index 0d110b0f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/RecordingStopRequestedEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                            -
                                                                                                                                                                            - - -
                                                                                                                                                                            -
                                                                                                                                                                            - - - - - - - - - - - - - - - - - -
                                                                                                                                                                            -
                                                                                                                                                                            -

                                                                                                                                                                            -

                                                                                                                                                                            File

                                                                                                                                                                            -

                                                                                                                                                                            -

                                                                                                                                                                            - projects/openvidu-components-angular/src/lib/models/recording.model.ts -

                                                                                                                                                                            - - - -

                                                                                                                                                                            -

                                                                                                                                                                            Extends

                                                                                                                                                                            -

                                                                                                                                                                            -

                                                                                                                                                                            - RecordingEvent -

                                                                                                                                                                            - - - - -
                                                                                                                                                                            - - -
                                                                                                                                                                            - - - - - - - - -
                                                                                                                                                                            -
                                                                                                                                                                            -

                                                                                                                                                                            results matching ""

                                                                                                                                                                            -
                                                                                                                                                                              -
                                                                                                                                                                              -
                                                                                                                                                                              -

                                                                                                                                                                              No results matching ""

                                                                                                                                                                              -
                                                                                                                                                                              -
                                                                                                                                                                              -
                                                                                                                                                                              - -
                                                                                                                                                                              -
                                                                                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/SettingsPanelStatusEvent.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/SettingsPanelStatusEvent.html deleted file mode 100644 index 9e3d8deb..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/interfaces/SettingsPanelStatusEvent.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                              -
                                                                                                                                                                              - - -
                                                                                                                                                                              -
                                                                                                                                                                              - - - - - - - - - - - - - - - - - -
                                                                                                                                                                              -
                                                                                                                                                                              -

                                                                                                                                                                              -

                                                                                                                                                                              File

                                                                                                                                                                              -

                                                                                                                                                                              -

                                                                                                                                                                              - projects/openvidu-components-angular/src/lib/models/panel.model.ts -

                                                                                                                                                                              - - - -

                                                                                                                                                                              -

                                                                                                                                                                              Extends

                                                                                                                                                                              -

                                                                                                                                                                              -

                                                                                                                                                                              - PanelStatusEvent -

                                                                                                                                                                              - - - - -
                                                                                                                                                                              - - -
                                                                                                                                                                              - - - - - - - - -
                                                                                                                                                                              -
                                                                                                                                                                              -

                                                                                                                                                                              results matching ""

                                                                                                                                                                              -
                                                                                                                                                                                -
                                                                                                                                                                                -
                                                                                                                                                                                -

                                                                                                                                                                                No results matching ""

                                                                                                                                                                                -
                                                                                                                                                                                -
                                                                                                                                                                                -
                                                                                                                                                                                - -
                                                                                                                                                                                -
                                                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/compodoc.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/compodoc.js deleted file mode 100644 index 8cc41d33..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/compodoc.js +++ /dev/null @@ -1,14 +0,0 @@ -var compodoc = { - EVENTS: { - READY: 'compodoc.ready', - SEARCH_READY: 'compodoc.search.ready' - } -}; - -Object.assign( compodoc, EventDispatcher.prototype ); - -document.addEventListener('DOMContentLoaded', function() { - compodoc.dispatchEvent({ - type: compodoc.EVENTS.READY - }); -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/lazy-load-graphs.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/lazy-load-graphs.js deleted file mode 100644 index 2ef47cab..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/lazy-load-graphs.js +++ /dev/null @@ -1,44 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - var lazyGraphs = [].slice.call(document.querySelectorAll('[lazy]')); - var active = false; - - var lazyLoad = function() { - if (active === false) { - active = true; - - setTimeout(function() { - lazyGraphs.forEach(function(lazyGraph) { - if ( - lazyGraph.getBoundingClientRect().top <= window.innerHeight && - lazyGraph.getBoundingClientRect().bottom >= 0 && - getComputedStyle(lazyGraph).display !== 'none' - ) { - lazyGraph.data = lazyGraph.getAttribute('lazy'); - lazyGraph.removeAttribute('lazy'); - - lazyGraphs = lazyGraphs.filter(function(image) { return image !== lazyGraph}); - - if (lazyGraphs.length === 0) { - document.removeEventListener('scroll', lazyLoad); - window.removeEventListener('resize', lazyLoad); - window.removeEventListener('orientationchange', lazyLoad); - } - } - }); - - active = false; - }, 200); - } - }; - - // initial load - lazyLoad(); - - var container = document.querySelector('.container-fluid.modules'); - if (container) { - container.addEventListener('scroll', lazyLoad); - window.addEventListener('resize', lazyLoad); - window.addEventListener('orientationchange', lazyLoad); - } - -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/EventDispatcher.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/EventDispatcher.js deleted file mode 100644 index f112877d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/EventDispatcher.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * @author mrdoob / http://mrdoob.com/ - */ - -var EventDispatcher=function(){};Object.assign(EventDispatcher.prototype,{addEventListener:function(i,t){void 0===this._listeners&&(this._listeners={});var e=this._listeners;void 0===e[i]&&(e[i]=[]),-1===e[i].indexOf(t)&&e[i].push(t)},hasEventListener:function(i,t){if(void 0===this._listeners)return!1;var e=this._listeners;return void 0!==e[i]&&-1!==e[i].indexOf(t)},removeEventListener:function(i,t){if(void 0!==this._listeners){var e=this._listeners[i];if(void 0!==e){var s=e.indexOf(t);-1!==s&&e.splice(s,1)}}},dispatchEvent:function(i){if(void 0!==this._listeners){var t=this._listeners[i.type];if(void 0!==t){i.target=this;var e=[],s=0,n=t.length;for(s=0;sit in H?Vc(H,it,{enumerable:!0,configurable:!0,writable:!0,value:ct}):H[it]=ct;var d=(H,it,ct)=>(Kc(H,typeof it!="symbol"?it+"":it,ct),ct);const it="aria-describedby",ct="aria-expanded",Se="aria-hidden",He="aria-modal",_s="aria-pressed",Ue="aria-selected",Bo="DOMContentLoaded",qe="focus",Qe="focusin",Bs="focusout",Pe="keydown",Ro="keyup",N="click",Rs="mousedown",Wo="hover",De="mouseenter",Ze="mouseleave",Fo="pointerdown",jo="pointermove",zo="pointerup",xe="resize",Ae="scroll",Ge="touchstart",Vo="dragstart",Je="ArrowDown",ts="ArrowUp",Ws="ArrowLeft",Fs="ArrowRight",es="Escape",Ko="transitionDuration",Xo="transitionDelay",ss="transitionend",js="transitionProperty",Yo=navigator.userAgentData,Le=Yo,{userAgent:Uo}=navigator,Ie=Uo,zs=/iPhone|iPad|iPod|Android/i;Le?Le.brands.some(t=>zs.test(t.brand)):zs.test(Ie);const Vs=/(iPhone|iPod|iPad)/,qo=Le?Le.brands.some(t=>Vs.test(t.brand)):Vs.test(Ie);Ie&&Ie.includes("Firefox");const{head:ke}=document;["webkitPerspective","perspective"].some(t=>t in ke.style);const Qo=(t,s,e,n)=>{const o=n||!1;t.addEventListener(s,e,o)},Zo=(t,s,e,n)=>{const o=n||!1;t.removeEventListener(s,e,o)},Go=(t,s,e,n)=>{const o=i=>{(i.target===t||i.currentTarget===t)&&(e.apply(t,[i]),Zo(t,s,o,n))};Qo(t,s,o,n)},le=()=>{};(()=>{let t=!1;try{const s=Object.defineProperty({},"passive",{get:()=>(t=!0,t)});Go(document,Bo,le,s)}catch{}return t})(),["webkitTransform","transform"].some(t=>t in ke.style),["webkitAnimation","animation"].some(t=>t in ke.style),["webkitTransition","transition"].some(t=>t in ke.style);const at=(t,s)=>t.getAttribute(s),Ne=(t,s)=>t.hasAttribute(s),O=(t,s,e)=>t.setAttribute(s,e),At=(t,s)=>t.removeAttribute(s),f=(t,...s)=>{t.classList.add(...s)},b=(t,...s)=>{t.classList.remove(...s)},h=(t,s)=>t.classList.contains(s),de=t=>t!=null&&typeof t=="object"||!1,A=t=>de(t)&&typeof t.nodeType=="number"&&[1,2,3,4,5,6,7,8,9,10,11].some(s=>t.nodeType===s)||!1,T=t=>A(t)&&t.nodeType===1||!1,jt=new Map,Lt={data:jt,set:(t,s,e)=>{T(t)&&(jt.has(s)||jt.set(s,new Map),jt.get(s).set(t,e))},getAllFor:t=>jt.get(t)||null,get:(t,s)=>{if(!T(t)||!s)return null;const e=Lt.getAllFor(s);return t&&e&&e.get(t)||null},remove:(t,s)=>{const e=Lt.getAllFor(s);!e||!T(t)||(e.delete(t),e.size===0&&jt.delete(s))}},F=(t,s)=>Lt.get(t,s),he=t=>typeof t=="string"||!1,ns=t=>de(t)&&t.constructor.name==="Window"||!1,Ks=t=>A(t)&&t.nodeType===9||!1,E=t=>ns(t)?t.document:Ks(t)?t:A(t)?t.ownerDocument:window.document,dt=(t,...s)=>Object.assign(t,...s),vt=t=>{if(!t)return;if(he(t))return E().createElement(t);const{tagName:s}=t,e=vt(s);if(!e)return;const n={...t};return delete n.tagName,dt(e,n)},w=(t,s)=>t.dispatchEvent(s),z=(t,s)=>{const e=getComputedStyle(t),n=s.replace("webkit","Webkit").replace(/([A-Z])/g,"-$1").toLowerCase();return e.getPropertyValue(n)},Jo=t=>{const s=z(t,js),e=z(t,Xo),n=e.includes("ms")?1:1e3,o=s&&s!=="none"?parseFloat(e)*n:0;return Number.isNaN(o)?0:o},zt=t=>{const s=z(t,js),e=z(t,Ko),n=e.includes("ms")?1:1e3,o=s&&s!=="none"?parseFloat(e)*n:0;return Number.isNaN(o)?0:o},P=(t,s)=>{let e=0;const n=new Event(ss),o=zt(t),i=Jo(t);if(o){const c=a=>{a.target===t&&(s.apply(t,[a]),t.removeEventListener(ss,c),e=1)};t.addEventListener(ss,c),setTimeout(()=>{e||w(t,n)},o+i+17)}else s.apply(t,[n])},ht=(t,s)=>t.focus(s),Xs=t=>["true",!0].includes(t)?!0:["false",!1].includes(t)?!1:["null","",null,void 0].includes(t)?null:t!==""&&!Number.isNaN(+t)?+t:t,Oe=t=>Object.entries(t),Vt=t=>t.toLowerCase(),ti=(t,s,e,n)=>{const o={...e},i={...t.dataset},c={...s},a={},l="title";return Oe(i).forEach(([r,g])=>{const p=n&&typeof r=="string"&&r.includes(n)?r.replace(n,"").replace(/[A-Z]/g,v=>Vt(v)):r;a[p]=Xs(g)}),Oe(o).forEach(([r,g])=>{o[r]=Xs(g)}),Oe(s).forEach(([r,g])=>{r in o?c[r]=o[r]:r in a?c[r]=a[r]:c[r]=r===l?at(t,l):g}),c},Ys=t=>Object.keys(t),$=(t,s)=>{const e=new CustomEvent(t,{cancelable:!0,bubbles:!0});return de(s)&&dt(e,s),e},tt={passive:!0},It=t=>t.offsetHeight,L=(t,s)=>{Oe(s).forEach(([e,n])=>{if(n&&he(e)&&e.includes("--"))t.style.setProperty(e,n);else{const o={};o[e]=n,dt(t.style,o)}})},os=t=>de(t)&&t.constructor.name==="Map"||!1,ei=t=>typeof t=="number"||!1,bt=new Map,u={set:(t,s,e,n)=>{T(t)&&(n&&n.length?(bt.has(t)||bt.set(t,new Map),bt.get(t).set(n,setTimeout(s,e))):bt.set(t,setTimeout(s,e)))},get:(t,s)=>{if(!T(t))return null;const e=bt.get(t);return s&&e&&os(e)?e.get(s)||null:ei(e)?e:null},clear:(t,s)=>{if(!T(t))return;const e=bt.get(t);s&&s.length&&os(e)?(clearTimeout(e.get(s)),e.delete(s),e.size===0&&bt.delete(t)):(clearTimeout(e),bt.delete(t))}},fe=(t,s)=>{const{width:e,height:n,top:o,right:i,bottom:c,left:a}=t.getBoundingClientRect();let l=1,r=1;if(s&&T(t)){const{offsetWidth:g,offsetHeight:p}=t;l=g>0?Math.round(e)/g:1,r=p>0?Math.round(n)/p:1}return{width:e/l,height:n/r,top:o/r,right:i/l,bottom:c/r,left:a/l,x:a/l,y:o/r}},wt=t=>E(t).body,ft=t=>E(t).documentElement,Us=t=>A(t)&&t.constructor.name==="ShadowRoot"||!1,si=t=>t.nodeName==="HTML"?t:T(t)&&t.assignedSlot||A(t)&&t.parentNode||Us(t)&&t.host||ft(t);let qs=0,Qs=0;const Kt=new Map,Zs=(t,s)=>{let e=s?qs:Qs;if(s){const n=Zs(t),o=Kt.get(n)||new Map;Kt.has(n)||Kt.set(n,o),os(o)&&!o.has(s)?(o.set(s,e),qs+=1):e=o.get(s)}else{const n=t.id||t;Kt.has(n)?e=Kt.get(n):(Kt.set(n,e),Qs+=1)}return e},Xt=t=>{var s;return t?Ks(t)?t.defaultView:A(t)?(s=t==null?void 0:t.ownerDocument)==null?void 0:s.defaultView:t:window},ni=t=>Array.isArray(t)||!1,Gs=t=>{if(!A(t))return!1;const{top:s,bottom:e}=fe(t),{clientHeight:n}=ft(t);return s<=n&&e>=0},oi=t=>typeof t=="function"||!1,ii=t=>de(t)&&t.constructor.name==="NodeList"||!1,Et=t=>ft(t).dir==="rtl",ci=t=>A(t)&&["TABLE","TD","TH"].includes(t.nodeName)||!1,M=(t,s)=>t?t.closest(s)||M(t.getRootNode().host,s):null,D=(t,s)=>T(t)?t:(A(s)?s:E()).querySelector(t),is=(t,s)=>(A(s)?s:E()).getElementsByTagName(t),et=(t,s)=>(A(s)?s:E()).querySelectorAll(t),gt=(t,s)=>(s&&A(s)?s:E()).getElementsByClassName(t),Js=(t,s)=>t.matches(s),Yt={},tn=t=>{const{type:s,currentTarget:e}=t;[...Yt[s]].forEach(([n,o])=>{e===n&&[...o].forEach(([i,c])=>{i.apply(n,[t]),typeof c=="object"&&c.once&&B(n,s,i,c)})})},_=(t,s,e,n)=>{Yt[s]||(Yt[s]=new Map);const o=Yt[s];o.has(t)||o.set(t,new Map);const i=o.get(t),{size:c}=i;i.set(e,n),c||t.addEventListener(s,tn,n)},B=(t,s,e,n)=>{const o=Yt[s],i=o&&o.get(t),c=i&&i.get(e),a=c!==void 0?c:n;i&&i.has(e)&&i.delete(e),o&&(!i||!i.size)&&o.delete(t),(!o||!o.size)&&delete Yt[s],(!i||!i.size)&&t.removeEventListener(s,tn,a)},W="fade",m="show",Me="data-bs-dismiss",_e="alert",en="Alert",ai="5.0.13";class st{constructor(s,e){d(this,"_toggleEventListeners",()=>{});const n=D(s);if(!n)throw he(s)?Error(`${this.name} Error: "${s}" is not a valid selector.`):Error(`${this.name} Error: your target is not an instance of HTMLElement.`);const o=Lt.get(n,this.name);o&&o._toggleEventListeners(),this.element=n,this.options=this.defaults&&Ys(this.defaults).length?ti(n,this.defaults,e||{},"bs"):{},Lt.set(n,this.name,this)}get version(){return ai}get name(){return"BaseComponent"}get defaults(){return{}}dispose(){Lt.remove(this.element,this.name),Ys(this).forEach(s=>{delete this[s]})}}const ri=`.${_e}`,li=`[${Me}="${_e}"]`,di=t=>F(t,en),hi=t=>new Ut(t),sn=$(`close.bs.${_e}`),fi=$(`closed.bs.${_e}`),nn=t=>{const{element:s}=t;w(s,fi),t._toggleEventListeners(),t.dispose(),s.remove()};class Ut extends st{constructor(e){super(e);d(this,"dismiss");d(this,"close",()=>{const{element:e}=this;e&&h(e,m)&&(w(e,sn),sn.defaultPrevented||(b(e,m),h(e,W)?P(e,()=>nn(this)):nn(this)))});d(this,"_toggleEventListeners",e=>{const n=e?_:B,{dismiss:o,close:i}=this;o&&n(o,N,i)});this.dismiss=D(li,this.element),this._toggleEventListeners(!0)}get name(){return en}dispose(){this._toggleEventListeners(),super.dispose()}}d(Ut,"selector",ri),d(Ut,"init",hi),d(Ut,"getInstance",di);const C="active",rt="data-bs-toggle",gi="button",on="Button",pi=`[${rt}="${gi}"]`,ui=t=>F(t,on),mi=t=>new qt(t);class qt extends st{constructor(e){super(e);d(this,"isActive",!1);d(this,"toggle",e=>{e&&e.preventDefault();const{element:n,isActive:o}=this;!h(n,"disabled")&&!at(n,"disabled")&&((o?b:f)(n,C),O(n,_s,o?"false":"true"),this.isActive=h(n,C))});d(this,"_toggleEventListeners",e=>{(e?_:B)(this.element,N,this.toggle)});const{element:n}=this;this.isActive=h(n,C),O(n,_s,String(!!this.isActive)),this._toggleEventListeners(!0)}get name(){return on}dispose(){this._toggleEventListeners(),super.dispose()}}d(qt,"selector",pi),d(qt,"init",mi),d(qt,"getInstance",ui);const cs="data-bs-target",kt="carousel",cn="Carousel",an="data-bs-parent",vi="data-bs-container",V=t=>{const s=[cs,an,vi,"href"],e=E(t);return s.map(n=>{const o=at(t,n);return o?n===an?M(t,o):D(o,e):null}).filter(n=>n)[0]},ge=`[data-bs-ride="${kt}"]`,Q=`${kt}-item`,as="data-bs-slide-to",$t="data-bs-slide",Tt="paused",rn={pause:"hover",keyboard:!1,touch:!0,interval:5e3},pt=t=>F(t,cn),bi=t=>new Qt(t);let pe=0,Be=0,rs=0;const ls=$(`slide.bs.${kt}`),ds=$(`slid.bs.${kt}`),ln=t=>{const{index:s,direction:e,element:n,slides:o,options:i}=t;if(t.isAnimating){const c=fs(t),a=e==="left"?"next":"prev",l=e==="left"?"start":"end";f(o[s],C),b(o[s],`${Q}-${a}`),b(o[s],`${Q}-${l}`),b(o[c],C),b(o[c],`${Q}-${l}`),w(n,ds),u.clear(n,$t),t.cycle&&!E(n).hidden&&i.interval&&!t.isPaused&&t.cycle()}};function wi(){const t=pt(this);t&&!t.isPaused&&!u.get(this,Tt)&&f(this,Tt)}function Ei(){const t=pt(this);t&&t.isPaused&&!u.get(this,Tt)&&t.cycle()}function $i(t){t.preventDefault();const s=M(this,ge)||V(this),e=pt(s);if(e&&!e.isAnimating){const n=+(at(this,as)||0);this&&!h(this,C)&&!Number.isNaN(n)&&e.to(n)}}function Ti(t){t.preventDefault();const s=M(this,ge)||V(this),e=pt(s);if(e&&!e.isAnimating){const n=at(this,$t);n==="next"?e.next():n==="prev"&&e.prev()}}const yi=({code:t,target:s})=>{const e=E(s),[n]=[...et(ge,e)].filter(i=>Gs(i)),o=pt(n);if(o&&!o.isAnimating&&!/textarea|input/i.test(s.nodeName)){const i=Et(n);t===(i?Fs:Ws)?o.prev():t===(i?Ws:Fs)&&o.next()}};function dn(t){const{target:s}=t,e=pt(this);e&&e.isTouch&&(e.indicator&&!e.indicator.contains(s)||!e.controls.includes(s))&&(t.stopImmediatePropagation(),t.stopPropagation(),t.preventDefault())}function Ci(t){const{target:s}=t,e=pt(this);if(e&&!e.isAnimating&&!e.isTouch){const{controls:n,indicators:o}=e;[...n,...o].every(i=>i===s||i.contains(s))||(pe=t.pageX,this.contains(s)&&(e.isTouch=!0,hn(e,!0)))}}const Si=t=>{Be=t.pageX},Hi=t=>{var o;const{target:s}=t,e=E(s),n=[...et(ge,e)].map(i=>pt(i)).find(i=>i.isTouch);if(n){const{element:i,index:c}=n,a=Et(i);rs=t.pageX,n.isTouch=!1,hn(n),!((o=e.getSelection())!=null&&o.toString().length)&&i.contains(s)&&Math.abs(pe-rs)>120&&(Bepe&&n.to(c+(a?1:-1))),pe=0,Be=0,rs=0}},hs=(t,s)=>{const{indicators:e}=t;[...e].forEach(n=>b(n,C)),t.indicators[s]&&f(e[s],C)},hn=(t,s)=>{const{element:e}=t,n=s?_:B;n(E(e),jo,Si,tt),n(E(e),zo,Hi,tt)},fs=t=>{const{slides:s,element:e}=t,n=D(`.${Q}.${C}`,e);return T(n)?[...s].indexOf(n):-1};class Qt extends st{constructor(e,n){super(e,n);d(this,"_toggleEventListeners",e=>{const{element:n,options:o,slides:i,controls:c,indicators:a}=this,{touch:l,pause:r,interval:g,keyboard:p}=o,v=e?_:B;r&&g&&(v(n,De,wi),v(n,Ze,Ei)),l&&i.length>2&&(v(n,Fo,Ci,tt),v(n,Ge,dn,{passive:!1}),v(n,Vo,dn,{passive:!1})),c.length&&c.forEach(k=>{k&&v(k,N,Ti)}),a.length&&a.forEach(k=>{v(k,N,$i)}),p&&v(E(n),Pe,yi)});const{element:o}=this;this.direction=Et(o)?"right":"left",this.isTouch=!1,this.slides=gt(Q,o);const{slides:i}=this;if(i.length>=2){const c=fs(this),a=[...i].find(g=>Js(g,`.${Q}-next,.${Q}-next`));this.index=c;const l=E(o);this.controls=[...et(`[${$t}]`,o),...et(`[${$t}][${cs}="#${o.id}"]`,l)].filter((g,p,v)=>p===v.indexOf(g)),this.indicator=D(`.${kt}-indicators`,o),this.indicators=[...this.indicator?et(`[${as}]`,this.indicator):[],...et(`[${as}][${cs}="#${o.id}"]`,l)].filter((g,p,v)=>p===v.indexOf(g));const{options:r}=this;this.options.interval=r.interval===!0?rn.interval:r.interval,a?this.index=[...i].indexOf(a):c<0&&(this.index=0,f(i[0],C),this.indicators.length&&hs(this,0)),this.indicators.length&&hs(this,this.index),this._toggleEventListeners(!0),r.interval&&this.cycle()}}get name(){return cn}get defaults(){return rn}get isPaused(){return h(this.element,Tt)}get isAnimating(){return D(`.${Q}-next,.${Q}-prev`,this.element)!==null}cycle(){const{element:e,options:n,isPaused:o,index:i}=this;u.clear(e,kt),o&&(u.clear(e,Tt),b(e,Tt)),u.set(e,()=>{this.element&&!this.isPaused&&!this.isTouch&&Gs(e)&&this.to(i+1)},n.interval,kt)}pause(){const{element:e,options:n}=this;!this.isPaused&&n.interval&&(f(e,Tt),u.set(e,()=>{},1,Tt))}next(){this.isAnimating||this.to(this.index+1)}prev(){this.isAnimating||this.to(this.index-1)}to(e){const{element:n,slides:o,options:i}=this,c=fs(this),a=Et(n);let l=e;if(!this.isAnimating&&c!==l&&!u.get(n,$t)){cl||c===o.length-1&&l===0)&&(this.direction=a?"left":"right");const{direction:r}=this;l<0?l=o.length-1:l>=o.length&&(l=0);const g=r==="left"?"next":"prev",p=r==="left"?"start":"end",v={relatedTarget:o[l],from:c,to:l,direction:r};dt(ls,v),dt(ds,v),w(n,ls),ls.defaultPrevented||(this.index=l,hs(this,l),zt(o[l])&&h(n,"slide")?u.set(n,()=>{f(o[l],`${Q}-${g}`),It(o[l]),f(o[l],`${Q}-${p}`),f(o[c],`${Q}-${p}`),P(o[l],()=>this.slides&&this.slides.length&&ln(this))},0,$t):(f(o[l],C),b(o[c],C),u.set(n,()=>{u.clear(n,$t),n&&i.interval&&!this.isPaused&&this.cycle(),w(n,ds)},0,$t)))}}dispose(){const{isAnimating:e}=this,n={...this,isAnimating:e};this._toggleEventListeners(),super.dispose(),n.isAnimating&&P(n.slides[n.index],()=>{ln(n)})}}d(Qt,"selector",ge),d(Qt,"init",bi),d(Qt,"getInstance",pt);const Nt="collapsing",K="collapse",fn="Collapse",Pi=`.${K}`,gn=`[${rt}="${K}"]`,Di={parent:null},Re=t=>F(t,fn),xi=t=>new Zt(t),pn=$(`show.bs.${K}`),Ai=$(`shown.bs.${K}`),un=$(`hide.bs.${K}`),Li=$(`hidden.bs.${K}`),Ii=t=>{const{element:s,parent:e,triggers:n}=t;w(s,pn),pn.defaultPrevented||(u.set(s,le,17),e&&u.set(e,le,17),f(s,Nt),b(s,K),L(s,{height:`${s.scrollHeight}px`}),P(s,()=>{u.clear(s),e&&u.clear(e),n.forEach(o=>O(o,ct,"true")),b(s,Nt),f(s,K),f(s,m),L(s,{height:""}),w(s,Ai)}))},mn=t=>{const{element:s,parent:e,triggers:n}=t;w(s,un),un.defaultPrevented||(u.set(s,le,17),e&&u.set(e,le,17),L(s,{height:`${s.scrollHeight}px`}),b(s,K),b(s,m),f(s,Nt),It(s),L(s,{height:"0px"}),P(s,()=>{u.clear(s),e&&u.clear(e),n.forEach(o=>O(o,ct,"false")),b(s,Nt),f(s,K),L(s,{height:""}),w(s,Li)}))},ki=t=>{const{target:s}=t,e=s&&M(s,gn),n=e&&V(e),o=n&&Re(n);o&&o.toggle(),e&&e.tagName==="A"&&t.preventDefault()};class Zt extends st{constructor(e,n){super(e,n);d(this,"_toggleEventListeners",e=>{const n=e?_:B,{triggers:o}=this;o.length&&o.forEach(i=>n(i,N,ki))});const{element:o,options:i}=this,c=E(o);this.triggers=[...et(gn,c)].filter(a=>V(a)===o),this.parent=T(i.parent)?i.parent:he(i.parent)?V(o)||D(i.parent,c):null,this._toggleEventListeners(!0)}get name(){return fn}get defaults(){return Di}hide(){const{triggers:e,element:n}=this;u.get(n)||(mn(this),e.length&&e.forEach(o=>f(o,`${K}d`)))}show(){const{element:e,parent:n,triggers:o}=this;let i,c;n&&(i=[...et(`.${K}.${m}`,n)].find(a=>Re(a)),c=i&&Re(i)),(!n||!u.get(n))&&!u.get(e)&&(c&&i!==e&&(mn(c),c.triggers.forEach(a=>{f(a,`${K}d`)})),Ii(this),o.length&&o.forEach(a=>b(a,`${K}d`)))}toggle(){h(this.element,m)?this.hide():this.show()}dispose(){this._toggleEventListeners(),super.dispose()}}d(Zt,"selector",Pi),d(Zt,"init",xi),d(Zt,"getInstance",Re);const Ot=["dropdown","dropup","dropstart","dropend"],vn="Dropdown",bn="dropdown-menu",wn=t=>{const s=M(t,"A");return t.tagName==="A"&&Ne(t,"href")&&at(t,"href").slice(-1)==="#"||s&&Ne(s,"href")&&at(s,"href").slice(-1)==="#"},[nt,gs,ps,us]=Ot,En=`[${rt}="${nt}"]`,Gt=t=>F(t,vn),Ni=t=>new Jt(t),Oi=`${bn}-end`,$n=[nt,gs],Tn=[ps,us],yn=["A","BUTTON"],Mi={offset:5,display:"dynamic"},ms=$(`show.bs.${nt}`),Cn=$(`shown.bs.${nt}`),vs=$(`hide.bs.${nt}`),Sn=$(`hidden.bs.${nt}`),Hn=$(`updated.bs.${nt}`),Pn=t=>{const{element:s,menu:e,parentElement:n,options:o}=t,{offset:i}=o;if(z(e,"position")!=="static"){const c=Et(s),a=h(e,Oi);["margin","top","bottom","left","right"].forEach(R=>{const Pt={};Pt[R]="",L(e,Pt)});let r=Ot.find(R=>h(n,R))||nt;const g={dropdown:[i,0,0],dropup:[0,0,i],dropstart:c?[-1,0,0,i]:[-1,i,0],dropend:c?[-1,i,0]:[-1,0,0,i]},p={dropdown:{top:"100%"},dropup:{top:"auto",bottom:"100%"},dropstart:c?{left:"100%",right:"auto"}:{left:"auto",right:"100%"},dropend:c?{left:"auto",right:"100%"}:{left:"100%",right:"auto"},menuStart:c?{right:"0",left:"auto"}:{right:"auto",left:"0"},menuEnd:c?{right:"auto",left:"0"}:{right:"0",left:"auto"}},{offsetWidth:v,offsetHeight:k}=e,{clientWidth:J,clientHeight:y}=ft(s),{left:X,top:q,width:ce,height:mt}=fe(s),S=X-v-i<0,ot=X+v+ce+i>=J,lt=q+k+i>=y,j=q+k+mt+i>=y,Y=q-k-i<0,x=(!c&&a||c&&!a)&&X+ce-v<0,ae=(c&&a||!c&&!a)&&X+v>=J;if(Tn.includes(r)&&S&&ot&&(r=nt),r===ps&&(c?ot:S)&&(r=us),r===us&&(c?S:ot)&&(r=ps),r===gs&&Y&&!j&&(r=nt),r===nt&&j&&!Y&&(r=gs),Tn.includes(r)&<&&dt(p[r],{top:"auto",bottom:0}),$n.includes(r)&&(x||ae)){let R={left:"auto",right:"auto"};!x&&ae&&!c&&(R={left:"auto",right:0}),x&&!ae&&c&&(R={left:0,right:"auto"}),R&&dt(p[r],R)}const Ht=g[r];L(e,{...p[r],margin:`${Ht.map(R=>R&&`${R}px`).join(" ")}`}),$n.includes(r)&&a&&a&&L(e,p[!c&&x||c&&ae?"menuStart":"menuEnd"]),w(n,Hn)}},_i=t=>[...t.children].map(s=>{if(s&&yn.includes(s.tagName))return s;const{firstElementChild:e}=s;return e&&yn.includes(e.tagName)?e:null}).filter(s=>s),Dn=t=>{const{element:s,options:e}=t,n=t.open?_:B,o=E(s);n(o,N,xn),n(o,qe,xn),n(o,Pe,Ri),n(o,Ro,Wi),e.display==="dynamic"&&[Ae,xe].forEach(i=>{n(Xt(s),i,Fi,tt)})},We=t=>{const s=[...Ot,"btn-group","input-group"].map(e=>gt(`${e} ${m}`,E(t))).find(e=>e.length);if(s&&s.length)return[...s[0].children].find(e=>Ot.some(n=>n===at(e,rt)))},xn=t=>{const{target:s,type:e}=t;if(s&&T(s)){const n=We(s),o=n&&Gt(n);if(o){const{parentElement:i,menu:c}=o,a=i&&i.contains(s)&&(s.tagName==="form"||M(s,"form")!==null);[N,Rs].includes(e)&&wn(s)&&t.preventDefault(),!a&&e!==qe&&s!==n&&s!==c&&o.hide()}}},Bi=t=>{const{target:s}=t,e=s&&M(s,En),n=e&&Gt(e);n&&(t.stopPropagation(),n.toggle(),e&&wn(e)&&t.preventDefault())},Ri=t=>{[Je,ts].includes(t.code)&&t.preventDefault()};function Wi(t){const{code:s}=t,e=We(this),n=e&&Gt(e),{activeElement:o}=e&&E(e);if(n&&o){const{menu:i,open:c}=n,a=_i(i);if(a&&a.length&&[Je,ts].includes(s)){let l=a.indexOf(o);o===e?l=0:s===ts?l=l>1?l-1:0:s===Je&&(l=l{(e?_:B)(this.element,N,Bi)});const{parentElement:o}=this.element,[i]=gt(bn,o);i&&(this.parentElement=o,this.menu=i,this._toggleEventListeners(!0))}get name(){return vn}get defaults(){return Mi}toggle(){this.open?this.hide():this.show()}show(){const{element:e,open:n,menu:o,parentElement:i}=this;if(!n){const c=We(e),a=c&&Gt(c);a&&a.hide(),[ms,Cn,Hn].forEach(l=>{l.relatedTarget=e}),w(i,ms),ms.defaultPrevented||(f(o,m),f(i,m),O(e,ct,"true"),Pn(this),this.open=!n,ht(e),Dn(this),w(i,Cn))}}hide(){const{element:e,open:n,menu:o,parentElement:i}=this;n&&([vs,Sn].forEach(c=>{c.relatedTarget=e}),w(i,vs),vs.defaultPrevented||(b(o,m),b(i,m),O(e,ct,"false"),this.open=!n,Dn(this),w(i,Sn)))}dispose(){this.open&&this.hide(),this._toggleEventListeners(),super.dispose()}}d(Jt,"selector",En),d(Jt,"init",Ni),d(Jt,"getInstance",Gt);const U="modal",bs="Modal",ws="Offcanvas",ji="fixed-top",zi="fixed-bottom",An="sticky-top",Ln="position-sticky",In=t=>[...gt(ji,t),...gt(zi,t),...gt(An,t),...gt(Ln,t),...gt("is-fixed",t)],Vi=t=>{const s=wt(t);L(s,{paddingRight:"",overflow:""});const e=In(s);e.length&&e.forEach(n=>{L(n,{paddingRight:"",marginRight:""})})},kn=t=>{const{clientWidth:s}=ft(t),{innerWidth:e}=Xt(t);return Math.abs(e-s)},Nn=(t,s)=>{const e=wt(t),n=parseInt(z(e,"paddingRight"),10),i=z(e,"overflow")==="hidden"&&n?0:kn(t),c=In(e);s&&(L(e,{overflow:"hidden",paddingRight:`${n+i}px`}),c.length&&c.forEach(a=>{const l=z(a,"paddingRight");if(a.style.paddingRight=`${parseInt(l,10)+i}px`,[An,Ln].some(r=>h(a,r))){const r=z(a,"marginRight");a.style.marginRight=`${parseInt(r,10)-i}px`}}))},Z="offcanvas",yt=vt({tagName:"div",className:"popup-container"}),On=(t,s)=>{const e=A(s)&&s.nodeName==="BODY",n=A(s)&&!e?s:yt,o=e?s:wt(t);A(t)&&(n===yt&&o.append(yt),n.append(t))},Mn=(t,s)=>{const e=A(s)&&s.nodeName==="BODY",n=A(s)&&!e?s:yt;A(t)&&(t.remove(),n===yt&&!yt.children.length&&yt.remove())},Es=(t,s)=>{const e=A(s)&&s.nodeName!=="BODY"?s:yt;return A(t)&&e.contains(t)},_n="backdrop",Bn=`${U}-${_n}`,Rn=`${Z}-${_n}`,Wn=`.${U}.${m}`,$s=`.${Z}.${m}`,I=vt("div"),Mt=t=>D(`${Wn},${$s}`,E(t)),Ts=t=>{const s=t?Bn:Rn;[Bn,Rn].forEach(e=>{b(I,e)}),f(I,s)},Fn=(t,s,e)=>{Ts(e),On(I,wt(t)),s&&f(I,W)},jn=()=>{h(I,m)||(f(I,m),It(I))},Fe=()=>{b(I,m)},zn=t=>{Mt(t)||(b(I,W),Mn(I,wt(t)),Vi(t))},Vn=t=>T(t)&&z(t,"visibility")!=="hidden"&&t.offsetParent!==null,Ki=`.${U}`,Kn=`[${rt}="${U}"]`,Xi=`[${Me}="${U}"]`,Xn=`${U}-static`,Yi={backdrop:!0,keyboard:!0},ue=t=>F(t,bs),Ui=t=>new te(t),je=$(`show.bs.${U}`),Yn=$(`shown.bs.${U}`),ys=$(`hide.bs.${U}`),Un=$(`hidden.bs.${U}`),qn=t=>{const{element:s}=t,e=kn(s),{clientHeight:n,scrollHeight:o}=ft(s),{clientHeight:i,scrollHeight:c}=s,a=i!==c;if(!a&&e){const l=Et(s)?"paddingLeft":"paddingRight",r={};r[l]=`${e}px`,L(s,r)}Nn(s,a||n!==o)},Qn=(t,s)=>{const e=s?_:B,{element:n,update:o}=t;e(n,N,Zi),e(Xt(n),xe,o,tt),e(E(n),Pe,Qi)},Zn=t=>{const{triggers:s,element:e,relatedTarget:n}=t;zn(e),L(e,{paddingRight:"",display:""}),Qn(t);const o=je.relatedTarget||s.find(Vn);o&&ht(o),Un.relatedTarget=n,w(e,Un)},Gn=t=>{const{element:s,relatedTarget:e}=t;ht(s),Qn(t,!0),Yn.relatedTarget=e,w(s,Yn)},Jn=t=>{const{element:s,hasFade:e}=t;L(s,{display:"block"}),qn(t),Mt(s)||L(wt(s),{overflow:"hidden"}),f(s,m),At(s,Se),O(s,He,"true"),e?P(s,()=>Gn(t)):Gn(t)},to=t=>{const{element:s,options:e,hasFade:n}=t;e.backdrop&&n&&h(I,m)&&!Mt(s)?(Fe(),P(I,()=>Zn(t))):Zn(t)},qi=t=>{const{target:s}=t,e=s&&M(s,Kn),n=e&&V(e),o=n&&ue(n);o&&(e&&e.tagName==="A"&&t.preventDefault(),o.relatedTarget=e,o.toggle())},Qi=({code:t,target:s})=>{const e=D(Wn,E(s)),n=e&&ue(e);if(n){const{options:o}=n;o.keyboard&&t===es&&h(e,m)&&(n.relatedTarget=null,n.hide())}},Zi=t=>{var n,o;const{currentTarget:s}=t,e=s?ue(s):null;if(e&&s&&!u.get(s)){const{options:i,isStatic:c,modalDialog:a}=e,{backdrop:l}=i,{target:r}=t,g=(o=(n=E(s))==null?void 0:n.getSelection())==null?void 0:o.toString().length,p=a.contains(r),v=r&&M(r,Xi);c&&!p?u.set(s,()=>{f(s,Xn),P(a,()=>Gi(e))},17):(v||!g&&!c&&!p&&l)&&(e.relatedTarget=v||null,e.hide(),t.preventDefault())}},Gi=t=>{const{element:s,modalDialog:e}=t,n=(zt(e)||0)+17;b(s,Xn),u.set(s,()=>u.clear(s),n)};class te extends st{constructor(e,n){super(e,n);d(this,"update",()=>{h(this.element,m)&&qn(this)});d(this,"_toggleEventListeners",e=>{const n=e?_:B,{triggers:o}=this;o.length&&o.forEach(i=>n(i,N,qi))});const{element:o}=this,i=D(`.${U}-dialog`,o);i&&(this.modalDialog=i,this.triggers=[...et(Kn,E(o))].filter(c=>V(c)===o),this.isStatic=this.options.backdrop==="static",this.hasFade=h(o,W),this.relatedTarget=null,this._toggleEventListeners(!0))}get name(){return bs}get defaults(){return Yi}toggle(){h(this.element,m)?this.hide():this.show()}show(){const{element:e,options:n,hasFade:o,relatedTarget:i}=this,{backdrop:c}=n;let a=0;if(!h(e,m)&&(je.relatedTarget=i||void 0,w(e,je),!je.defaultPrevented)){const l=Mt(e);if(l&&l!==e){const r=ue(l)||F(l,ws);r&&r.hide()}c?(Es(I)?Ts(!0):Fn(e,o,!0),a=zt(I),jn(),setTimeout(()=>Jn(this),a)):(Jn(this),l&&h(I,m)&&Fe())}}hide(){const{element:e,hasFade:n,relatedTarget:o}=this;h(e,m)&&(ys.relatedTarget=o||void 0,w(e,ys),ys.defaultPrevented||(b(e,m),O(e,Se,"true"),At(e,He),n?P(e,()=>to(this)):to(this)))}dispose(){const e={...this},{element:n,modalDialog:o}=e,i=()=>super.dispose();this._toggleEventListeners(),this.hide(),h(n,"fade")?P(o,i):i()}}d(te,"selector",Ki),d(te,"init",Ui),d(te,"getInstance",ue);const Ji=`.${Z}`,Cs=`[${rt}="${Z}"]`,tc=`[${Me}="${Z}"]`,ze=`${Z}-toggling`,ec={backdrop:!0,keyboard:!0,scroll:!1},me=t=>F(t,ws),sc=t=>new ee(t),Ve=$(`show.bs.${Z}`),eo=$(`shown.bs.${Z}`),Ss=$(`hide.bs.${Z}`),so=$(`hidden.bs.${Z}`),nc=t=>{const{element:s}=t,{clientHeight:e,scrollHeight:n}=ft(s);Nn(s,e!==n)},no=(t,s)=>{const e=s?_:B,n=E(t.element);e(n,Pe,ac),e(n,N,cc)},oo=t=>{const{element:s,options:e}=t;e.scroll||(nc(t),L(wt(s),{overflow:"hidden"})),f(s,ze),f(s,m),L(s,{visibility:"visible"}),P(s,()=>rc(t))},oc=t=>{const{element:s,options:e}=t,n=Mt(s);s.blur(),!n&&e.backdrop&&h(I,m)&&Fe(),P(s,()=>lc(t))},ic=t=>{const s=M(t.target,Cs),e=s&&V(s),n=e&&me(e);n&&(n.relatedTarget=s,n.toggle(),s&&s.tagName==="A"&&t.preventDefault())},cc=t=>{const{target:s}=t,e=D($s,E(s)),n=D(tc,e),o=e&&me(e);if(o){const{options:i,triggers:c}=o,{backdrop:a}=i,l=M(s,Cs),r=E(e).getSelection();(!I.contains(s)||a!=="static")&&(!(r&&r.toString().length)&&(!e.contains(s)&&a&&(!l||c.includes(s))||n&&n.contains(s))&&(o.relatedTarget=n&&n.contains(s)?n:null,o.hide()),l&&l.tagName==="A"&&t.preventDefault())}},ac=({code:t,target:s})=>{const e=D($s,E(s)),n=e&&me(e);n&&n.options.keyboard&&t===es&&(n.relatedTarget=null,n.hide())},rc=t=>{const{element:s}=t;b(s,ze),At(s,Se),O(s,He,"true"),O(s,"role","dialog"),w(s,eo),no(t,!0),ht(s)},lc=t=>{const{element:s,triggers:e}=t;O(s,Se,"true"),At(s,He),At(s,"role"),L(s,{visibility:""});const n=Ve.relatedTarget||e.find(Vn);n&&ht(n),zn(s),w(s,so),b(s,ze),Mt(s)||no(t)};class ee extends st{constructor(e,n){super(e,n);d(this,"_toggleEventListeners",e=>{const n=e?_:B;this.triggers.forEach(o=>n(o,N,ic))});const{element:o}=this;this.triggers=[...et(Cs,E(o))].filter(i=>V(i)===o),this.relatedTarget=null,this._toggleEventListeners(!0)}get name(){return ws}get defaults(){return ec}toggle(){h(this.element,m)?this.hide():this.show()}show(){const{element:e,options:n,relatedTarget:o}=this;let i=0;if(!h(e,m)&&(Ve.relatedTarget=o||void 0,eo.relatedTarget=o||void 0,w(e,Ve),!Ve.defaultPrevented)){const c=Mt(e);if(c&&c!==e){const a=me(c)||F(c,bs);a&&a.hide()}n.backdrop?(Es(I)?Ts():Fn(e,!0),i=zt(I),jn(),setTimeout(()=>oo(this),i)):(oo(this),c&&h(I,m)&&Fe())}}hide(){const{element:e,relatedTarget:n}=this;h(e,m)&&(Ss.relatedTarget=n||void 0,so.relatedTarget=n||void 0,w(e,Ss),Ss.defaultPrevented||(f(e,ze),b(e,m),oc(this)))}dispose(){const e={...this},{element:n,options:o}=e,i=o.backdrop?zt(I):0,c=()=>setTimeout(()=>super.dispose(),i+17);this._toggleEventListeners(),this.hide(),h(n,m)?P(n,c):c()}}d(ee,"selector",Ji),d(ee,"init",sc),d(ee,"getInstance",me);const _t="popover",Ke="Popover",ut="tooltip",io=t=>{const s=t===ut,e=s?`${t}-inner`:`${t}-body`,n=s?"":`

                                                                                                                                                                                `,o=`
                                                                                                                                                                                `,i=`
                                                                                                                                                                                `;return`
                                                                                                                                                                                ${n+o+i}
                                                                                                                                                                                `},co={top:"top",bottom:"bottom",left:"start",right:"end"},Hs=t=>{const s=/\b(top|bottom|start|end)+/,{element:e,tooltip:n,container:o,options:i,arrow:c}=t;if(n){const a={...co},l=Et(e);L(n,{top:"",left:"",right:"",bottom:""});const r=t.name===Ke,{offsetWidth:g,offsetHeight:p}=n,{clientWidth:v,clientHeight:k,offsetWidth:J}=ft(e);let{placement:y}=i;const{clientWidth:X,offsetWidth:q}=o,mt=z(o,"position")==="fixed",S=Math.abs(mt?X-q:v-J),ot=l&&mt?S:0,lt=v-(l?0:S)-1,{width:j,height:Y,left:x,right:ae,top:Ht}=fe(e,!0),{x:R,y:Pt}={x,y:Ht};L(c,{top:"",left:"",right:"",bottom:""});let Wt=0,Ee="",Dt=0,ks="",re="",Xe="",Ns="";const Ft=c.offsetWidth||0,xt=c.offsetHeight||0,Os=Ft/2;let $e=Ht-p-xt<0,Te=Ht+p+Y+xt>=k,ye=x-g-Ft=lt;const Ye=["left","right"],Ms=["top","bottom"];$e=Ye.includes(y)?Ht+Y/2-p/2-xt<0:$e,Te=Ye.includes(y)?Ht+p/2+Y/2+xt>=k:Te,ye=Ms.includes(y)?x+j/2-g/2=lt:Ce,y=Ye.includes(y)&&ye&&Ce?"top":y,y=y==="top"&&$e?"bottom":y,y=y==="bottom"&&Te?"top":y,y=y==="left"&&ye?"right":y,y=y==="right"&&Ce?"left":y,n.className.includes(y)||(n.className=n.className.replace(s,a[y])),Ye.includes(y)?(y==="left"?Dt=R-g-(r?Ft:0):Dt=R+j+(r?Ft:0),$e&&Te?(Wt=0,Ee=0,re=Ht+Y/2-xt/2):$e?(Wt=Pt,Ee="",re=Y/2-Ft):Te?(Wt=Pt-p+Y,Ee="",re=p-Y/2-Ft):(Wt=Pt-p/2+Y/2,re=p/2-xt/2)):Ms.includes(y)&&(y==="top"?Wt=Pt-p-(r?xt:0):Wt=Pt+Y+(r?xt:0),ye?(Dt=0,Xe=R+j/2-Os):Ce?(Dt="auto",ks=0,Ns=j/2+lt-ae-Os):(Dt=R-g/2+j/2,Xe=g/2-Os)),L(n,{top:`${Wt}px`,bottom:Ee===""?"":`${Ee}px`,left:Dt==="auto"?Dt:`${Dt}px`,right:ks!==""?`${ks}px`:""}),T(c)&&(re!==""&&(c.style.top=`${re}px`),Xe!==""?c.style.left=`${Xe}px`:Ns!==""&&(c.style.right=`${Ns}px`));const zc=$(`updated.bs.${Vt(t.name)}`);w(e,zc)}},Ps={template:io(ut),title:"",customClass:"",trigger:"hover focus",placement:"top",sanitizeFn:void 0,animation:!0,delay:200,container:document.body,content:"",dismissible:!1,btnClose:""},ao="data-original-title",Bt="Tooltip",Ct=(t,s,e)=>{if(he(s)&&s.length){let n=s.trim();oi(e)&&(n=e(n));const i=new DOMParser().parseFromString(n,"text/html");t.append(...i.body.childNodes)}else T(s)?t.append(s):(ii(s)||ni(s)&&s.every(A))&&t.append(...s)},dc=t=>{const s=t.name===Bt,{id:e,element:n,options:o}=t,{title:i,placement:c,template:a,animation:l,customClass:r,sanitizeFn:g,dismissible:p,content:v,btnClose:k}=o,J=s?ut:_t,y={...co};let X=[],q=[];Et(n)&&(y.left="end",y.right="start");const ce=`bs-${J}-${y[c]}`;let mt;if(T(a))mt=a;else{const ot=vt("div");Ct(ot,a,g),mt=ot.firstChild}t.tooltip=T(mt)?mt.cloneNode(!0):void 0;const{tooltip:S}=t;if(S){O(S,"id",e),O(S,"role",ut);const ot=s?`${ut}-inner`:`${_t}-body`,lt=s?null:D(`.${_t}-header`,S),j=D(`.${ot}`,S);t.arrow=D(`.${J}-arrow`,S);const{arrow:Y}=t;if(T(i))X=[i.cloneNode(!0)];else{const x=vt("div");Ct(x,i,g),X=[...x.childNodes]}if(T(v))q=[v.cloneNode(!0)];else{const x=vt("div");Ct(x,v,g),q=[...x.childNodes]}if(p)if(i)if(T(k))X=[...X,k.cloneNode(!0)];else{const x=vt("div");Ct(x,k,g),X=[...X,x.firstChild]}else if(lt&<.remove(),T(k))q=[...q,k.cloneNode(!0)];else{const x=vt("div");Ct(x,k,g),q=[...q,x.firstChild]}s?i&&j&&Ct(j,i,g):(i&<&&Ct(lt,X,g),v&&j&&Ct(j,q,g),t.btn=D(".btn-close",S)||void 0),f(S,"position-fixed"),f(Y,"position-absolute"),h(S,J)||f(S,J),l&&!h(S,W)&&f(S,W),r&&!h(S,r)&&f(S,r),h(S,ce)||f(S,ce)}},hc=t=>{const s=["HTML","BODY"],e=[];let{parentNode:n}=t;for(;n&&!s.includes(n.nodeName);)n=si(n),Us(n)||ci(n)||e.push(n);return e.find((o,i)=>z(o,"position")!=="relative"&&e.slice(i+1).every(c=>z(c,"position")==="static")?o:null)||E(t).body},fc=`[${rt}="${ut}"],[data-tip="${ut}"]`,ro="title";let lo=t=>F(t,Bt);const gc=t=>new St(t),pc=t=>{const{element:s,tooltip:e,container:n,offsetParent:o}=t;At(s,it),Mn(e,n===o?n:o)},ve=t=>{const{tooltip:s,container:e,offsetParent:n}=t;return s&&Es(s,e===n?e:n)},uc=(t,s)=>{const{element:e}=t;t._toggleEventListeners(),Ne(e,ao)&&t.name===Bt&&uo(t),s&&s()},ho=(t,s)=>{const e=s?_:B,{element:n}=t;e(E(n),Ge,t.handleTouch,tt),[Ae,xe].forEach(o=>{e(Xt(n),o,t.update,tt)})},fo=t=>{const{element:s}=t,e=$(`shown.bs.${Vt(t.name)}`);ho(t,!0),w(s,e),u.clear(s,"in")},go=t=>{const{element:s}=t,e=$(`hidden.bs.${Vt(t.name)}`);ho(t),pc(t),w(s,e),u.clear(s,"out")},po=(t,s)=>{const e=s?_:B,{element:n,container:o,offsetParent:i}=t,{offsetHeight:c,scrollHeight:a}=o,l=M(n,`.${U}`),r=M(n,`.${Z}`),g=Xt(n),v=o===i&&c!==a?o:g;e(v,xe,t.update,tt),e(v,Ae,t.update,tt),l&&e(l,`hide.bs.${U}`,t.handleHide),r&&e(r,`hide.bs.${Z}`,t.handleHide)},uo=(t,s)=>{const e=[ao,ro],{element:n}=t;O(n,e[s?0:1],s||at(n,e[0])||""),At(n,e[s?1:0])};class St extends st{constructor(e,n){super(e,n);d(this,"handleFocus",()=>ht(this.element));d(this,"handleShow",()=>this.show());d(this,"handleHide",()=>this.hide());d(this,"update",()=>{Hs(this)});d(this,"toggle",()=>{const{tooltip:e}=this;e&&!ve(this)?this.show():this.hide()});d(this,"handleTouch",({target:e})=>{const{tooltip:n,element:o}=this;n&&n.contains(e)||e===o||e&&o.contains(e)||this.hide()});d(this,"_toggleEventListeners",e=>{const n=e?_:B,{element:o,options:i,btn:c}=this,{trigger:a}=i,r=!!(this.name!==Bt&&i.dismissible);a.includes("manual")||(this.enabled=!!e,a.split(" ").forEach(p=>{p===Wo?(n(o,Rs,this.handleShow),n(o,De,this.handleShow),r||(n(o,Ze,this.handleHide),n(E(o),Ge,this.handleTouch,tt))):p===N?n(o,p,r?this.handleShow:this.toggle):p===qe&&(n(o,Qe,this.handleShow),r||n(o,Bs,this.handleHide),qo&&n(o,N,this.handleFocus)),r&&c&&n(c,N,this.handleHide)}))});const{element:o}=this,i=this.name===Bt,c=i?ut:_t,a=i?Bt:Ke;lo=r=>F(r,a),this.enabled=!0,this.id=`${c}-${Zs(o,c)}`;const{options:l}=this;!l.title&&i||!i&&!l.content||(dt(Ps,{titleAttr:""}),Ne(o,ro)&&i&&typeof l.title=="string"&&uo(this,l.title),this.container=hc(o),this.offsetParent=["sticky","fixed"].some(r=>z(this.container,"position")===r)?this.container:E(this.element).body,dc(this),this._toggleEventListeners(!0))}get name(){return Bt}get defaults(){return Ps}show(){const{options:e,tooltip:n,element:o,container:i,offsetParent:c,id:a}=this,{animation:l}=e,r=u.get(o,"out"),g=i===c?i:c;u.clear(o,"out"),n&&!r&&!ve(this)&&u.set(o,()=>{const p=$(`show.bs.${Vt(this.name)}`);w(o,p),p.defaultPrevented||(On(n,g),O(o,it,`#${a}`),this.update(),po(this,!0),h(n,m)||f(n,m),l?P(n,()=>fo(this)):fo(this))},17,"in")}hide(){const{options:e,tooltip:n,element:o}=this,{animation:i,delay:c}=e;u.clear(o,"in"),n&&ve(this)&&u.set(o,()=>{const a=$(`hide.bs.${Vt(this.name)}`);w(o,a),a.defaultPrevented||(this.update(),b(n,m),po(this),i?P(n,()=>go(this)):go(this))},c+17,"out")}enable(){const{enabled:e}=this;e||(this._toggleEventListeners(!0),this.enabled=!e)}disable(){const{tooltip:e,options:n,enabled:o}=this,{animation:i}=n;o&&(e&&ve(this)&&i?(this.hide(),P(e,()=>this._toggleEventListeners())):this._toggleEventListeners(),this.enabled=!o)}toggleEnabled(){this.enabled?this.disable():this.enable()}dispose(){const{tooltip:e,options:n}=this,o={...this,name:this.name},i=()=>setTimeout(()=>uc(o,()=>super.dispose()),17);n.animation&&ve(o)?(this.options.delay=0,this.hide(),P(e,i)):i()}}d(St,"selector",fc),d(St,"init",gc),d(St,"getInstance",lo),d(St,"styleTip",Hs);const mc=`[${rt}="${_t}"],[data-tip="${_t}"]`,vc=dt({},Ps,{template:io(_t),content:"",dismissible:!1,btnClose:''}),bc=t=>F(t,Ke),wc=t=>new Rt(t);class Rt extends St{constructor(e,n){super(e,n);d(this,"show",()=>{super.show();const{options:e,btn:n}=this;e.dismissible&&n&&setTimeout(()=>ht(n),17)})}get name(){return Ke}get defaults(){return vc}}d(Rt,"selector",mc),d(Rt,"init",wc),d(Rt,"getInstance",bc),d(Rt,"styleTip",Hs);const Ec="scrollspy",mo="ScrollSpy",$c='[data-bs-spy="scroll"]',Tc={offset:10,target:null},yc=t=>F(t,mo),Cc=t=>new se(t),vo=$(`activate.bs.${Ec}`),Sc=t=>{const{target:s,scrollTarget:e,options:n,itemsLength:o,scrollHeight:i,element:c}=t,{offset:a}=n,l=ns(e),r=s&&is("A",s),g=e?bo(e):i;if(t.scrollTop=l?e.scrollY:e.scrollTop,r&&(g!==i||o!==r.length)){let p,v,k;t.items=[],t.offsets=[],t.scrollHeight=g,t.maxScroll=t.scrollHeight-Hc(t),[...r].forEach(J=>{p=at(J,"href"),v=p&&p.charAt(0)==="#"&&p.slice(-1)!=="#"&&D(p,E(c)),v&&(t.items.push(J),k=fe(v),t.offsets.push((l?k.top+t.scrollTop:v.offsetTop)-a))}),t.itemsLength=t.items.length}},bo=t=>T(t)?t.scrollHeight:ft(t).scrollHeight,Hc=({element:t,scrollTarget:s})=>ns(s)?s.innerHeight:fe(t).height,wo=t=>{[...is("A",t)].forEach(s=>{h(s,C)&&b(s,C)})},Eo=(t,s)=>{const{target:e,element:n}=t;T(e)&&wo(e),t.activeItem=s,f(s,C);const o=[];let i=s;for(;i!==wt(n);)i=i.parentElement,(h(i,"nav")||h(i,"dropdown-menu"))&&o.push(i);o.forEach(c=>{const a=c.previousElementSibling;a&&!h(a,C)&&f(a,C)}),vo.relatedTarget=s,w(n,vo)};class se extends st{constructor(e,n){super(e,n);d(this,"refresh",()=>{const{target:e}=this;if(T(e)&&e.offsetHeight>0){Sc(this);const{scrollTop:n,maxScroll:o,itemsLength:i,items:c,activeItem:a}=this;if(n>=o){const r=c[i-1];a!==r&&Eo(this,r);return}const{offsets:l}=this;if(a&&n0){this.activeItem=null,e&&wo(e);return}c.forEach((r,g)=>{a!==r&&n>=l[g]&&(typeof l[g+1]>"u"||n{(e?_:B)(this.scrollTarget,Ae,this.refresh,tt)});const{element:o,options:i}=this;this.target=D(i.target,E(o)),this.target&&(this.scrollTarget=o.clientHeightF(t,$o),Pc=t=>new ne(t),Ds=$(`show.bs.${be}`),Co=$(`shown.bs.${be}`),xs=$(`hide.bs.${be}`),So=$(`hidden.bs.${be}`),we=new Map,Ho=t=>{const{tabContent:s,nav:e}=t;s&&h(s,Nt)&&(s.style.height="",b(s,Nt)),e&&u.clear(e)},Po=t=>{const{element:s,tabContent:e,content:n,nav:o}=t,{tab:i}=T(o)&&we.get(o)||{tab:null};if(e&&n&&h(n,W)){const{currentHeight:c,nextHeight:a}=we.get(s)||{currentHeight:0,nextHeight:0};c===a?Ho(t):setTimeout(()=>{e.style.height=`${a}px`,It(e),P(e,()=>Ho(t))},50)}else o&&u.clear(o);Co.relatedTarget=i,w(s,Co)},Do=t=>{const{element:s,content:e,tabContent:n,nav:o}=t,{tab:i,content:c}=o&&we.get(o)||{tab:null,content:null};let a=0;if(n&&e&&h(e,W)&&([c,e].forEach(l=>{T(l)&&f(l,"overflow-hidden")}),a=T(c)?c.scrollHeight:0),Ds.relatedTarget=i,So.relatedTarget=s,w(s,Ds),!Ds.defaultPrevented){if(e&&f(e,C),c&&b(c,C),n&&e&&h(e,W)){const l=e.scrollHeight;we.set(s,{currentHeight:a,nextHeight:l,tab:null,content:null}),f(n,Nt),n.style.height=`${a}px`,It(n),[c,e].forEach(r=>{r&&b(r,"overflow-hidden")})}e&&e&&h(e,W)?setTimeout(()=>{f(e,m),P(e,()=>{Po(t)})},1):(e&&f(e,m),Po(t)),i&&w(i,So)}},xo=t=>{const{nav:s}=t;if(!T(s))return{tab:null,content:null};const e=gt(C,s);let n=null;e.length===1&&!Ot.some(i=>h(e[0].parentElement,i))?[n]=e:e.length>1&&(n=e[e.length-1]);const o=T(n)?V(n):null;return{tab:n,content:o}},Ao=t=>{if(!T(t))return null;const s=M(t,`.${Ot.join(",.")}`);return s?D(`.${Ot[0]}-toggle`,s):null},Dc=t=>{const s=yo(t.target);s&&(t.preventDefault(),s.show())};class ne extends st{constructor(e){super(e);d(this,"_toggleEventListeners",e=>{(e?_:B)(this.element,N,Dc)});const{element:n}=this,o=V(n);if(o){const i=M(n,".nav"),c=M(o,".tab-content");this.nav=i,this.content=o,this.tabContent=c,this.dropdown=Ao(n);const{tab:a}=xo(this);if(i&&!a){const l=D(To,i),r=l&&V(l);r&&(f(l,C),f(r,m),f(r,C),O(n,Ue,"true"))}this._toggleEventListeners(!0)}}get name(){return $o}show(){const{element:e,content:n,nav:o,dropdown:i}=this;if(!(o&&u.get(o))&&!h(e,C)){const{tab:c,content:a}=xo(this);if(o&&we.set(o,{tab:c,content:a,currentHeight:0,nextHeight:0}),xs.relatedTarget=e,T(c)&&(w(c,xs),!xs.defaultPrevented)){f(e,C),O(e,Ue,"true");const l=T(c)&&Ao(c);if(l&&h(l,C)&&b(l,C),o){const r=()=>{c&&(b(c,C),O(c,Ue,"false")),i&&!h(i,C)&&f(i,C)};a&&(h(a,W)||n&&h(n,W))?u.set(o,r,1):r()}a&&(b(a,m),h(a,W)?P(a,()=>Do(this)):Do(this))}}}dispose(){this._toggleEventListeners(),super.dispose()}}d(ne,"selector",To),d(ne,"init",Pc),d(ne,"getInstance",yo);const G="toast",Lo="Toast",xc=`.${G}`,Ac=`[${Me}="${G}"]`,Io=`[${rt}="${G}"]`,oe="showing",ko="hide",Lc={animation:!0,autohide:!0,delay:5e3},As=t=>F(t,Lo),Ic=t=>new ie(t),No=$(`show.bs.${G}`),kc=$(`shown.bs.${G}`),Oo=$(`hide.bs.${G}`),Nc=$(`hidden.bs.${G}`),Mo=t=>{const{element:s,options:e}=t;b(s,oe),u.clear(s,oe),w(s,kc),e.autohide&&u.set(s,()=>t.hide(),e.delay,G)},_o=t=>{const{element:s}=t;b(s,oe),b(s,m),f(s,ko),u.clear(s,G),w(s,Nc)},Oc=t=>{const{element:s,options:e}=t;f(s,oe),e.animation?(It(s),P(s,()=>_o(t))):_o(t)},Mc=t=>{const{element:s,options:e}=t;u.set(s,()=>{b(s,ko),It(s),f(s,m),f(s,oe),e.animation?P(s,()=>Mo(t)):Mo(t)},17,oe)},_c=t=>{u.clear(t.element,G),t._toggleEventListeners()},Bc=t=>{const{target:s}=t,e=s&&M(s,Io),n=e&&V(e),o=n&&As(n);o&&(e&&e.tagName==="A"&&t.preventDefault(),o.relatedTarget=e,o.show())},Rc=t=>{const s=t.target,e=As(s),{type:n,relatedTarget:o}=t;e&&s!==o&&!s.contains(o)&&([De,Qe].includes(n)?u.clear(s,G):u.set(s,()=>e.hide(),e.options.delay,G))};class ie extends st{constructor(e,n){super(e,n);d(this,"show",()=>{const{element:e,isShown:n}=this;e&&!n&&(w(e,No),No.defaultPrevented||Mc(this))});d(this,"hide",()=>{const{element:e,isShown:n}=this;e&&n&&(w(e,Oo),Oo.defaultPrevented||Oc(this))});d(this,"_toggleEventListeners",e=>{const n=e?_:B,{element:o,triggers:i,dismiss:c,options:a,hide:l}=this;c&&n(c,N,l),a.autohide&&[Qe,Bs,De,Ze].forEach(r=>n(o,r,Rc)),i.length&&i.forEach(r=>n(r,N,Bc))});const{element:o,options:i}=this;i.animation&&!h(o,W)?f(o,W):!i.animation&&h(o,W)&&b(o,W),this.dismiss=D(Ac,o),this.triggers=[...et(Io,E(o))].filter(c=>V(c)===o),this._toggleEventListeners(!0)}get name(){return Lo}get defaults(){return Lc}get isShown(){return h(this.element,m)}dispose(){const{element:e,isShown:n}=this;n&&b(e,m),_c(this),super.dispose()}}d(ie,"selector",xc),d(ie,"init",Ic),d(ie,"getInstance",As);const Ls=new Map;[Ut,qt,Qt,Zt,Jt,te,ee,Rt,se,ne,ie,St].forEach(t=>Ls.set(t.prototype.name,t));const Wc=(t,s)=>{[...s].forEach(e=>t(e))},Fc=(t,s)=>{const e=Lt.getAllFor(t);e&&[...e].forEach(([n,o])=>{s.contains(n)&&o.dispose()})},Is=t=>{const s=t&&t.nodeName?t:document,e=[...is("*",s)];Ls.forEach(n=>{const{init:o,selector:i}=n;Wc(o,e.filter(c=>Js(c,i)))})},jc=t=>{const s=t&&t.nodeName?t:document;Ls.forEach(e=>{Fc(e.prototype.name,s)})};return document.body?Is():_(document,"DOMContentLoaded",()=>Is(),{once:!0}),H.Alert=Ut,H.Button=qt,H.Carousel=Qt,H.Collapse=Zt,H.Dropdown=Jt,H.Modal=te,H.Offcanvas=ee,H.Popover=Rt,H.ScrollSpy=se,H.Tab=ne,H.Toast=ie,H.Tooltip=St,H.initCallback=Is,H.removeDataAPI=jc,Object.defineProperty(H,Symbol.toStringTag,{value:"Module"}),H}({}); -//# sourceMappingURL=bootstrap-native.js.map diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/clipboard.min.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/clipboard.min.js deleted file mode 100644 index b00ee515..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.0 - * https://zenorocha.github.io/clipboard.js - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){var o,r,i;!function(a,c){r=[t,n(7)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(t){return t&&t.__esModule?t:{default:t}}(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])}); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements-es5-adapter.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements-es5-adapter.js deleted file mode 100644 index 3a694b8f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements-es5-adapter.js +++ /dev/null @@ -1,15 +0,0 @@ -/** -@license @nocompile -Copyright (c) 2018 The Polymer Project Authors. All rights reserved. -This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt -The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt -The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt -Code distributed by Google as part of the polymer project is also -subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ -(function () { - 'use strict'; - - (function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.hasOwnProperty('polyfillWrapFlushCallback'))return;const a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)},HTMLElement.prototype=a.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,a);})(); - -}()); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements.min.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements.min.js deleted file mode 100644 index 9b64a23c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/custom-elements.min.js +++ /dev/null @@ -1,38 +0,0 @@ -(function(){ - 'use strict';var h=new function(){};var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function m(b){var a=aa.has(b);b=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);return!a&&b}function n(b){var a=b.isConnected;if(void 0!==a)return a;for(;b&&!(b.__CE_isImportDocument||b instanceof Document);)b=b.parentNode||(window.ShadowRoot&&b instanceof ShadowRoot?b.host:void 0);return!(!b||!(b.__CE_isImportDocument||b instanceof Document))} - function p(b,a){for(;a&&a!==b&&!a.nextSibling;)a=a.parentNode;return a&&a!==b?a.nextSibling:null} - function t(b,a,c){c=c?c:new Set;for(var d=b;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;a(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)t(d,a,c);d=p(b,e);continue}else if("template"===f){d=p(b,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)t(e,a,c)}d=d.firstChild?d.firstChild:p(b,d)}}function u(b,a,c){b[a]=c};function v(){this.a=new Map;this.s=new Map;this.f=[];this.b=!1}function ba(b,a,c){b.a.set(a,c);b.s.set(c.constructor,c)}function w(b,a){b.b=!0;b.f.push(a)}function x(b,a){b.b&&t(a,function(a){return y(b,a)})}function y(b,a){if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var c=0;ct?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);r>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);r>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===ho||n[0]===po?po+n:n}function s(n){return(n+="")[0]===po?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function d(){var n=0;for(var t in this._)++n;return n}function v(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function x(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function M(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=go.length;e=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=ko.get(n);return c&&(n=c,l=B),a?t?i:r:t?_:u}function $(n,t){return function(e){var r=to.event;to.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{to.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Eo,i="click"+r,u=to.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==No&&(No=!("onselectstart"in e)&&M(e.style,"userSelect")),No){var o=n(e).style,a=o[No];o[No]="none"}return function(n){if(u.on(r,null),No&&(o[No]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(Ao<0){var u=t(n);if(u.scrollX||u.scrollY){var o=(r=to.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important"))[0][0].getScreenCTM();Ao=!(o.f||o.e),r.remove()}}return Ao?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return to.event.changedTouches[0].identifier}function K(n){return n>0?1:n<0?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:n<-1?Lo:Math.acos(n)}function tn(n){return n>1?Ro:n<-1?-Ro:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):bn(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:n<0&&(n+=360),n<60?u+(o-u)*n/60:n<180?o:n<240?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:t<0?0:t>1?1:t,e=e<0?0:e>1?1:e,o=e<=.5?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=to.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Do)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=dn(i)*Zo,r=dn(r)*Vo,u=dn(u)*Xo,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Po,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function dn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(n<=.00304?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):bn(""+n,mn,cn):new mn(n,t,e)}function xn(n){return new mn(n>>16,n>>8&255,255&n)}function Mn(n){return xn(n)+""}function _n(n){return n<16?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bn(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=Wo.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o|=o>>4,a=240&u,a|=a>>4,l=15&u,l|=l<<4):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=l<.5?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(t0&&l<1?0:r),new ln(r,i,l)}function Sn(n,t,e){var r=vn((.4124564*(n=kn(n))+.3575761*(t=kn(t))+.1804375*(e=kn(e)))/Zo),i=vn((.2126729*n+.7151522*t+.072175*e)/Vo);return hn(116*i-16,500*(r-i),200*(i-vn((.0193339*n+.119192*t+.9503041*e)/Xo)))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&t<300||304===t){try{n=e.call(u,l)}catch(n){return void o.error.call(u,n)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=to.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=to.event;to.event=n;try{o.progress.call(u,l)}finally{to.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(ro(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},to.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;r<2&&(t=0),r<3&&(e=Date.now());var i={c:n,t:e+t,n:null};return Go?Go.n=i:Jo=i,Go=i,Ko||(Qo=clearTimeout(Qo),Ko=1,na(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(Qo),Qo=setTimeout(Tn,t)),Ko=0):(Ko=1,na(Tn))}function Rn(){for(var n=Date.now(),t=Jo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=Jo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ea.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,d="",v="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,v="%",p="f";break;case"p":g=100,v="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(d="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(d=i[0],v=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=ra.get(p)||Fn;var x=c&&s;return function(n){var e=v;if(y&&n%1)return"";var i=n<0||0===n&&1/n<0?(n=-n,"-"):"-"===a?"":a;if(g<0){var l=to.formatPrefix(n,h);n=l.scale(n),e=l.symbol+v}else n*=g;var M,_,b=(n=p(n,h)).lastIndexOf(".");if(b<0){var w=m?n.lastIndexOf("e"):-1;w<0?(M=n,_=""):(M=n.substring(0,w),_=n.substring(w))}else M=n.substring(0,b),_=t+n.substring(b+1);!c&&s&&(M=u(M,1/0));var S=d.length+M.length+_.length+(x?0:i.length),k=S"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(x?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return t-e1)for(;o=c)return-1;if(37===(i=t.charCodeAt(a++))){if(o=t.charAt(a++),!(u=C[o in aa?t.charAt(a++):o])||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){M.lastIndex=0;var r=M.exec(t.slice(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=x.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,d=n.days,v=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{var t=new(ua=Hn);return t._=n,r(t)}finally{ua=Date}}var r=t(n);return e.parse=function(n){try{ua=Hn;var t=r.parse(n);return t&&t._}finally{ua=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var x=to.map(),M=Vn(d),_=Xn(d),b=Vn(v),w=Xn(v),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){x.set(n.toLowerCase(),t)});var A={a:function(n){return v[n.getDay()]},A:function(n){return d[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ia.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ia.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ia.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=n<0?"-":"",i=(r?-n:n)+"",u=i.length;return r+(u68?1900:2e3)}function nt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=so(t)/60|0,i=so(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){ca.lastIndex=0;var r=ca.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);da.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;va.point=function(o,a){va.point=n,r=(t=o)*Do,i=Math.cos(a=(e=a)*Do/2+Lo/4),u=Math.sin(a)},va.lineEnd=function(){n(t,e)}}function vt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function xt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Mt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function _t(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function bt(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return so(n[0]-t[0])=0;--a)i.point((s=f[a])[0],s[1]);else r(p.x,p.p.x,-1,i);p=p.p}f=(p=p.o).z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(_||(u.polygonStart(),_=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,d,v=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=to.merge(p);var n=Ot(y,g);p.length?(_||(u.polygonStart(),_=!0),Lt(p,jt,n,e,u)):n&&(_||(u.polygonStart(),_=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),_&&(u.polygonEnd(),_=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},x=Pt(),M=t(x),_=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:_,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ro-Co:Ro-n[1])-((t=t.x)[0]<0?t[1]-Ro-Co:Ro-t[1])}function Ut(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Lo:-Lo,l=so(u-e);so(l-Lo)0?Ro:-Ro),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Lo&&(so(e-i)Co?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Ro,r.point(-Lo,i),r.point(0,i),r.point(Lo,i),r.point(Lo,0),r.point(Lo,-i),r.point(0,-i),r.point(-Lo,-i),r.point(-Lo,0),r.point(-Lo,i);else if(so(n[0]-t[0])>Co){var u=n[0]=0?1:-1,w=b*_,S=w>Lo,k=g*x;if(da.add(Math.atan2(k*b*Math.sin(w),d*M+k*Math.cos(w))),u+=S?_+b*qo:_,S^h>=e^y>=e){var N=mt(vt(s),vt(n));_t(N);var E=mt(i,N);_t(E);var A=(S^_>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^_>=0?1:-1)}if(!v++)break;h=y,g=x,d=M,s=n}}return(u<-Co||uu}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],d=t(s,h),v=o?d?0:i(s,h):d?i(s+(s<0?Lo:-Lo),h):0;if(!e&&(c=l=d)&&n.lineStart(),d!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Co,g[1]+=Co,d=t(g[0],g[1]))),d!==l)f=0,d?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^d){var y;v&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!d||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=d,u=v},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=[1,0,0],i=mt(vt(n),vt(t)),o=yt(i,i),a=i[0],l=o-a*a;if(!l)return!e&&n;var c=u*o/l,f=-u*a/l,s=mt(r,i),h=Mt(r,c);xt(h,Mt(i,f));var p=s,g=yt(h,p),d=yt(p,p),v=g*g-d*(yt(h,h)-1);if(!(v<0)){var y=Math.sqrt(v),m=Mt(p,(-g-y)/d);if(xt(m,h),m=bt(m),!e)return m;var x,M=n[0],_=t[0],b=n[1],w=t[1];_0^m[1]<(so(m[0]-M)Lo^(M<=m[0]&&m[0]<=_)){var E=Mt(p,(-g+y)/d);return xt(E,h),[m,bt(E)]}}}function i(t,e){var r=o?n:Lo-n,i=0;return t<-r?i|=1:t>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=so(u)>Co;return Rt(t,e,de(n,6*Do),o?[0,-n]:[-Lo,n-Lo])}function It(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=0,s=1,h=a.x-l,p=a.y-c;if(u=n-l,h||!(u>0)){if(u/=h,h<0){if(u0){if(u>s)return;u>f&&(f=u)}if(u=e-l,h||!(u<0)){if(u/=h,h<0){if(u>s)return;u>f&&(f=u)}else if(h>0){if(u0)){if(u/=p,p<0){if(u0){if(u>s)return;u>f&&(f=u)}if(u=r-c,p||!(u<0)){if(u/=p,p<0){if(u>s)return;u>f&&(f=u)}else if(p>0){if(u0&&(i.a={x:l+f*h,y:c+f*p}),s<1&&(i.b={x:l+s*h,y:c+s*p}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return so(r[0]-n)0?0:3:so(r[0]-e)0?2:1:so(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=v.length,r=n[1],i=0;ir&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0)do{c.point(0===f||3===f?n:e,f>1?r:t)}while((f=(f+l+4)%4)!==s);else c.point(a[0],a[1])}function f(i,u){return n<=i&&i<=e&&t<=u&&u<=r}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,v&&v.push(y=[]),S=!0,w=!1,_=b=NaN}function p(){d&&(g(m,x),M&&w&&E.rejoin(),d.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){var e=f(n=Math.max(-za,Math.min(za,n)),t=Math.max(-za,Math.min(za,t)));if(v&&y.push([n,t]),S)m=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var d,v,y,m,x,M,_,b,w,S,k,N=a,E=Pt(),A=It(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,d=[],v=[],k=!0},polygonEnd:function(){a=N,d=to.merge(d);var t=l([n,r]),e=k&&t,i=d.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(d,u,t,c,a),a.polygonEnd()),d=v=y=null}};return C}}function Vt(n){var t=0,e=Lo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Lo/180,e=n[1]*Lo/180):[t/Lo*180,e/Lo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){qa+=i*n-r*t,r=n,i=t}var t,e,r,i;ja.point=function(u,o){ja.point=n,t=r=u,e=i=o},ja.lineEnd=function(){n(t,e)}}function Bt(n,t){nDa&&(Da=n),tPa&&(Pa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){xa+=n,Ma+=t,++_a}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);ba+=o*(t+n)/2,wa+=o*(e+r)/2,Sa+=o,Gt(t=n,e=r)}var t,e;Fa.point=function(r,i){Fa.point=n,Gt(t=r,e=i)}}function Qt(){Fa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);ba+=o*(r+n)/2,wa+=o*(i+t)/2,Sa+=o,ka+=(o=i*n-r*t)*(r+n),Na+=o*(i+t),Ea+=3*o,Gt(r=n,i=t)}var t,e,r,i;Fa.point=function(u,o){Fa.point=n,Gt(t=r=u,e=i=o)},Fa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,qo)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:_};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=NaN,S.point=u,t.lineStart()}function u(e,r){var u=vt([e,r]),o=n(e,r);i(x,M,m,_,b,w,x=o[0],M=o[1],m=e,_=u[0],b=u[1],w=u[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=x,g=M,d=_,v=b,y=w,S.point=u}function f(){i(x,M,m,_,b,w,p,g,s,d,v,y,a,t),S.lineEnd=o,o()}var s,h,p,g,d,v,y,m,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,d,v,y){var m=f-t,x=s-e,M=m*m+x*x;if(M>4*u&&v--){var _=a+p,b=l+g,w=c+d,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),N=so(so(w)-1)u||so((m*z+x*L)/M-.5)>.3||a*p+l*g+c*d0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Po,e*Po])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Do,n[1]*Do),[n[0]*h+l,c-n[1]*h]}function e(n){return(n=a.invert((n[0]-l)/h,(c-n[1])/h))&&[n[0]*Po,n[1]*Po]}function r(){a=Ct(o=se(y,x,M),u);var n=u(d,v);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,d=0,v=0,y=0,x=0,M=0,_=Ca,b=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(_(o,s(b(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(_=null==n?(w=n,Ca):Yt((w=+n)*Do),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,b=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(d=n[0]%360*Do,v=n[1]%360*Do,r()):[d*Po,v*Po]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Do,x=n[1]%360*Do,M=n.length>2?n[2]%360*Do:0,r()):[y*Po,x*Po,M*Po]},to.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Do,e*Do)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Lo?n-qo:n<-Lo?n+qo:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Lo?t-qo:t<-Lo?t+qo:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function de(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=ve(e,i),u=ve(e,u),(o>0?iu)&&(i+=o*qo)):(i=n+o*qo,u=n-.5*l);for(var c,f=i;o>0?f>u:f0?t<-Ro+Co&&(t=-Ro+Co):t>Ro-Co&&(t=Ro-Co);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Lo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Ro]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return so(i)1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=Qa.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),Ja.remove(n),Qa.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];Ue(n);for(var l=u;l.circle&&so(e-l.circle.x)Co)a=a.L;else{if(!((i=u-Ye(a,o))>Co)){r>-Co?(t=a.P,e=a):i>-Co?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=je(n);if(Ja.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),Ja.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(e){Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,d=g.x-f,v=g.y-s,y=2*(h*v-p*d),m=h*h+p*p,x=d*d+v*v,M={x:(v*m-p*x)/y+f,y:(h*x-d*m)/y+s};nr(e.edge,c,g,M),l.edge=Ke(c,n,null,M),e.edge=Ke(n,g,null,M),$e(t),$e(e)}else l.edge=Ke(t.site,l.site)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-1/0;var a=(e=o.site).x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ye(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ie(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],d=Wa,v=d.length;v--;)if((u=d[v])&&u.prepare())for(l=(a=u.edges).length,o=0;oCo||so(i-e)>Co)&&(a.splice(o,0,new tr(Qe(u.site,f,so(r-s)Co?{x:s,y:so(t-s)Co?{x:so(e-g)Co?{x:h,y:so(t-h)Co?{x:so(e-p)=-zo)){var h=l*l+c*c,p=f*f+v*v,g=(v*h-c*p)/s,d=(l*p-f*h)/s,v=d+a,y=nl.pop()||new Xe;y.arc=n,y.site=i,y.x=g+o,y.y=v+Math.sqrt(g*g+d*d),y.cy=v,n.circle=y;for(var m=null,x=Ka._;x;)if(y.y=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:v,y:l};e={x:v,y:c}}else{if(u){if(u.y1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.y=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||h=_)<<1|t>=M,w=b+4;bu&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:vr(e,r)})),u=rl.lastIndex;return u=0&&!(e=to.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;e=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function br(n){return function(t){return.5*(t<.5?n(2*t):2-n(2-2*t))}}function wr(n){return n*n}function Sr(n){return n*n*n}function kr(n){if(n<=0)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(n<.5?e:3*(n-t)+e-.75)}function Nr(n){return function(t){return Math.pow(t,n)}}function Er(n){return 1-Math.cos(n*Ro)}function Ar(n){return Math.pow(2,10*(n-1))}function Cr(n){return 1-Math.sqrt(1-n*n)}function zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/qo*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*qo/t)}}function Lr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qr(n){return n<1/2.75?7.5625*n*n:n<2/2.75?7.5625*(n-=1.5/2.75)*n+.75:n<2.5/2.75?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Tr(n,t){n=to.hcl(n),t=to.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:u<-180&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Rr(n,t){n=to.hsl(n),t=to.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:u<-180&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=to.lab(n),t=to.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Fr(t),i=Ur(t,e),u=Fr(Hr(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Or(e)+"rotate(",null,")")-2,x:vr(n,t)})):t&&e.push(Or(e)+"rotate("+t+")")}function Zr(n,t,e,r){n!==t?r.push({i:e.push(Or(e)+"skewX(",null,")")-2,x:vr(n,t)}):t&&e.push(Or(e)+"skewX("+t+")")}function Vr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Or(e)+"scale(",null,",",null,")");r.push({i:i-4,x:vr(n[0],t[0])},{i:i-2,x:vr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Or(e)+"scale("+t+")")}function Xr(n,t){var e=[],r=[];return n=to.transform(n),t=to.transform(t),Yr(n.translate,t.translate,e,r),Ir(n.rotate,t.rotate,e,r),Zr(n.skew,t.skew,e,r),Vr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function ui(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oi&&(r=e,i=t);return r}function vi(n){return n.reduce(yi,0)}function yi(n,t){return n+t[1]}function mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function Mi(n){return[to.min(n),to.max(n)]}function _i(n,t){return n.value-t.value}function bi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function wi(n,t){n._pack_next=t,t._pack_prev=n}function Si(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function ki(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-1/0,h=1/0,p=-1/0;if(e.forEach(Ni),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(Ci(r,i,u=e[2]),t(u),bi(r,u),r._pack_prev=u,bi(u,i),i=r._pack_next,o=3;o2?Yi:Fi,l=r?Br:$r;return o=i(n,t,l,e),a=i(t,n,l,mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Pr)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return $i(n,t)},u.tickFormat=function(t,e){return Bi(n,t,e)},u.nice=function(t){return Vi(n,t),i()},u.copy=function(){return Ii(n,t,e,r)},i()}function Zi(n,t){return to.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Vi(n,t){return Hi(n,Oi(Xi(n,t)[2])),Hi(n,Oi(Xi(n,t)[2])),n}function Xi(n,t){null==t&&(t=10);var e=ji(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return u<=.15?i*=10:u<=.35?i*=5:u<=.75&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function $i(n,t){return to.range.apply(to,Xi(n,t))}function Bi(n,t,e){var r=Xi(n,t);if(e){var i=ea.exec(e);if(i.shift(),"s"===i[8]){var u=to.formatPrefix(Math.max(so(r[0]),so(r[1])));return i[7]||(i[7]="."+Wi(u.scale(r[2]))),i[8]="f",e=to.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+Ji(i[8],r)),e=i.join("")}else e=",."+Wi(r[2])+"f";return to.format(e)}function Wi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Ji(n,t){var e=Wi(t[2]);return n in dl?Math.abs(e-Wi(Math.max(so(t[0]),so(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Gi(n,t,e,r){function i(n){return(e?Math.log(n<0?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Hi(r.map(i),e?Math:yl);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=ji(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;c0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return vl;arguments.length<2?e=vl:"function"!=typeof e&&(e=to.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return o*t0?a[e-1]:n[0],e0?0:1}function hu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,d=(s+p)/2,v=h-f,y=p-s,m=v*v+y*y,x=e-r,M=f*p-h*s,_=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*m-M*M)),b=(M*y-v*_)/m,w=(-M*v-y*_)/m,S=(M*y+v*_)/m,k=(-M*v+y*_)/m,N=b-g,E=w-d,A=S-g,C=k-d;return N*N+E*E>A*A+C*C&&(b=S,w=k),[[b-l,w-c],[b*e/x,w*e/x]]}function pu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function du(n){return n.join("L")+"Z"}function vu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function yu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r);for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Tu(n){return n.length<3?gu(n):n[0]+bu(n,qu(n))}function Ru(n){for(var t,e,r,i=-1,u=n.length;++i0;)p[--a].call(n,o);if(u>=1)return d.event&&d.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),d=g[r];d||(l=i.time,f=qn(u,0,l),d=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function Bu(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wu(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Ju(n){return n.toISOString()}function Gu(n,t,e){function r(t){return n(t)}function i(n,e){var r=(n[1]-n[0])/e,i=to.bisect(Yl,r);return i==Yl.length?[t.year,Xi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[r/Yl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Ku(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ku(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ji(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],Ku(+e[1]+1),t<1?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Gu(n.copy(),t,e)},Zi(r,n)}function Ku(n){return new Date(n)}function Qu(n){return JSON.parse(n.responseText)}function no(n){var t=io.createRange();return t.selectNode(io.body),t.createContextualFragment(n.responseText)}var to={version:"3.5.17"},eo=[].slice,ro=function(n){return eo.call(n)},io=this.document;if(io)try{ro(io.documentElement.childNodes)[0].nodeType}catch(n){ro=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),io)try{io.createElement("DIV").style.setProperty("opacity",0,"")}catch(n){var uo=this.Element.prototype,oo=uo.setAttribute,ao=uo.setAttributeNS,lo=this.CSSStyleDeclaration.prototype,co=lo.setProperty;uo.setAttribute=function(n,t){oo.call(this,n,t+"")},uo.setAttributeNS=function(n,t,e){ao.call(this,n,t,e+"")},lo.setProperty=function(n,t,e){co.call(this,n,t+"",e)}}to.ascending=e,to.descending=function(n,t){return tn?1:t>=n?0:NaN},to.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},to.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},to.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),i=r){e=i=r;break}for(;++ur&&(e=r),i1)return l/(f-1)},to.deviation=function(){var n=to.variance.apply(this,arguments);return n?Math.sqrt(n):n};var fo=u(e);to.bisectLeft=fo.left,to.bisect=to.bisectRight=fo.right,to.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},to.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,u<2&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},to.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},to.pairs=function(n){for(var t=0,e=n.length-1,r=n[0],i=new Array(e<0?0:e);t=0;)for(t=(r=n[i]).length;--t>=0;)e[--o]=r[t];return e};var so=Math.abs;to.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e==1/0)throw new Error("infinite range");var r,i=[],u=a(so(e)),o=-1;if(n*=u,t*=u,(e*=u)<0)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,d=u[a++],v=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(to.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},to.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;e=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},to.event=null,to.requote=function(n){return n.replace(vo,"\\$&")};var vo=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,yo={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},mo=function(n,t){return t.querySelector(n)},xo=function(n,t){return t.querySelectorAll(n)},Mo=function(n,t){var e=n.matches||n[M(n,"matchesSelector")];return(Mo=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(mo=function(n,t){return Sizzle(n,t)[0]||null},xo=Sizzle,Mo=Sizzle.matchesSelector),to.selection=function(){return to.select(io.documentElement)};var _o=to.selection.prototype=[];_o.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),wo.hasOwnProperty(e)?{space:wo[e],local:n}:n}},_o.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=to.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_o.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++i=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},_o.sort=function(n){n=Y.apply(this,arguments);for(var t=-1,e=this.length;++t0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){_&&_.domain(M.range().map(function(n){return(n-k.x)/k.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-k.y)/k.k}).map(b.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),v=null)}function s(){function n(){a=1,u(to.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=to.select(t(i)).on(q,n).on(T,r),h=e(to.mouse(i)),p=W(i);ql.call(i),l(o)}function h(){function n(){var n=to.touches(g);return p=k.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=e(n))}),n}function t(){var t=to.event.target;to.select(t).on(M,r).on(_,a),b.push(t);for(var e=to.event.changedTouches,i=0,u=e.length;i1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=to.touches(g);ql.call(g);for(var a=0,l=o.length;a=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ra=to.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=to.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ia=to.time={},ua=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){oa.setUTCDate.apply(this._,arguments)},setDay:function(){oa.setUTCDay.apply(this._,arguments)},setFullYear:function(){oa.setUTCFullYear.apply(this._,arguments)},setHours:function(){oa.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){oa.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){oa.setUTCMinutes.apply(this._,arguments)},setMonth:function(){oa.setUTCMonth.apply(this._,arguments)},setSeconds:function(){oa.setUTCSeconds.apply(this._,arguments)},setTime:function(){oa.setTime.apply(this._,arguments)}};var oa=Date.prototype;ia.year=On(function(n){return(n=ia.day(n)).setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ia.years=ia.year.range,ia.years.utc=ia.year.utc.range,ia.day=On(function(n){var t=new ua(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ia.days=ia.day.range,ia.days.utc=ia.day.utc.range,ia.dayOfYear=function(n){var t=ia.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ia[n]=On(function(n){return(n=ia.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ia.year(n).getDay();return Math.floor((ia.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ia[n+"s"]=e.range,ia[n+"s"].utc=e.utc.range,ia[n+"OfYear"]=function(n){var e=ia.year(n).getDay();return Math.floor((ia.dayOfYear(n)+(e+t)%7)/7)}}),ia.week=ia.sunday,ia.weeks=ia.sunday.range,ia.weeks.utc=ia.sunday.utc.range,ia.weekOfYear=ia.sundayOfYear;var aa={"-":"",_:" ",0:"0"},la=/^\s*\d+/,ca=/^%/;to.locale=function(n){return{numberFormat:Un(n),timeFormat:In(n)}};var fa=to.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});to.format=fa.numberFormat,to.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,sa),st(sa.s,this.s,this),this.s?this.t+=sa.t:this.s=sa.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var sa=new ft;to.geo.stream=function(n,t){n&&ha.hasOwnProperty(n.type)?ha[n.type](n,t):ht(n,t)};var ha={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rp&&(p=t)}function t(t,e){var r=vt([t*Do,e*Do]);if(y){var i=mt(y,r),u=mt([i[1],-i[0],0],i);_t(u),u=bt(u);var o=t-g,l=o>0?1:-1,c=u[0]*Po*l,d=so(o)>180;if(d^(l*gp&&(p=v);else if(c=(c+360)%360-180,d^(l*gp&&(p=e);d?ta(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(th&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){_.point=t}function r(){M[0]=f,M[1]=h,_.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=so(r)>180?r+(r>0?360:-360):r}else d=n,v=e;va.point(n,e),t(n,e)}function u(){va.lineStart()}function o(){i(d,v),va.lineEnd(),so(m)>Co&&(f=-(h=180)),M[0]=f,M[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nCo?p=90:m<-Co&&(s=-90),M[0]=f,M[1]=h}};return function(n){p=h=-(f=s=1/0),x=[],to.geo.stream(n,_);var t=x.length;if(t){x.sort(l);for(var e=1,r=[g=x[0]];ea(g[0],g[1])&&(g[1]=u[1]),a(u[0],g[1])>a(g[0],g[1])&&(g[0]=u[0])):r.push(g=u);for(var i,u,o=-1/0,e=0,g=r[t=r.length-1];e<=t;g=u,++e)u=r[e],(i=a(g[1],u[0]))>o&&(o=i,f=u[0],h=g[1])}return x=M=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),to.geo.centroid=function(n){ya=ma=xa=Ma=_a=ba=wa=Sa=ka=Na=Ea=0,to.geo.stream(n,Aa);var t=ka,e=Na,r=Ea,i=t*t+e*e+r*r;return i=.12&&i<.234&&r>=-.425&&r<-.214?o:i>=.166&&i<.234&&r>=-.214&&r<-.115?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Co,s+.12*c+Co],[f-.214*c-Co,s+.234*c-Co]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Co,s+.166*c+Co],[f-.115*c-Co,s+.234*c-Co]]).stream(l).point,n},n.scale(1070)};var La,qa,Ta,Ra,Da,Pa,ja={point:_,lineStart:_,lineEnd:_,polygonStart:function(){qa=0,ja.lineStart=$t},polygonEnd:function(){ja.lineStart=ja.lineEnd=ja.point=_,La+=so(qa/2)}},Ua={point:Bt,lineStart:_,lineEnd:_,polygonStart:_,polygonEnd:_},Fa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Fa.lineStart=ne},polygonEnd:function(){Fa.point=Gt,Fa.lineStart=Kt,Fa.lineEnd=Qt}};to.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),to.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return La=0,to.geo.stream(n,i(ja)),La},n.centroid=function(n){return xa=Ma=_a=ba=wa=Sa=ka=Na=Ea=0,to.geo.stream(n,i(Fa)),Ea?[ka/Ea,Na/Ea]:Sa?[ba/Sa,wa/Sa]:_a?[xa/_a,Ma/_a]:[NaN,NaN]},n.bounds=function(n){return Da=Pa=-(Ta=Ra=1/0),to.geo.stream(n,i(Ua)),[[Ta,Ra],[Da,Pa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(to.geo.albersUsa()).context(null)},to.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},to.geo.projection=oe,to.geo.projectionMutator=ae,(to.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,to.geo.rotation=function(n){function t(t){return t=n(t[0]*Do,t[1]*Do),t[0]*=Po,t[1]*=Po,t}return n=se(n[0]%360*Do,n[1]*Do,n.length>2?n[2]*Do:0),t.invert=function(t){return t=n.invert(t[0]*Do,t[1]*Do),t[0]*=Po,t[1]*=Po,t},t},fe.invert=ce,to.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Do,-n[1]*Do,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Po,n[1]*=Po}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=de((t=+r)*Do,i*Do),n):t},n.precision=function(r){return arguments.length?(e=de(t*Do,(i=+r)*Do),n):i},n.angle(90)},to.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Do,i=n[1]*Do,u=t[1]*Do,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},to.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return to.range(Math.ceil(u/v)*v,i,v).map(h).concat(to.range(Math.ceil(c/y)*y,l,y).map(p)).concat(to.range(Math.ceil(r/g)*g,e,g).filter(function(n){return so(n%v)>Co}).map(f)).concat(to.range(Math.ceil(a/d)*d,o,d).filter(function(n){return so(n%y)>Co}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,d=g,v=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(v=+t[0],y=+t[1],n):[v,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],d=+t[1],n):[g,d]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Co],[180,90-Co]]).minorExtent([[-180,-80-Co],[180,80+Co]])},to.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=xe,i=Me;return n.distance=function(){return to.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},to.geo.interpolate=function(n,t){return _e(n[0]*Do,n[1]*Do,t[0]*Do,t[1]*Do)},to.geo.length=function(n){return Ha=0,to.geo.stream(n,Oa),Ha};var Ha,Oa={sphere:_,point:_,lineStart:be,lineEnd:_,polygonStart:_,polygonEnd:_},Ya=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(to.geo.azimuthalEqualArea=function(){return oe(Ya)}).raw=Ya;var Ia=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(to.geo.azimuthalEquidistant=function(){return oe(Ia)}).raw=Ia,(to.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(to.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Za=we(function(n){return 1/n},Math.atan);(to.geo.gnomonic=function(){return oe(Za)}).raw=Za,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ro]},(to.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var Va=we(function(){return 1},Math.asin);(to.geo.orthographic=function(){return oe(Va)}).raw=Va;var Xa=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(to.geo.stereographic=function(){return oe(Xa)}).raw=Xa,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ro]},(to.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,to.geom={},to.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;t=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[]).point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Co)*Co,y:Math.round(o(n,t)/Co)*Co,i:t}})}var r=Ce,i=ze,u=r,o=i,a=tl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u=e.site,o=e.edges.sort(Ve),a=-1,l=o.length,c=o[l-1].edge,f=c.l===u?c.r:c.l;++a=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]={leaf:!0,nodes:[],point:null,x:null,y:null}),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,d,v,y,m,x=En(a),M=En(l);if(null!=t)d=t,v=e,y=r,m=i;else if(y=m=-(d=v=1/0),s=[],h=[],g=n.length,o)for(p=0;py&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;py&&(y=_),b>m&&(m=b),s.push(_),h.push(b)}var w=y-d,S=m-v;w>S?m=v+w:y=d+S;var k={leaf:!0,nodes:[],point:null,x:null,y:null};if(k.add=function(n){u(k,n,+x(n,++p),+M(n,p),d,v,y,m)},k.visit=function(n){hr(n,k,d,v,y,m)},k.find=function(n){return pr(k,n[0],n[1],d,v,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=ul.get(e)||il,r=ol.get(r)||m,Mr(r(e.apply(null,eo.call(arguments,1))))},to.interpolateHcl=Tr,to.interpolateHsl=Rr,to.interpolateLab=Dr,to.interpolateRound=Pr,to.transform=function(n){var t=io.createElementNS(to.ns.prefix.svg,"g");return(to.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:al)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var al={a:1,b:0,c:0,d:1,e:0,f:0};to.interpolateTransform=Xr,to.layout={},to.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;l=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return ui(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=li,e=oi,r=ai;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ii(t,function(n){n.children&&(n.value=0)}),ui(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},to.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++ca&&(a=r),o.push(r)}for(e=0;e0)for(u=-1;++u=f[0]&&a<=f[1]&&((o=l[to.bisect(s,a,1,p)-1]).y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=Mi,i=mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},to.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,ui(a,function(n){n.r=+f(n.value)}),ui(a,ki),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;ui(a,function(n){n.r+=s}),ui(a,ki),ui(a,function(n){n.r-=s})}return Ai(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=to.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ri(n,e)},to.layout.tree=function(){function n(n,r){var u=M.call(this,n,r),o=t(u[0]);return N=o,e(o,0),i(o),g(o,0),m(o),u}function t(n){var e={t:n,prelim:0,mod:0,shift:0,change:0,msel:0,mser:0};if(n.x=0,n.y=0,w)e.x_size=1,e.y_size=1;else if("object"==typeof S)e.x_size=S[0],e.y_size=S[1];else{var r=S(n);e.x_size=r[0],e.y_size=r[1]}k&&(n.x_size=e.x_size,n.y_size=e.y_size);for(var i=[],u=n.children?n.children.length:0,o=0;oe.lowY&&(e=e.nxt);var p=i+r.prelim-(o+u.prelim);null!=_?p+=_(r.t,u.t)*N.x_size:null!=b&&(p+=r.x_size/2+u.x_size/2+b(r.t,u.t)),p>0?(o+=p,a(n,t,e.index,p)):1===t&&0===o&&0===r.num_children&&u.num_children>1&&p<0&&(o+=p,a(n,t,e.index,p));var g=f(r),d=f(u);g<=d&&null!=(r=c(r))&&(i+=r.mod),g>=d&&null!=(u=l(u))&&(o+=u.mod)}null==r&&null!=u?s(n,t,u,o):null!=r&&null==u&&h(n,t,r,i)}function a(n,t,e,r){n.children[t].mod+=r,n.children[t].msel+=r,n.children[t].mser+=r,d(n,t,e,r)}function l(n){return 0==n.num_children?n.tl:n.children[0]}function c(n){return 0==n.num_children?n.tr:n.children[n.num_children-1]}function f(n){return n.t.y+n.y_size}function s(n,t,e,r){var i=n.children[0].el;i.tl=e;var u=r-e.mod-n.children[0].msel;i.mod+=u,i.prelim-=u,n.children[0].el=n.children[t].el,n.children[0].msel=n.children[t].msel}function h(n,t,e,r){var i=n.children[t].er;i.tr=e;var u=r-e.mod-n.children[t].mser;i.mod+=u,i.prelim-=u,n.children[t].er=n.children[t-1].er,n.children[t].mser=n.children[t-1].mser}function p(n){n.prelim=(n.children[0].prelim+n.children[0].mod-n.children[0].x_size/2+n.children[n.num_children-1].mod+n.children[n.num_children-1].prelim+n.children[n.num_children-1].x_size/2)/2}function g(n,t){t+=n.mod,n.t.x=n.prelim+t,v(n);for(var e=0;e=e.lowY;)e=e.nxt;return{lowY:n,index:t,nxt:e}}function m(n){if(null!=w){for(var t,e=n,r=n,i=n,u=[n];t=u.pop();)(f=t.t).xr.t.x&&(r=t),f.depth>i.t.depth&&(i=t),t.children&&(u=u.concat(t.children));var o=null==_?.5:_(e.t,r.t)/2,a=o-e.t.x,l=w[0]/(r.t.x+o+a),c=w[1]/(i.t.depth>0?i.t.depth:1);for(u=[n];t=u.pop();){var f=t.t;f.x=(f.x+a)*l,f.y=f.depth*c,k&&(f.x_size*=l,f.y_size*=c),t.children&&(u=u.concat(t.children))}}else x(n,-n.t.x)}function x(n,t){n.t.x+=t;for(var e=0;e0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,d))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,d,c,!1),d=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,d,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oi&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0;if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++u1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=to.random.normal.apply(to,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=to.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;es?0:1;if(c=To)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,d,v,y,m,x,M,_,b,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(v=u===bl?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(v/c*Math.sin(y))),n&&(N=tn(v/n*Math.sin(y)))),c){m=c*Math.cos(f+E),x=c*Math.sin(f+E),M=c*Math.cos(s-E),_=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Lo?0:1;if(E&&su(m,x,M,_)===p^C){var z=(f+s)/2;m=c*Math.cos(z),x=c*Math.sin(z),M=_=null}}else m=x=0;if(n){b=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Lo?0:1;if(N&&su(b,w,S,k)===1-p^L){var q=(f+s)/2;b=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else b=w=0;if(h>Co&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){d=nLo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=xe,o=Me,a=Pu,l=lu,c=cu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},to.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return"M"+(l=l.map(r))[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=xe,e=Me,r=ju;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},to.svg.diagonal.radial=function(){var n=to.svg.diagonal(),t=ju,e=n.projection;return n.projection=function(n){return arguments.length?e(Uu(t=n)):t},n},to.svg.symbol=function(){function n(n,r){return(El.get(t.call(this,n,r))||Ou)(e.call(this,n,r))}var t=Hu,e=Fu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var El=to.map({circle:Ou,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cl)),e=t*Cl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});to.svg.symbolTypes=El.keys();var Al=Math.sqrt(3),Cl=Math.tan(30*Do);_o.transition=function(n){for(var t,e,r=zl||++Rl,i=Xu(n),u=[],o=Ll||{time:Date.now(),ease:kr,delay:0,duration:250},a=-1,l=this.length;++arect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==to.event.keyCode&&(C||(x=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function d(){32==to.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function v(){var n=to.mouse(_),t=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(to.event.altKey?(x||(x=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]1)for(var r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return u.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:if(t={onlyLeaves:!1,circularReference:"leaf",search:"dfsPreOrder",iterateOverObject:!0,skipIteration:function(){return!1}},void 0!==o.onlyLeaves&&(t.onlyLeaves=o.onlyLeaves),void 0!==o.circularReference&&(t.circularReference=o.circularReference),void 0!==o.iterateOverObject&&(t.iterateOverObject=o.iterateOverObject),void 0!==o.skipIteration&&(t.skipIteration=o.skipIteration),void 0===o.search){i.next=9;break}if(o.search in s){i.next=8;break}throw new Error("The search algorithm "+o.search+" is incorrect.");case 8:t.search=o.search;case 9:return r=new l.default(e,t),n=(0,d.default)(t.circularReference),i.delegateYield(s[t.search](r,t.onlyLeaves,n),"t0",12);case 12:case"end":return i.stop()}},_[0],this)}Object.defineProperty(r,"__esModule",{value:!0});var a=e("babel-runtime/regenerator"),u=o(a);r.default=i;var c=e("./search"),s=n(c),f=e("./root-node"),l=o(f),p=e("./seen"),d=o(p),_=[i].map(u.default.mark)},{"./root-node":5,"./search":6,"./seen":7,"babel-runtime/regenerator":115}],3:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t;return l.default.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:r.t0=l.default.keys(e);case 1:if((r.t1=r.t0()).done){r.next=7;break}return t=r.t1.value,r.next=5,[t,e[t]];case 5:r.next=1;break;case 7:case"end":return r.stop()}},p[0],this)}function i(e){var t;return l.default.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:t=0;case 1:if(!(tf;)if(u=c[f++],u!=u)return!0}else for(;s>f;f++)if((e||f in c)&&c[f]===r)return e||f||0;return!e&&-1}}},{"./_to-index":88,"./_to-iobject":90,"./_to-length":91}],39:[function(e,t,r){var n=e("./_cof"),o=e("./_wks")("toStringTag"),i="Arguments"==n(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};t.exports=function(e){var t,r,u;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=a(t=Object(e),o))?r:i?n(t):"Object"==(u=n(t))&&"function"==typeof t.callee?"Arguments":u}},{"./_cof":40,"./_wks":97}],40:[function(e,t,r){var n={}.toString;t.exports=function(e){return n.call(e).slice(8,-1)}},{}],41:[function(e,t,r){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},{}],42:[function(e,t,r){"use strict";var n=e("./_object-dp"),o=e("./_property-desc");t.exports=function(e,t,r){t in e?n.f(e,t,o(0,r)):e[t]=r}},{"./_object-dp":70,"./_property-desc":81}],43:[function(e,t,r){var n=e("./_a-function");t.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":35}],44:[function(e,t,r){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],45:[function(e,t,r){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":50}],46:[function(e,t,r){var n=e("./_is-object"),o=e("./_global").document,i=n(o)&&n(o.createElement);t.exports=function(e){return i?o.createElement(e):{}}},{"./_global":51,"./_is-object":59}],47:[function(e,t,r){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],48:[function(e,t,r){var n=e("./_object-keys"),o=e("./_object-gops"),i=e("./_object-pie");t.exports=function(e){var t=n(e),r=o.f;if(r)for(var a,u=r(e),c=i.f,s=0;u.length>s;)c.call(e,a=u[s++])&&t.push(a);return t}},{"./_object-gops":75,"./_object-keys":78,"./_object-pie":79}],49:[function(e,t,r){var n=e("./_global"),o=e("./_core"),i=e("./_ctx"),a=e("./_hide"),u="prototype",c=function(e,t,r){var s,f,l,p=e&c.F,d=e&c.G,_=e&c.S,b=e&c.P,h=e&c.B,y=e&c.W,v=d?o:o[t]||(o[t]={}),m=v[u],g=d?n:_?n[t]:(n[t]||{})[u];d&&(r=t);for(s in r)f=!p&&g&&void 0!==g[s],f&&s in v||(l=f?g[s]:r[s],v[s]=d&&"function"!=typeof g[s]?r[s]:h&&f?i(l,n):y&&g[s]==l?function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t[u]=e[u],t}(l):b&&"function"==typeof l?i(Function.call,l):l,b&&((v.virtual||(v.virtual={}))[s]=l,e&c.R&&m&&!m[s]&&a(m,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},{"./_core":41,"./_ctx":43,"./_global":51,"./_hide":53}],50:[function(e,t,r){t.exports=function(e){try{return!!e()}catch(e){return!0}}},{}],51:[function(e,t,r){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},{}],52:[function(e,t,r){var n={}.hasOwnProperty;t.exports=function(e,t){return n.call(e,t)}},{}],53:[function(e,t,r){var n=e("./_object-dp"),o=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":45,"./_object-dp":70,"./_property-desc":81}],54:[function(e,t,r){t.exports=e("./_global").document&&document.documentElement},{"./_global":51}],55:[function(e,t,r){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":45,"./_dom-create":46,"./_fails":50}],56:[function(e,t,r){var n=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},{"./_cof":40}],57:[function(e,t,r){var n=e("./_iterators"),o=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(n.Array===e||i[o]===e)}},{"./_iterators":65,"./_wks":97}],58:[function(e,t,r){var n=e("./_cof");t.exports=Array.isArray||function(e){return"Array"==n(e)}},{"./_cof":40}],59:[function(e,t,r){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],60:[function(e,t,r){var n=e("./_an-object");t.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var i=e.return;throw void 0!==i&&n(i.call(e)),t}}},{"./_an-object":37}],61:[function(e,t,r){"use strict";var n=e("./_object-create"),o=e("./_property-desc"),i=e("./_set-to-string-tag"),a={};e("./_hide")(a,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,r){e.prototype=n(a,{next:o(1,r)}),i(e,t+" Iterator")}},{"./_hide":53,"./_object-create":69,"./_property-desc":81,"./_set-to-string-tag":84,"./_wks":97}],62:[function(e,t,r){"use strict";var n=e("./_library"),o=e("./_export"),i=e("./_redefine"),a=e("./_hide"),u=e("./_has"),c=e("./_iterators"),s=e("./_iter-create"),f=e("./_set-to-string-tag"),l=e("./_object-gpo"),p=e("./_wks")("iterator"),d=!([].keys&&"next"in[].keys()),_="@@iterator",b="keys",h="values",y=function(){return this};t.exports=function(e,t,r,v,m,g,j){s(r,t,v);var w,x,k,O=function(e){if(!d&&e in M)return M[e];switch(e){case b:return function(){return new r(this,e)};case h:return function(){return new r(this,e)}}return function(){return new r(this,e)}},E=t+" Iterator",S=m==h,L=!1,M=e.prototype,A=M[p]||M[_]||m&&M[m],P=A||O(m),T=m?S?O("entries"):P:void 0,F="Array"==t?M.entries||A:A;if(F&&(k=l(F.call(new e)),k!==Object.prototype&&(f(k,E,!0),n||u(k,p)||a(k,p,y))),S&&A&&A.name!==h&&(L=!0,P=function(){return A.call(this)}),n&&!j||!d&&!L&&M[p]||a(M,p,P),c[t]=P,c[E]=y,m)if(w={values:S?P:O(h),keys:g?P:O(b),entries:T},j)for(x in w)x in M||i(M,x,w[x]);else o(o.P+o.F*(d||L),t,w);return w}},{"./_export":49,"./_has":52,"./_hide":53,"./_iter-create":61,"./_iterators":65,"./_library":67,"./_object-gpo":76,"./_redefine":82,"./_set-to-string-tag":84,"./_wks":97}],63:[function(e,t,r){var n=e("./_wks")("iterator"),o=!1;try{var i=[7][n]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}t.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var i=[7],a=i[n]();a.next=function(){return{done:r=!0}},i[n]=function(){return a},e(i)}catch(e){}return r}},{"./_wks":97}],64:[function(e,t,r){t.exports=function(e,t){return{value:t,done:!!e}}},{}],65:[function(e,t,r){t.exports={}},{}],66:[function(e,t,r){var n=e("./_object-keys"),o=e("./_to-iobject");t.exports=function(e,t){for(var r,i=o(e),a=n(i),u=a.length,c=0;u>c;)if(i[r=a[c++]]===t)return r}},{"./_object-keys":78,"./_to-iobject":90}],67:[function(e,t,r){t.exports=!0},{}],68:[function(e,t,r){var n=e("./_uid")("meta"),o=e("./_is-object"),i=e("./_has"),a=e("./_object-dp").f,u=0,c=Object.isExtensible||function(){return!0},s=!e("./_fails")(function(){return c(Object.preventExtensions({}))}),f=function(e){a(e,n,{value:{i:"O"+ ++u,w:{}}})},l=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,n)){if(!c(e))return"F";if(!t)return"E";f(e)}return e[n].i},p=function(e,t){if(!i(e,n)){if(!c(e))return!0;if(!t)return!1;f(e)}return e[n].w},d=function(e){return s&&_.NEED&&c(e)&&!i(e,n)&&f(e),e},_=t.exports={KEY:n,NEED:!1,fastKey:l,getWeak:p,onFreeze:d}},{"./_fails":50,"./_has":52,"./_is-object":59,"./_object-dp":70,"./_uid":94}],69:[function(e,t,r){var n=e("./_an-object"),o=e("./_object-dps"),i=e("./_enum-bug-keys"),a=e("./_shared-key")("IE_PROTO"),u=function(){},c="prototype",s=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",a=">";for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+a+"document.F=Object"+o+"/script"+a),t.close(),s=t.F;n--;)delete s[c][i[n]];return s()};t.exports=Object.create||function(e,t){var r;return null!==e?(u[c]=n(e),r=new u,u[c]=null,r[a]=e):r=s(),void 0===t?r:o(r,t)}},{"./_an-object":37,"./_dom-create":46,"./_enum-bug-keys":47,"./_html":54,"./_object-dps":71,"./_shared-key":85}],70:[function(e,t,r){var n=e("./_an-object"),o=e("./_ie8-dom-define"),i=e("./_to-primitive"),a=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),o)try{return a(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":37,"./_descriptors":45,"./_ie8-dom-define":55,"./_to-primitive":93}],71:[function(e,t,r){var n=e("./_object-dp"),o=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){o(e);for(var r,a=i(t),u=a.length,c=0;u>c;)n.f(e,r=a[c++],t[r]);return e}},{"./_an-object":37,"./_descriptors":45,"./_object-dp":70,"./_object-keys":78}],72:[function(e,t,r){ -var n=e("./_object-pie"),o=e("./_property-desc"),i=e("./_to-iobject"),a=e("./_to-primitive"),u=e("./_has"),c=e("./_ie8-dom-define"),s=Object.getOwnPropertyDescriptor;r.f=e("./_descriptors")?s:function(e,t){if(e=i(e),t=a(t,!0),c)try{return s(e,t)}catch(e){}if(u(e,t))return o(!n.f.call(e,t),e[t])}},{"./_descriptors":45,"./_has":52,"./_ie8-dom-define":55,"./_object-pie":79,"./_property-desc":81,"./_to-iobject":90,"./_to-primitive":93}],73:[function(e,t,r){var n=e("./_to-iobject"),o=e("./_object-gopn").f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],u=function(e){try{return o(e)}catch(e){return a.slice()}};t.exports.f=function(e){return a&&"[object Window]"==i.call(e)?u(e):o(n(e))}},{"./_object-gopn":74,"./_to-iobject":90}],74:[function(e,t,r){var n=e("./_object-keys-internal"),o=e("./_enum-bug-keys").concat("length","prototype");r.f=Object.getOwnPropertyNames||function(e){return n(e,o)}},{"./_enum-bug-keys":47,"./_object-keys-internal":77}],75:[function(e,t,r){r.f=Object.getOwnPropertySymbols},{}],76:[function(e,t,r){var n=e("./_has"),o=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},{"./_has":52,"./_shared-key":85,"./_to-object":92}],77:[function(e,t,r){var n=e("./_has"),o=e("./_to-iobject"),i=e("./_array-includes")(!1),a=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var r,u=o(e),c=0,s=[];for(r in u)r!=a&&n(u,r)&&s.push(r);for(;t.length>c;)n(u,r=t[c++])&&(~i(s,r)||s.push(r));return s}},{"./_array-includes":38,"./_has":52,"./_shared-key":85,"./_to-iobject":90}],78:[function(e,t,r){var n=e("./_object-keys-internal"),o=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return n(e,o)}},{"./_enum-bug-keys":47,"./_object-keys-internal":77}],79:[function(e,t,r){r.f={}.propertyIsEnumerable},{}],80:[function(e,t,r){var n=e("./_export"),o=e("./_core"),i=e("./_fails");t.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],a={};a[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",a)}},{"./_core":41,"./_export":49,"./_fails":50}],81:[function(e,t,r){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],82:[function(e,t,r){t.exports=e("./_hide")},{"./_hide":53}],83:[function(e,t,r){var n=e("./_is-object"),o=e("./_an-object"),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,r,n){try{n=e("./_ctx")(Function.call,e("./_object-gopd").f(Object.prototype,"__proto__").set,2),n(t,[]),r=!(t instanceof Array)}catch(e){r=!0}return function(e,t){return i(e,t),r?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:i}},{"./_an-object":37,"./_ctx":43,"./_is-object":59,"./_object-gopd":72}],84:[function(e,t,r){var n=e("./_object-dp").f,o=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,i)&&n(e,i,{configurable:!0,value:t})}},{"./_has":52,"./_object-dp":70,"./_wks":97}],85:[function(e,t,r){var n=e("./_shared")("keys"),o=e("./_uid");t.exports=function(e){return n[e]||(n[e]=o(e))}},{"./_shared":86,"./_uid":94}],86:[function(e,t,r){var n=e("./_global"),o="__core-js_shared__",i=n[o]||(n[o]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":51}],87:[function(e,t,r){var n=e("./_to-integer"),o=e("./_defined");t.exports=function(e){return function(t,r){var i,a,u=String(o(t)),c=n(r),s=u.length;return c<0||c>=s?e?"":void 0:(i=u.charCodeAt(c),i<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?e?u.charAt(c):i:e?u.slice(c,c+2):(i-55296<<10)+(a-56320)+65536)}}},{"./_defined":44,"./_to-integer":89}],88:[function(e,t,r){var n=e("./_to-integer"),o=Math.max,i=Math.min;t.exports=function(e,t){return e=n(e),e<0?o(e+t,0):i(e,t)}},{"./_to-integer":89}],89:[function(e,t,r){var n=Math.ceil,o=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?o:n)(e)}},{}],90:[function(e,t,r){var n=e("./_iobject"),o=e("./_defined");t.exports=function(e){return n(o(e))}},{"./_defined":44,"./_iobject":56}],91:[function(e,t,r){var n=e("./_to-integer"),o=Math.min;t.exports=function(e){return e>0?o(n(e),9007199254740991):0}},{"./_to-integer":89}],92:[function(e,t,r){var n=e("./_defined");t.exports=function(e){return Object(n(e))}},{"./_defined":44}],93:[function(e,t,r){var n=e("./_is-object");t.exports=function(e,t){if(!n(e))return e;var r,o;if(t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;if("function"==typeof(r=e.valueOf)&&!n(o=r.call(e)))return o;if(!t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":59}],94:[function(e,t,r){var n=0,o=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+o).toString(36))}},{}],95:[function(e,t,r){var n=e("./_global"),o=e("./_core"),i=e("./_library"),a=e("./_wks-ext"),u=e("./_object-dp").f;t.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||u(t,e,{value:a.f(e)})}},{"./_core":41,"./_global":51,"./_library":67,"./_object-dp":70,"./_wks-ext":96}],96:[function(e,t,r){r.f=e("./_wks")},{"./_wks":97}],97:[function(e,t,r){var n=e("./_shared")("wks"),o=e("./_uid"),i=e("./_global").Symbol,a="function"==typeof i,u=t.exports=function(e){return n[e]||(n[e]=a&&i[e]||(a?i:o)("Symbol."+e))};u.store=n},{"./_global":51,"./_shared":86,"./_uid":94}],98:[function(e,t,r){var n=e("./_classof"),o=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[n(e)]}},{"./_classof":39,"./_core":41,"./_iterators":65,"./_wks":97}],99:[function(e,t,r){var n=e("./_an-object"),o=e("./core.get-iterator-method");t.exports=e("./_core").getIterator=function(e){var t=o(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return n(t.call(e))}},{"./_an-object":37,"./_core":41,"./core.get-iterator-method":98}],100:[function(e,t,r){var n=e("./_classof"),o=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").isIterable=function(e){var t=Object(e);return void 0!==t[o]||"@@iterator"in t||i.hasOwnProperty(n(t))}},{"./_classof":39,"./_core":41,"./_iterators":65,"./_wks":97}],101:[function(e,t,r){"use strict";var n=e("./_ctx"),o=e("./_export"),i=e("./_to-object"),a=e("./_iter-call"),u=e("./_is-array-iter"),c=e("./_to-length"),s=e("./_create-property"),f=e("./core.get-iterator-method");o(o.S+o.F*!e("./_iter-detect")(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,o,l,p=i(e),d="function"==typeof this?this:Array,_=arguments.length,b=_>1?arguments[1]:void 0,h=void 0!==b,y=0,v=f(p);if(h&&(b=n(b,_>2?arguments[2]:void 0,2)),void 0==v||d==Array&&u(v))for(t=c(p.length),r=new d(t);t>y;y++)s(r,y,h?b(p[y],y):p[y]);else for(l=v.call(p),r=new d;!(o=l.next()).done;y++)s(r,y,h?a(l,b,[o.value,y],!0):o.value);return r.length=y,r}})},{"./_create-property":42,"./_ctx":43,"./_export":49,"./_is-array-iter":57,"./_iter-call":60,"./_iter-detect":63,"./_to-length":91,"./_to-object":92,"./core.get-iterator-method":98}],102:[function(e,t,r){"use strict";var n=e("./_add-to-unscopables"),o=e("./_iter-step"),i=e("./_iterators"),a=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):"keys"==t?o(0,r):"values"==t?o(0,e[r]):o(0,[r,e[r]])},"values"),i.Arguments=i.Array,n("keys"),n("values"),n("entries")},{"./_add-to-unscopables":36,"./_iter-define":62,"./_iter-step":64,"./_iterators":65,"./_to-iobject":90}],103:[function(e,t,r){var n=e("./_export");n(n.S,"Object",{create:e("./_object-create")})},{"./_export":49,"./_object-create":69}],104:[function(e,t,r){var n=e("./_export");n(n.S+n.F*!e("./_descriptors"),"Object",{defineProperty:e("./_object-dp").f})},{"./_descriptors":45,"./_export":49,"./_object-dp":70}],105:[function(e,t,r){var n=e("./_to-object"),o=e("./_object-gpo");e("./_object-sap")("getPrototypeOf",function(){return function(e){return o(n(e))}})},{"./_object-gpo":76,"./_object-sap":80,"./_to-object":92}],106:[function(e,t,r){var n=e("./_export");n(n.S,"Object",{setPrototypeOf:e("./_set-proto").set})},{"./_export":49,"./_set-proto":83}],107:[function(e,t,r){},{}],108:[function(e,t,r){"use strict";var n=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":62,"./_string-at":87}],109:[function(e,t,r){"use strict";var n=e("./_global"),o=e("./_has"),i=e("./_descriptors"),a=e("./_export"),u=e("./_redefine"),c=e("./_meta").KEY,s=e("./_fails"),f=e("./_shared"),l=e("./_set-to-string-tag"),p=e("./_uid"),d=e("./_wks"),_=e("./_wks-ext"),b=e("./_wks-define"),h=e("./_keyof"),y=e("./_enum-keys"),v=e("./_is-array"),m=e("./_an-object"),g=e("./_to-iobject"),j=e("./_to-primitive"),w=e("./_property-desc"),x=e("./_object-create"),k=e("./_object-gopn-ext"),O=e("./_object-gopd"),E=e("./_object-dp"),S=e("./_object-keys"),L=O.f,M=E.f,A=k.f,P=n.Symbol,T=n.JSON,F=T&&T.stringify,I="prototype",C=d("_hidden"),N=d("toPrimitive"),R={}.propertyIsEnumerable,G=f("symbol-registry"),D=f("symbols"),U=f("op-symbols"),Y=Object[I],W="function"==typeof P,B=n.QObject,q=!B||!B[I]||!B[I].findChild,J=i&&s(function(){return 7!=x(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=L(Y,t);n&&delete Y[t],M(e,t,r),n&&e!==Y&&M(Y,t,n)}:M,K=function(e){var t=D[e]=x(P[I]);return t._k=e,t},z=W&&"symbol"==typeof P.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof P},Q=function(e,t,r){return e===Y&&Q(U,t,r),m(e),t=j(t,!0),m(r),o(D,t)?(r.enumerable?(o(e,C)&&e[C][t]&&(e[C][t]=!1),r=x(r,{enumerable:w(0,!1)})):(o(e,C)||M(e,C,w(1,{})),e[C][t]=!0),J(e,t,r)):M(e,t,r)},H=function(e,t){m(e);for(var r,n=y(t=g(t)),o=0,i=n.length;i>o;)Q(e,r=n[o++],t[r]);return e},V=function(e,t){return void 0===t?x(e):H(x(e),t)},X=function(e){var t=R.call(this,e=j(e,!0));return!(this===Y&&o(D,e)&&!o(U,e))&&(!(t||!o(this,e)||!o(D,e)||o(this,C)&&this[C][e])||t)},Z=function(e,t){if(e=g(e),t=j(t,!0),e!==Y||!o(D,t)||o(U,t)){var r=L(e,t);return!r||!o(D,t)||o(e,C)&&e[C][t]||(r.enumerable=!0),r}},$=function(e){for(var t,r=A(g(e)),n=[],i=0;r.length>i;)o(D,t=r[i++])||t==C||t==c||n.push(t);return n},ee=function(e){for(var t,r=e===Y,n=A(r?U:g(e)),i=[],a=0;n.length>a;)!o(D,t=n[a++])||r&&!o(Y,t)||i.push(D[t]);return i};W||(P=function(){if(this instanceof P)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(r){this===Y&&t.call(U,r),o(this,C)&&o(this[C],e)&&(this[C][e]=!1),J(this,e,w(1,r))};return i&&q&&J(Y,e,{configurable:!0,set:t}),K(e)},u(P[I],"toString",function(){return this._k}),O.f=Z,E.f=Q,e("./_object-gopn").f=k.f=$,e("./_object-pie").f=X,e("./_object-gops").f=ee,i&&!e("./_library")&&u(Y,"propertyIsEnumerable",X,!0),_.f=function(e){return K(d(e))}),a(a.G+a.W+a.F*!W,{Symbol:P});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),re=0;te.length>re;)d(te[re++]);for(var te=S(d.store),re=0;te.length>re;)b(te[re++]);a(a.S+a.F*!W,"Symbol",{for:function(e){return o(G,e+="")?G[e]:G[e]=P(e)},keyFor:function(e){if(z(e))return h(G,e);throw TypeError(e+" is not a symbol!")},useSetter:function(){q=!0},useSimple:function(){q=!1}}),a(a.S+a.F*!W,"Object",{create:V,defineProperty:Q,defineProperties:H,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:ee}),T&&a(a.S+a.F*(!W||s(function(){var e=P();return"[null]"!=F([e])||"{}"!=F({a:e})||"{}"!=F(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!z(e)){for(var t,r,n=[e],o=1;arguments.length>o;)n.push(arguments[o++]);return t=n[1],"function"==typeof t&&(r=t),!r&&v(t)||(t=function(e,t){if(r&&(t=r.call(this,e,t)),!z(t))return t}),n[1]=t,F.apply(T,n)}}}),P[I][N]||e("./_hide")(P[I],N,P[I].valueOf),l(P,"Symbol"),l(Math,"Math",!0),l(n.JSON,"JSON",!0)},{"./_an-object":37,"./_descriptors":45,"./_enum-keys":48,"./_export":49,"./_fails":50,"./_global":51,"./_has":52,"./_hide":53,"./_is-array":58,"./_keyof":66,"./_library":67,"./_meta":68,"./_object-create":69,"./_object-dp":70,"./_object-gopd":72,"./_object-gopn":74,"./_object-gopn-ext":73,"./_object-gops":75,"./_object-keys":78,"./_object-pie":79,"./_property-desc":81,"./_redefine":82,"./_set-to-string-tag":84,"./_shared":86,"./_to-iobject":90,"./_to-primitive":93,"./_uid":94,"./_wks":97,"./_wks-define":95,"./_wks-ext":96}],110:[function(e,t,r){e("./_wks-define")("asyncIterator")},{"./_wks-define":95}],111:[function(e,t,r){e("./_wks-define")("observable")},{"./_wks-define":95}],112:[function(e,t,r){e("./es6.array.iterator");for(var n=e("./_global"),o=e("./_hide"),i=e("./_iterators"),a=e("./_wks")("toStringTag"),u=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var s=u[c],f=n[s],l=f&&f.prototype;l&&!l[a]&&o(l,a,s),i[s]=i.Array}},{"./_global":51,"./_hide":53,"./_iterators":65,"./_wks":97,"./es6.array.iterator":102}],113:[function(e,t,r){(function(r){var n="object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this,o=n.regeneratorRuntime&&Object.getOwnPropertyNames(n).indexOf("regeneratorRuntime")>=0,i=o&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,t.exports=e("./runtime"),o)n.regeneratorRuntime=i;else try{delete n.regeneratorRuntime}catch(e){n.regeneratorRuntime=void 0}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./runtime":114}],114:[function(e,t,r){(function(e,r){!function(r){"use strict";function n(e,t,r,n){var o=t&&t.prototype instanceof i?t:i,a=Object.create(o.prototype),u=new _(n||[]);return a._invoke=f(e,r,u),a}function o(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function i(){}function a(){}function u(){}function c(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function s(t){function r(e,n,i,a){var u=o(t[e],t,n);if("throw"!==u.type){var c=u.arg,s=c.value;return s&&"object"==typeof s&&m.call(s,"__await")?Promise.resolve(s.__await).then(function(e){r("next",e,i,a)},function(e){r("throw",e,i,a)}):Promise.resolve(s).then(function(e){c.value=e,i(c)},a)}a(u.arg)}function n(e,t){function n(){return new Promise(function(n,o){r(e,t,n,o)})}return i=i?i.then(n,n):n()}"object"==typeof e&&e.domain&&(r=e.domain.bind(r));var i;this._invoke=n}function f(e,t,r){var n=O;return function(i,a){if(n===S)throw new Error("Generator is already running");if(n===L){if("throw"===i)throw a;return h()}for(r.method=i,r.arg=a;;){var u=r.delegate;if(u){var c=l(u,r);if(c){if(c===M)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===O)throw n=L,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=S;var s=o(e,t,r);if("normal"===s.type){if(n=r.done?L:E,s.arg===M)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=L,r.method="throw",r.arg=s.arg)}}}function l(e,t){var r=e.iterator[t.method];if(r===y){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=y,l(e,t),"throw"===t.method))return M;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return M}var n=o(r,e.iterator,t.arg);if("throw"===n.type)return t.method="throw",t.arg=n.arg,t.delegate=null,M;var i=n.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=y),t.delegate=null,M):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,M)}function p(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(p,this),this.reset(!0)}function b(e){if(e){var t=e[j];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function t(){for(;++r=0;--n){var o=this.tryEntries[n],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var a=m.call(o,"catchLoc"),u=m.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&m.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),d(r),M}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;d(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:b(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=y),M}}}("object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:1}],115:[function(e,t,r){t.exports=e("regenerator-runtime")},{"regenerator-runtime":113}]},{},[2])(2)}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/es6-shim.min.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/es6-shim.min.js deleted file mode 100644 index 243e880f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/es6-shim.min.js +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * https://github.com/paulmillr/es6-shim - * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) - * and contributors, MIT License - * es6-shim: v0.35.4 - * see https://github.com/paulmillr/es6-shim/blob/0.35.3/LICENSE - * Details and documentation: - * https://github.com/paulmillr/es6-shim/ - */ -(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){return Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var m={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var O=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){m.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=O(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.join);var A=Function.call.bind(Array.prototype.shift);var _=Math.max;var R=Math.min;var k=Math.floor;var L=Math.abs;var F=Math.exp;var D=Math.log;var z=Math.sqrt;var q=Function.call.bind(Object.prototype.hasOwnProperty);var W;var G=function(){};var H=S.Map;var V=H&&H.prototype["delete"];var B=H&&H.prototype.get;var U=H&&H.prototype.has;var $=H&&H.prototype.set;var J=S.Symbol||{};var X=J.species||"@@species";var K=Number.isNaN||function isNaN(e){return e!==e};var Z=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var Y=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(K(t)){return t}return t<0?-1:1};var Q=function log1p(e){var t=Number(e);if(t<-1||K(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(D(1+t)/(1+t-1))};var ee=function isArguments(e){return g(e)==="[object Arguments]"};var te=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var re=ee(arguments)?ee:te;var ne={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var oe=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);m.preserveToString(e[t],n)};var ie=typeof J==="function"&&typeof J["for"]==="function"&&ne.symbol(J());var ae=ne.symbol(J.iterator)?J.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){ae="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ue=S.Reflect;var fe=String;var se=typeof document==="undefined"||!document?null:document.all;var ce=se==null?function isNullOrUndefined(e){return e==null}:function isNullOrUndefinedAndNotDocumentAll(e){return e==null&&e!==se};var le={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!le.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(ce(e)){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"||e===se},ToObject:function(e,t){return Object(le.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return le.IsCallable(e)},ToInt32:function(e){return le.ToNumber(e)>>0},ToUint32:function(e){return le.ToNumber(e)>>>0},ToNumber:function(e){if(ie&&g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=le.ToNumber(e);if(K(t)){return 0}if(t===0||!Z(t)){return t}return(t>0?1:-1)*k(L(t))},ToLength:function(e){var t=le.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return K(e)&&K(t)},SameValueZero:function(e,t){return e===t||K(e)&&K(t)},GetIterator:function(e){if(re(e)){return new W(e,"value")}var t=le.GetMethod(e,ae);if(!le.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=le.Call(t,e);if(!le.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=le.ToObject(e)[t];if(ce(r)){return void 0}if(!le.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=le.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=le.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!le.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!le.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=le.IteratorNext(e);var r=le.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ue.construct){return ue.construct(e,t,o)}var i=o.prototype;if(!le.TypeIsObject(i)){i=Object.prototype}var a=O(i);var u=le.Call(e,a,t);return le.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!le.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[X];if(ce(n)){return t}if(!le.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=le.ToString(e);var i="<"+t;if(r!==""){var a=le.ToString(n);var u=a.replace(/"/g,""");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+""},IsRegExp:function IsRegExp(e){if(!le.TypeIsObject(e)){return false}var t=e[J.match];if(typeof t!=="undefined"){return!!t}return ne.regex(e)},ToString:function ToString(e){if(ie&&g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return fe(e)}};if(s&&ie){var pe=function defineWellKnownSymbol(e){if(ne.symbol(J[e])){return J[e]}var t=J["for"]("Symbol."+e);Object.defineProperty(J,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!ne.symbol(J.search)){var ve=pe("search");var ye=String.prototype.search;h(RegExp.prototype,ve,function search(e){return le.Call(ye,e,[this])});var he=function search(e){var t=le.RequireObjectCoercible(this);if(!ce(e)){var r=le.GetMethod(e,ve);if(typeof r!=="undefined"){return le.Call(r,e,[t])}}return le.Call(ye,t,[le.ToString(e)])};oe(String.prototype,"search",he)}if(!ne.symbol(J.replace)){var be=pe("replace");var ge=String.prototype.replace;h(RegExp.prototype,be,function replace(e,t){return le.Call(ge,e,[this,t])});var de=function replace(e,t){var r=le.RequireObjectCoercible(this);if(!ce(e)){var n=le.GetMethod(e,be);if(typeof n!=="undefined"){return le.Call(n,e,[r,t])}}return le.Call(ge,r,[le.ToString(e),t])};oe(String.prototype,"replace",de)}if(!ne.symbol(J.split)){var me=pe("split");var Oe=String.prototype.split;h(RegExp.prototype,me,function split(e,t){return le.Call(Oe,e,[this,t])});var we=function split(e,t){var r=le.RequireObjectCoercible(this);if(!ce(e)){var n=le.GetMethod(e,me);if(typeof n!=="undefined"){return le.Call(n,e,[r,t])}}return le.Call(Oe,r,[le.ToString(e),t])};oe(String.prototype,"split",we)}var je=ne.symbol(J.match);var Se=je&&function(){var e={};e[J.match]=function(){return 42};return"a".match(e)!==42}();if(!je||Se){var Te=pe("match");var Ie=String.prototype.match;h(RegExp.prototype,Te,function match(e){return le.Call(Ie,e,[this])});var Ee=function match(e){var t=le.RequireObjectCoercible(this);if(!ce(e)){var r=le.GetMethod(e,Te);if(typeof r!=="undefined"){return le.Call(r,e,[t])}}return le.Call(Ie,t,[le.ToString(e)])};oe(String.prototype,"match",Ee)}}var Pe=function wrapConstructor(e,t,r){m.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in G||r[n]){return}m.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in G||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;m.redefine(e.prototype,"constructor",t)};var Ce=function(){return this};var Me=function(e){if(s&&!q(e,X)){m.getter(e,X,Ce)}};var xe=function(e,t){var r=t||function iterator(){return this};h(e,ae,r);if(!e[ae]&&ne.symbol(ae)){e[ae]=r}};var Ne=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Ae=function createDataPropertyOrThrow(e,t,r){Ne(e,t,r);if(!le.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var _e=function(e,t,r,n){if(!le.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!le.TypeIsObject(o)){o=r}var i=O(o);for(var a in n){if(q(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Re=String.fromCodePoint;oe(String,"fromCodePoint",function fromCodePoint(e){return le.Call(Re,this,arguments)})}var ke={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return N(t,"")},raw:function raw(e){var t=arguments.length-1;var r=le.ToObject(e,"bad template");var raw=le.ToObject(r.raw,"bad raw value");var n=raw.length;var o=le.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a=o){break}f=a+1=Fe){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return Le(t,r)},startsWith:function startsWith(e){var t=le.ToString(le.RequireObjectCoercible(this));if(le.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=le.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=_(le.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=le.ToString(le.RequireObjectCoercible(this));if(le.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=le.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:le.ToInteger(o);var a=R(_(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(le.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=le.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=le.ToString(le.RequireObjectCoercible(this));var r=le.ToInteger(e);var n=t.length;if(r>=0&&r56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){oe(String.prototype,"includes",De.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var ze=i(function(){return"/a/".startsWith(/a/)});var qe=a(function(){return"abc".startsWith("a",Infinity)===false});if(!ze||!qe){oe(String.prototype,"startsWith",De.startsWith);oe(String.prototype,"endsWith",De.endsWith)}}if(ie){var We=a(function(){var e=/a/;e[J.match]=false;return"/a/".startsWith(e)});if(!We){oe(String.prototype,"startsWith",De.startsWith)}var Ge=a(function(){var e=/a/;e[J.match]=false;return"/a/".endsWith(e)});if(!Ge){oe(String.prototype,"endsWith",De.endsWith)}var He=a(function(){var e=/a/;e[J.match]=false;return"/a/".includes(e)});if(!He){oe(String.prototype,"includes",De.includes)}}b(String.prototype,De);var Ve=["\t\n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Be=new RegExp("(^["+Ve+"]+)|(["+Ve+"]+$)","g");var Ue=function trim(){return le.ToString(le.RequireObjectCoercible(this)).replace(Be,"")};var $e=["\x85","\u200b","\ufffe"].join("");var Je=new RegExp("["+$e+"]","g");var Xe=/^[-+]0x[0-9a-f]+$/i;var Ke=$e.trim().length!==$e.length;h(String.prototype,"trim",Ue,Ke);var Ze=function(e){return{value:e,done:arguments.length===0}};var Ye=function(e){le.RequireObjectCoercible(e);h(this,"_s",le.ToString(e));h(this,"_i",0)};Ye.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ze()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ze(e.substr(t,o))};xe(Ye.prototype);xe(String.prototype,function(){return new Ye(this)});var Qe={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!le.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(re(e)||le.GetMethod(e,ae))!=="undefined";var u,f,s;if(a){f=le.IsConstructor(r)?Object(new r):[];var c=le.GetIterator(e);var l,p;s=0;while(true){l=le.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){le.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=le.ToObject(e);u=le.ToLength(y.length);f=le.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s2){f=arguments[2]}var s=typeof f==="undefined"?n:le.ToInteger(f);var c=s<0?_(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=le.ToObject(this);var o=le.ToLength(n.length);t=le.ToInteger(typeof t==="undefined"?0:t);r=le.ToInteger(typeof r==="undefined"?o:r);var i=t<0?_(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u1?arguments[1]:null;for(var i=0,a;i1?arguments[1]:null;for(var i=0;i1&&typeof arguments[1]!=="undefined"){return le.Call(ut,this,arguments)}return t(ut,this,e)})}var ft=-(Math.pow(2,32)-1);var st=function(e,r){var n={length:ft};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!st(Array.prototype.forEach)){var ct=Array.prototype.forEach;oe(Array.prototype,"forEach",function forEach(e){return le.Call(ct,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.map)){var lt=Array.prototype.map;oe(Array.prototype,"map",function map(e){return le.Call(lt,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.filter)){var pt=Array.prototype.filter;oe(Array.prototype,"filter",function filter(e){return le.Call(pt,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.some)){var vt=Array.prototype.some;oe(Array.prototype,"some",function some(e){return le.Call(vt,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.every)){var yt=Array.prototype.every;oe(Array.prototype,"every",function every(e){return le.Call(yt,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.reduce)){var ht=Array.prototype.reduce;oe(Array.prototype,"reduce",function reduce(e){return le.Call(ht,this.length>=0?this:[],arguments)})}if(!st(Array.prototype.reduceRight,true)){var bt=Array.prototype.reduceRight;oe(Array.prototype,"reduceRight",function reduceRight(e){return le.Call(bt,this.length>=0?this:[],arguments)})}var gt=Number("0o10")!==8;var dt=Number("0b10")!==2;var mt=y($e,function(e){return Number(e+0+e)===0});if(gt||dt||mt){var Ot=Number;var wt=/^0b[01]+$/i;var jt=/^0o[0-7]+$/i;var St=wt.test.bind(wt);var Tt=jt.test.bind(jt);var It=function(e,t){var r;if(typeof e.valueOf==="function"){r=e.valueOf();if(ne.primitive(r)){return r}}if(typeof e.toString==="function"){r=e.toString();if(ne.primitive(r)){return r}}throw new TypeError("No default value")};var Et=Je.test.bind(Je);var Pt=Xe.test.bind(Xe);var Ct=function(){var e=function Number(t){var r;if(arguments.length>0){r=ne.primitive(t)?t:It(t,"number")}else{r=0}if(typeof r==="string"){r=le.Call(Ue,r);if(St(r)){r=parseInt(C(r,2),2)}else if(Tt(r)){r=parseInt(C(r,2),8)}else if(Et(r)||Pt(r)){r=NaN}}var n=this;var o=a(function(){Ot.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new Ot(r)}return Ot(r)};return e}();Pe(Ot,Ct,{});b(Ct,{NaN:Ot.NaN,MAX_VALUE:Ot.MAX_VALUE,MIN_VALUE:Ot.MIN_VALUE,NEGATIVE_INFINITY:Ot.NEGATIVE_INFINITY,POSITIVE_INFINITY:Ot.POSITIVE_INFINITY});Number=Ct;m.redefine(S,"Number",Ct)}var Mt=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Mt,MIN_SAFE_INTEGER:-Mt,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:Z,isInteger:function isInteger(e){return Z(e)&&le.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&L(e)<=Number.MAX_SAFE_INTEGER},isNaN:K});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if([,1].find(function(){return true})===1){oe(Array.prototype,"find",tt.find)}if([,1].findIndex(function(){return true})!==0){oe(Array.prototype,"findIndex",tt.findIndex)}var xt=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var Nt=function ensureEnumerable(e,t){if(s&&xt(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var At=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o1){return NaN}var r=L(t);return Y(t)*Q(2*r/(1-r))/2},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=F(D(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=le.ToUint32(t);if(r===0){return 32}return Mr?le.Call(Mr,r):31-k(D(r+.5)*Pr)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(K(t)){return NaN}if(!T(t)){return Infinity}var r=F(L(t)-1);return(r+1/(r*Er*Er))*(Er/2)},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(L(t)>.5){return F(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o0?i/n*(i/n):i}}return n===Infinity?Infinity:n*z(r)},log2:function log2(e){return D(e)*Pr},log10:function log10(e){return D(e)*Cr},log1p:Q,sign:Y,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}var r=L(t);if(r<1){var n=Math.expm1(r);return Y(t)*n*(1+1/(n+1))/2}var o=F(r-1);return Y(t)*(o-1/(o*Er*Er))*(Er/2)},tanh:function tanh(e){var t=Number(e);if(K(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(F(t)+F(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-k(-t):k(t)},imul:function imul(e,t){var r=le.ToUint32(e);var n=le.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||K(t)){return t}var r=Y(t);var n=L(t);if(nTr||K(i)){return r*Infinity}return r*i}};var Nr=function withinULPDistance(e,t,r){return L(1-e/t)/Number.EPSILON<(r||8)};b(Math,xr);h(Math,"sinh",xr.sinh,Math.sinh(710)===Infinity);h(Math,"cosh",xr.cosh,Math.cosh(710)===Infinity);h(Math,"log1p",xr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",xr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7)); -h(Math,"asinh",xr.asinh,Math.asinh(1e300)===Infinity);h(Math,"atanh",xr.atanh,Math.atanh(1e-300)===0);h(Math,"tanh",xr.tanh,Math.tanh(-2e-17)!==-2e-17);h(Math,"acosh",xr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"acosh",xr.acosh,!Nr(Math.acosh(1+Number.EPSILON),Math.sqrt(2*Number.EPSILON)));h(Math,"cbrt",xr.cbrt,!Nr(Math.cbrt(1e-300),1e-100));h(Math,"sinh",xr.sinh,Math.sinh(-2e-17)!==-2e-17);var Ar=Math.expm1(10);h(Math,"expm1",xr.expm1,Ar>22025.465794806718||Ar<22025.465794806718);h(Math,"hypot",xr.hypot,Math.hypot(Infinity,NaN)!==Infinity);var _r=Math.round;var Rr=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var kr=wr+1;var Lr=2*wr-1;var Fr=[kr,Lr].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=k(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Rr||!Fr);m.preserveToString(Math.round,_r);var Dr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=xr.imul;m.preserveToString(Math.imul,Dr)}if(Math.imul.length!==2){oe(Math,"imul",function imul(e,t){return le.Call(Dr,Math,arguments)})}var zr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}le.IsPromise=function(e){if(!le.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!le.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(le.IsCallable(t.resolve)&&le.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&le.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=A(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=le.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(le.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=le.IsCallable(e)?e:a;var d=le.IsCallable(t)?t:u;var m=n._promise;var O;if(m.state===f){if(m.reactionLength===0){m.fulfillReactionHandler0=g;m.rejectReactionHandler0=d;m.reactionCapability0=i}else{var w=3*(m.reactionLength-1);m[w+l]=g;m[w+p]=d;m[w+v]=i}m.reactionLength+=1}else if(m.state===s){O=m.result;h(g,i,O)}else if(m.state===c){O=m.result;h(d,i,O)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof zr==="function"){b(S,{Promise:zr});var qr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var Wr=!i(function(){return S.Promise.reject(42).then(null,5).then(null,G)});var Gr=i(function(){return S.Promise.call(3,G)});var Hr=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,G).then(null,G)}catch(n){return true}return t===r}(S.Promise);var Vr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var Br=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};Br.prototype=Promise.prototype;Br.all=Promise.all;var Ur=a(function(){return!!Br.all([1,2])});if(!qr||!Wr||!Gr||Hr||!Vr||Ur){Promise=zr;oe(S,"Promise",zr)}if(Promise.all.length!==1){var $r=Promise.all;oe(Promise,"all",function all(e){return le.Call($r,this,arguments)})}if(Promise.race.length!==1){var Jr=Promise.race;oe(Promise,"race",function race(e){return le.Call(Jr,this,arguments)})}if(Promise.resolve.length!==1){var Xr=Promise.resolve;oe(Promise,"resolve",function resolve(e){return le.Call(Xr,this,arguments)})}if(Promise.reject.length!==1){var Kr=Promise.reject;oe(Promise,"reject",function reject(e){return le.Call(Kr,this,arguments)})}Nt(Promise,"all");Nt(Promise,"race");Nt(Promise,"resolve");Nt(Promise,"reject");Me(Promise)}var Zr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Yr=Zr(["z","a","bb"]);var Qr=Zr(["z",1,"a","3",2]);if(s){var en=function fastkey(e,t){if(!t&&!Yr){return null}if(ce(e)){return"^"+le.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Qr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var tn=function emptyObject(){return Object.create?Object.create(null):{}};var rn=function addIterableToMap(e,n,o){if(r(o)||ne.string(o)){l(o,function(e){if(!le.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(!ce(o)){a=n.set;if(!le.IsCallable(a)){throw new TypeError("bad map")}i=le.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=le.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!le.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){le.IteratorClose(i,true);throw s}}}}};var nn=function addIterableToSet(e,n,o){if(r(o)||ne.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(!ce(o)){a=n.add;if(!le.IsCallable(a)){throw new TypeError("bad set")}i=le.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=le.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){le.IteratorClose(i,true);throw s}}}}};var on={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!le.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+le.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");h(this,"head",e._head);h(this,"i",this.head);h(this,"kind",t)};i.prototype={isMapIterator:true,next:function next(){if(!this.isMapIterator){throw new TypeError("Not a MapIterator")}var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ze()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ze(n)}}this.i=void 0;return Ze()}};xe(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=_e(this,Map,a,{_es6map:true,_head:null,_map:H?new H:null,_size:0,_storage:tn()});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){rn(Map,e,arguments[0])}return e};a=u.prototype;m.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t;var r=en(e,true);if(r!==null){t=this._storage[r];if(t){return t.value}return}if(this._map){t=B.call(this._map,e);if(t){return t.value}return}var n=this._head;var i=n;while((i=i.next)!==n){if(le.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=en(e,true);if(t!==null){return typeof this._storage[t]!=="undefined"}if(this._map){return U.call(this._map,e)}var r=this._head;var n=r;while((n=n.next)!==r){if(le.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=en(e,true);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}a=this._storage[u]=new r(e,t);i=n.prev}else if(this._map){if(U.call(this._map,e)){B.call(this._map,e).value=t}else{a=new r(e,t);$.call(this._map,e,a);i=n.prev}}while((i=i.next)!==n){if(le.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(le.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=en(t,true);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}else if(this._map){if(!U.call(this._map,t)){return false}n=B.call(this._map,t).prev;V.call(this._map,t)}while((n=n.next)!==r){if(le.SameValueZero(n.key,t)){n.key=e;n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._map=H?new H:null;this._size=0;this._storage=tn();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=e;r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});xe(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!le.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+le.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=_e(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:tn()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){nn(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=new on.Map;e["[[SetData]]"]=t;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};m.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=en(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=en(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=en(e))!==null){var n=q(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=tn()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return new f(this["[[SetData]]"].values())},entries:function entries(){r(this,"entries");u(this);return new f(this["[[SetData]]"].entries())},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);xe(i.prototype,i.prototype.values);var f=function SetIterator(e){h(this,"it",e)};f.prototype={isSetIterator:true,next:function next(){if(!this.isSetIterator){throw new TypeError("Not a SetIterator")}return this.it.next()}};xe(f.prototype);return i}()};var an=S.Set&&!Set.prototype["delete"]&&Set.prototype.remove&&Set.prototype.items&&Set.prototype.map&&Array.isArray((new Set).keys);if(an){S.Set=on.Set}if(S.Map||S.Set){var un=a(function(){return new Map([[1,2]]).get(1)===2});if(!un){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new H;if(arguments.length>0){rn(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=O(H.prototype);h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,H)}var fn=new Map;var sn=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var cn=fn.set(1,2)===fn;if(!sn||!cn){oe(Map.prototype,"set",function set(e,r){t($,this,e===0?0:e,r);return this})}if(!sn){b(Map.prototype,{get:function get(e){return t(B,this,e===0?0:e)},has:function has(e){return t(U,this,e===0?0:e)}},true);m.preserveToString(Map.prototype.get,B);m.preserveToString(Map.prototype.has,U)}var ln=new Set;var pn=Set.prototype["delete"]&&Set.prototype.add&&Set.prototype.has&&function(e){e["delete"](0);e.add(-0);return!e.has(0)}(ln);var vn=ln.add(1)===ln;if(!pn||!vn){var yn=Set.prototype.add;Set.prototype.add=function add(e){t(yn,this,e===0?0:e);return this};m.preserveToString(Set.prototype.add,yn)}if(!pn){var hn=Set.prototype.has;Set.prototype.has=function has(e){return t(hn,this,e===0?0:e)};m.preserveToString(Set.prototype.has,hn);var bn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(bn,this,e===0?0:e)};m.preserveToString(Set.prototype["delete"],bn)}var gn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var dn=Object.setPrototypeOf&&!gn;var mn=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||dn||!mn){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new H;if(arguments.length>0){rn(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=H.prototype;h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,H)}var On=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var wn=Object.setPrototypeOf&&!On;var jn=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||wn||!jn){var Sn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new Sn;if(arguments.length>0){nn(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=Sn.prototype;h(S.Set.prototype,"constructor",S.Set,true);m.preserveToString(S.Set,Sn)}var Tn=new S.Map;var In=!a(function(){return Tn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||Tn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof Tn.keys().next!=="function"||In||!gn){b(S,{Map:on.Map,Set:on.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}xe(Object.getPrototypeOf((new S.Map).keys()));xe(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var En=S.Set.prototype.has;oe(S.Set.prototype,"has",function has(e){return t(En,this,e)})}}b(S,on);Me(S.Map);Me(S.Set)}var Pn=function throwUnlessTargetIsObject(e){if(!le.TypeIsObject(e)){throw new TypeError("target must be an object")}};var Cn={apply:function apply(){return le.Call(le.Call,null,arguments)},construct:function construct(e,t){if(!le.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!le.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return le.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){Pn(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){Pn(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(Cn,{ownKeys:function ownKeys(e){Pn(e);var t=Object.getOwnPropertyNames(e);if(le.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var Mn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(Cn,{isExtensible:function isExtensible(e){Pn(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){Pn(e);return Mn(function(){return Object.preventExtensions(e)})}})}if(s){var xn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return xn(o,t,r)}if("value"in n){return n.value}if(n.get){return le.Call(n.get,r)}return void 0};var Nn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Nn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!le.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ue.defineProperty(o,r,{value:n})}return ue.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}if(i.set){t(i.set,o,n);return true}return false};Object.assign(Cn,{defineProperty:function defineProperty(e,t,r){Pn(e);return Mn(function(){return Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){Pn(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){Pn(e);var r=arguments.length>2?arguments[2]:e;return xn(e,t,r)},set:function set(e,t,r){Pn(e);var n=arguments.length>3?arguments[3]:e;return Nn(e,t,r,n)}})}if(Object.getPrototypeOf){var An=Object.getPrototypeOf;Cn.getPrototypeOf=function getPrototypeOf(e){Pn(e);return An(e)}}if(Object.setPrototypeOf&&Cn.getPrototypeOf){var _n=function(e,t){var r=t;while(r){if(e===r){return true}r=Cn.getPrototypeOf(r)}return false};Object.assign(Cn,{setPrototypeOf:function setPrototypeOf(e,t){Pn(e);if(t!==null&&!le.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ue.getPrototypeOf(e)){return true}if(ue.isExtensible&&!ue.isExtensible(e)){return false}if(_n(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var Rn=function(e,t){if(!le.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){oe(S.Reflect,e,t)}}};Object.keys(Cn).forEach(function(e){Rn(e,Cn[e])});var kn=S.Reflect.getPrototypeOf;if(c&&kn&&kn.name!=="getPrototypeOf"){oe(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(kn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){oe(S.Reflect,"setPrototypeOf",Cn.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){oe(S.Reflect,"defineProperty",Cn.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){oe(S.Reflect,"construct",Cn.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var Ln=Date.prototype.toString;var Fn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return le.Call(Ln,this)};oe(Date.prototype,"toString",Fn)}var Dn={anchor:function anchor(e){return le.CreateHTML(this,"a","name",e)},big:function big(){return le.CreateHTML(this,"big","","")},blink:function blink(){return le.CreateHTML(this,"blink","","")},bold:function bold(){return le.CreateHTML(this,"b","","")},fixed:function fixed(){return le.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return le.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return le.CreateHTML(this,"font","size",e)},italics:function italics(){return le.CreateHTML(this,"i","","")},link:function link(e){return le.CreateHTML(this,"a","href",e)},small:function small(){return le.CreateHTML(this,"small","","")},strike:function strike(){return le.CreateHTML(this,"strike","","")},sub:function sub(){return le.CreateHTML(this,"sub","","")},sup:function sub(){return le.CreateHTML(this,"sup","","")}};l(Object.keys(Dn),function(e){var r=String.prototype[e];var n=false;if(le.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){oe(String.prototype,e,Dn[e])}});var zn=function(){if(!ie){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e(J())!=="undefined"){return true}if(e([J()])!=="[null]"){return true}var t={a:J()};t[J()]=true;if(e(t)!=="{}"){return true}return false}();var qn=a(function(){if(!ie){return true}return JSON.stringify(Object(J()))==="{}"&&JSON.stringify([Object(J())])==="[{}]"});if(zn||!qn){var Wn=JSON.stringify;oe(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=le.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(ne.symbol(n)){return _t({})(n)}return n}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return Wn.apply(this,o)})}return S}); -//# sourceMappingURL=es6-shim.map diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/htmlparser.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/htmlparser.js deleted file mode 100644 index 522b39ca..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/htmlparser.js +++ /dev/null @@ -1,23 +0,0 @@ -/*********************************************** -Copyright 2010 - 2012 Chris Winberry . All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -***********************************************/ -/* v2.0.0 */ - -!function(){function t(t,e){var a=function(){};a.prototype=e.prototype,t.super_=e,t.prototype=new a,t.prototype.constructor=t}function e(t,e){this._options=e||{},this._validateBuilder(t);this._builder=t,this.reset()}function a(t,e){this.reset(),this._options=e||{},void 0===this._options.ignoreWhitespace&&(this._options.ignoreWhitespace=!1),void 0===this._options.includeLocation&&(this._options.includeLocation=!1),void 0===this._options.verbose&&(this._options.verbose=!0),void 0===this._options.enforceEmptyTags&&(this._options.enforceEmptyTags=!0),void 0===this._options.caseSensitiveTags&&(this._options.caseSensitiveTags=!1),void 0===this._options.caseSensitiveAttr&&(this._options.caseSensitiveAttr=!1),"function"==typeof t&&(this._callback=t)}function n(t){n.super_.call(this,t,{ignoreWhitespace:!0,verbose:!1,enforceEmptyTags:!1,caseSensitiveTags:!0})}var i;if("undefined"!=typeof module&&void 0!==module.exports)i=module.exports;else{if(i={},this.Tautologistics||(this.Tautologistics={}),this.Tautologistics.NodeHtmlParser)return;this.Tautologistics.NodeHtmlParser=i}var s={Text:"text",Tag:"tag",Attr:"attr",CData:"cdata",Doctype:"doctype",Comment:"comment"};"undefined"!=typeof module&&void 0!==module.exports&&(t(e,require("stream")),e.prototype.writable=!0,e.prototype.write=function(t){t instanceof Buffer&&(t=t.toString()),this.parseChunk(t)},e.prototype.end=function(t){arguments.length&&this.write(t),this.writable=!1,this.done()},e.prototype.destroy=function(){this.writable=!1}),e.prototype.reset=function(){this._state={mode:s.Text,pos:0,data:null,pendingText:null,pendingWrite:null,lastTag:null,isScript:!1,needData:!1,output:[],done:!1},this._builder.reset()},e.prototype.parseChunk=function(t){for(this._state.needData=!1,this._state.data=null!==this._state.data?this._state.data.substr(this.pos)+t:t;this._state.pos\/]+)(\s*)\??(>?)/g,e.prototype._parseTag=function(){var t=this._state;e.re_parseTag.lastIndex=t.pos;var a=e.re_parseTag.exec(t.data);if(a){if(!a[1]&&"!--"===a[2].substr(0,3))return t.mode=s.Comment,void(t.pos+=3);if(!a[1]&&"![CDATA["===a[2].substr(0,8))return t.mode=s.CData,void(t.pos+=8);if(!a[1]&&"!DOCTYPE"===a[2].substr(0,8))return t.mode=s.Doctype,void(t.pos+=8);if(!t.done&&t.pos+a[0].length===t.data.length)return void(t.needData=!0);var n;">"===a[4]?(t.mode=s.Text,n=a[0].substr(0,a[0].length-1)):(t.mode=s.Attr,n=a[0]),t.pos+=a[0].length;var i={type:s.Tag,name:a[1]+a[2],raw:n};t.mode===s.Attr&&(t.lastTag=i),"script"===i.name.toLowerCase()?t.isScript=!0:"/script"===i.name.toLowerCase()&&(t.isScript=!1),t.mode===s.Attr?this._writePending(i):this._write(i)}else t.needData=!0},e.re_parseAttr_findName=/\s*([^=<>\s'"\/]+)\s*/g,e.prototype._parseAttr_findName=function(){e.re_parseAttr_findName.lastIndex=this._state.pos;var t=e.re_parseAttr_findName.exec(this._state.data);return t?this._state.pos+t[0].length!==e.re_parseAttr_findName.lastIndex?null:{match:t[0],name:t[1]}:null},e.re_parseAttr_findValue=/\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s\/>]+))\s*/g,e.re_parseAttr_findValue_last=/\s*=\s*['"]?(.*)$/g,e.prototype._parseAttr_findValue=function(){var t=this._state;e.re_parseAttr_findValue.lastIndex=t.pos;var a=e.re_parseAttr_findValue.exec(t.data);return a?t.pos+a[0].length!==e.re_parseAttr_findValue.lastIndex?null:{match:a[0],value:a[1]||a[2]||a[3]}:t.done?(e.re_parseAttr_findValue_last.lastIndex=t.pos,a=e.re_parseAttr_findValue_last.exec(t.data),a?{match:a[0],value:""!==a[1]?a[1]:null}:null):null},e.re_parseAttr_splitValue=/\s*=\s*['"]?/g,e.re_parseAttr_selfClose=/(\s*\/\s*)(>?)/g,e.prototype._parseAttr=function(){var t=this._state,a=this._parseAttr_findName(t);if(a&&"?"!==a.name){if(!t.done&&t.pos+a.match.length===t.data.length)return t.needData=!0,null;t.pos+=a.match.length;var n=this._parseAttr_findValue(t);t.data.indexOf(" ",t.pos);if(n){if(!t.done&&t.pos+n.match.length===t.data.length)return t.needData=!0,void(t.pos-=a.match.length);t.pos+=n.match.length}else if(t.data.indexOf(" ",t.pos-1))n={match:"",value:a.name};else{if(e.re_parseAttr_splitValue.lastIndex=t.pos,e.re_parseAttr_splitValue.exec(t.data))return t.needData=!0,void(t.pos-=a.match.length);n={match:"",value:null}}t.lastTag.raw+=a.match+n.match,this._writePending({type:s.Attr,name:a.name,data:n.value})}else{e.re_parseAttr_selfClose.lastIndex=t.pos;var i=e.re_parseAttr_selfClose.exec(t.data);if(i&&i.index===t.pos){if(!t.done&&!i[2]&&t.pos+i[0].length===t.data.length)return void(t.needData=!0);t.lastTag.raw+=i[1],this._write({type:s.Tag,name:"/"+t.lastTag.name,raw:null}),t.pos+=i[1].length}var r=t.data.indexOf(">",t.pos);if(r<0){if(t.done)return t.lastTag.raw+=t.data.substr(t.pos),void(t.pos=t.data.length);t.needData=!0}else t.pos=r+1,t.mode=s.Text}},e.re_parseCData_findEnding=/\]{1,2}$/,e.prototype._parseCData=function(){var t=this._state,a=t.data.indexOf("]]>",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0){if(e.re_parseCData_findEnding.lastIndex=t.pos,e.re_parseCData_findEnding.exec(t.data))return void(t.needData=!0);t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0}else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.CData,data:n}),t.mode=s.Text,t.pos=a+3}},e.prototype._parseDoctype=function(){var t=this._state,a=t.data.indexOf(">",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0)e.re_parseCData_findEnding.lastIndex=t.pos,t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0;else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.Doctype,data:n}),t.mode=s.Text,t.pos=a+1}},e.re_parseComment_findEnding=/\-{1,2}$/,e.prototype._parseComment=function(){var t=this._state,a=t.data.indexOf("--\x3e",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0){if(e.re_parseComment_findEnding.lastIndex=t.pos,e.re_parseComment_findEnding.exec(t.data))return void(t.needData=!0);t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0}else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.Comment,data:n}),t.mode=s.Text,t.pos=a+3}},a._emptyTags={area:1,base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1,"?xml":1},a.reWhitespace=/^\s*$/,a.prototype.dom=null,a.prototype.reset=function(){this.dom=[],this._done=!1,this._tagStack=[],this._lastTag=null,this._tagStack.last=function(){return this.length?this[this.length-1]:null},this._line=1,this._col=1},a.prototype.done=function(){this._done=!0,this.handleCallback(null)},a.prototype.error=function(t){this.handleCallback(t)},a.prototype.handleCallback=function(t){if("function"==typeof this._callback)this._callback(t,this.dom);else if(t)throw t},a.prototype.isEmptyTag=function(t){var e=t.name.toLowerCase();return"?"==e.charAt(0)||("/"==e.charAt(0)&&(e=e.substring(1)),this._options.enforceEmptyTags&&!!a._emptyTags[e])},a.prototype._getLocation=function(){return{line:this._line,col:this._col}},a.prototype._updateLocation=function(t){var e=t.type===s.Tag?t.raw:t.data;if(null!==e){var a=e.split("\n");this._line+=a.length-1,a.length>1&&(this._col=1),this._col+=a[a.length-1].length,t.type===s.Tag?this._col+=2:t.type===s.Comment?this._col+=7:t.type===s.CData&&(this._col+=12)}},a.prototype._copyElement=function(t){var e={type:t.type};if(this._options.verbose&&void 0!==t.raw&&(e.raw=t.raw),void 0!==t.name)switch(t.type){case s.Tag:e.name=this._options.caseSensitiveTags?t.name:t.name.toLowerCase();break;case s.Attr:e.name=this._options.caseSensitiveAttr?t.name:t.name.toLowerCase();break;default:e.name=this._options.caseSensitiveTags?t.name:t.name.toLowerCase()}return void 0!==t.data&&(e.data=t.data),t.location&&(e.location={line:t.location.line,col:t.location.col}),e},a.prototype.write=function(t){if(this._done&&this.handleCallback(new Error("Writing to the builder after done() called is not allowed without a reset()")),this._options.includeLocation&&t.type!==s.Attr&&(t.location=this._getLocation(),this._updateLocation(t)),t.type!==s.Text||!this._options.ignoreWhitespace||!a.reWhitespace.test(t.data)){var e,n;if(this._tagStack.last())if(t.type===s.Tag)if("/"==t.name.charAt(0)){var i=this._options.caseSensitiveTags?t.name.substring(1):t.name.substring(1).toLowerCase();if(!this.isEmptyTag(t)){for(var r=this._tagStack.length-1;r>-1&&this._tagStack[r--].name!=i;);if(r>-1||this._tagStack[0].name==i)for(;r=0&&s.length>=n)return s;if(a&&e.children)i=e.children;else{if(!(e instanceof Array))return s;i=e}for(var d=0;d=0&&s.length>=n));d++);return s},getElementById:function(t,e,a){var n=r.getElements({id:t},e,a,1);return n.length?n[0]:null},getElementsByTagName:function(t,e,a,n){return r.getElements({tag_name:t},e,a,n)},getElementsByTagType:function(t,e,a,n){return r.getElements({tag_type:t},e,a,n)}};i.Parser=e,i.HtmlBuilder=a,i.RssBuilder=n,i.ElementType=s,i.DomUtils=r}(); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/innersvg.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/innersvg.js deleted file mode 100644 index b1099deb..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/innersvg.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * innerHTML property for SVGElement - * Copyright(c) 2010, Jeff Schiller - * - * Licensed under the Apache License, Version 2 - * - * Minor modifications by Chris Price to only polyfill when required. - */ -!function(e){if(e&&!("innerHTML"in e.prototype)){var t=function(e,r){var i=e.nodeType;if(3==i)r.push(e.textContent.replace(/&/,"&").replace(/",">"));else if(1==i){if(r.push("<",e.tagName),e.hasAttributes())for(var n=e.attributes,s=0,o=n.length;s");for(var h=e.childNodes,s=0,o=h.length;s")}else r.push("/>")}else{if(8!=i)throw"Error serializing XML. Unhandled node of type: "+i;r.push("\x3c!--",e.nodeValue,"--\x3e")}};Object.defineProperty(e.prototype,"innerHTML",{get:function(){for(var e=[],r=this.firstChild;r;)t(r,e),r=r.nextSibling;return e.join("")},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser;t.async=!1,sXML=""+e+"";for(var r=t.parseFromString(sXML,"text/xml").documentElement.firstChild;r;)this.appendChild(this.ownerDocument.importNode(r,!0)),r=r.nextSibling}catch(e){throw new Error("Error parsing XML string")}}})}}((0,eval)("this").SVGElement); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/lit-html.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/lit-html.js deleted file mode 100644 index 743deea1..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/lit-html.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";function _possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeof call==="function")){return call}return _assertThisInitialized(self)}function _assertThisInitialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _get(target,property,receiver){if(typeof Reflect!=="undefined"&&Reflect.get){_get=Reflect.get}else{_get=function _get(target,property,receiver){var base=_superPropBase(target,property);if(!base)return;var desc=Object.getOwnPropertyDescriptor(base,property);if(desc.get){return desc.get.call(receiver)}return desc.value}}return _get(target,property,receiver||target)}function _superPropBase(object,property){while(!Object.prototype.hasOwnProperty.call(object,property)){object=_getPrototypeOf(object);if(object===null)break}return object}function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _getPrototypeOf(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o};return _setPrototypeOf(o,p)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||Object.prototype.toString.call(iter)==="[object Arguments]")return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i2&&arguments[2]!==undefined?arguments[2]:null;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var n=e;for(;n!==s;){var _e=n.nextSibling;t.insertBefore(n,i),n=_e}},o=function o(t,e){var s=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var i=e;for(;i!==s;){var _e2=i.nextSibling;t.removeChild(i),i=_e2}},r={},a={},l="{{lit-".concat(String(Math.random()).slice(2),"}}"),h="\x3c!--".concat(l,"--\x3e"),d=new RegExp("".concat(l,"|").concat(h)),c="$lit$";var u=function u(t,e){var _this=this;_classCallCheck(this,u);this.parts=[],this.element=e;var s=-1,i=0;var n=[],o=function o(e){var r=e.content,a=document.createTreeWalker(r,133,null,!1);var h=0;for(;a.nextNode();){s++;var _e3=a.currentNode;if(1===_e3.nodeType){if(_e3.hasAttributes()){var _n=_e3.attributes;var _o=0;for(var _t=0;_t<_n.length;_t++){_n[_t].value.indexOf(l)>=0&&_o++}for(;_o-- >0;){var _n2=t.strings[i],_o2=g.exec(_n2)[2],_r=_o2.toLowerCase()+c,_a=_e3.getAttribute(_r).split(d);_this.parts.push({type:"attribute",index:s,name:_o2,strings:_a}),_e3.removeAttribute(_r),i+=_a.length-1}}"TEMPLATE"===_e3.tagName&&o(_e3)}else if(3===_e3.nodeType){var _t2=_e3.data;if(_t2.indexOf(l)>=0){var _o3=_e3.parentNode,_r2=_t2.split(d),_a2=_r2.length-1;for(var _t3=0;_t3<_a2;_t3++){_o3.insertBefore(""===_r2[_t3]?m():document.createTextNode(_r2[_t3]),_e3),_this.parts.push({type:"node",index:++s})}""===_r2[_a2]?(_o3.insertBefore(m(),_e3),n.push(_e3)):_e3.data=_r2[_a2],i+=_a2}}else if(8===_e3.nodeType)if(_e3.data===l){var _t4=_e3.parentNode;null!==_e3.previousSibling&&s!==h||(s++,_t4.insertBefore(m(),_e3)),h=s,_this.parts.push({type:"node",index:s}),null===_e3.nextSibling?_e3.data="":(n.push(_e3),s--),i++}else{var _t5=-1;for(;-1!==(_t5=_e3.data.indexOf(l,_t5+1));){_this.parts.push({type:"node",index:-1})}}}};o(e);for(var _i=0;_i=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;var v=function(){function v(t,e,s){_classCallCheck(this,v);this._parts=[],this.template=t,this.processor=e,this.options=s}_createClass(v,[{key:"update",value:function update(t){var e=0;var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=this._parts[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var _s=_step.value;void 0!==_s&&_s.setValue(t[e]),e++}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion2=true;var _didIteratorError2=false;var _iteratorError2=undefined;try{for(var _iterator2=this._parts[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){var _t7=_step2.value;void 0!==_t7&&_t7.commit()}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return!=null){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}}},{key:"_clone",value:function _clone(){var _this2=this;var t=i?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=this.template.parts;var s=0,n=0;var o=function o(t){var i=document.createTreeWalker(t,133,null,!1);var r=i.nextNode();for(;s".concat(_get(_getPrototypeOf(x.prototype),"getHTML",this).call(this),"")}},{key:"getTemplateElement",value:function getTemplateElement(){var t=_get(_getPrototypeOf(x.prototype),"getTemplateElement",this).call(this),e=t.content,s=e.firstChild;return e.removeChild(s),n(e,s.firstChild),t}}]);return x}(f);var _=function _(t){return null===t||!("object"==_typeof(t)||"function"==typeof t)};var y=function(){function y(t,e,s){_classCallCheck(this,y);this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(var _t11=0;_t110&&arguments[0]!==undefined?arguments[0]:this.startNode;o(this.startNode.parentNode,t.nextSibling,this.endNode)}}]);return V}();var b=function(){function b(t,e,s){_classCallCheck(this,b);if(this.value=void 0,this._pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}_createClass(b,[{key:"setValue",value:function setValue(t){this._pendingValue=t}},{key:"commit",value:function commit(){for(;s(this._pendingValue);){var _t15=this._pendingValue;this._pendingValue=r,_t15(this)}if(this._pendingValue===r)return;var t=!!this._pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name)),this.value=t,this._pendingValue=r}}]);return b}();var w=function(_y){_inherits(w,_y);function w(t,e,s){var _this3;_classCallCheck(this,w);_this3=_possibleConstructorReturn(this,_getPrototypeOf(w).call(this,t,e,s)),_this3.single=2===s.length&&""===s[0]&&""===s[1];return _this3}_createClass(w,[{key:"_createPart",value:function _createPart(){return new T(this)}},{key:"_getValue",value:function _getValue(){return this.single?this.parts[0].value:_get(_getPrototypeOf(w.prototype),"_getValue",this).call(this)}},{key:"commit",value:function commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}]);return w}(y);var T=function(_N){_inherits(T,_N);function T(){_classCallCheck(this,T);return _possibleConstructorReturn(this,_getPrototypeOf(T).apply(this,arguments))}return T}(N);var E=!1;try{var _t16={get capture(){return E=!0,!1}};window.addEventListener("test",_t16,_t16),window.removeEventListener("test",_t16,_t16)}catch(t){}var A=function(){function A(t,e,s){var _this4=this;_classCallCheck(this,A);this.value=void 0,this._pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this._boundHandleEvent=function(t){return _this4.handleEvent(t)}}_createClass(A,[{key:"setValue",value:function setValue(t){this._pendingValue=t}},{key:"commit",value:function commit(){for(;s(this._pendingValue);){var _t17=this._pendingValue;this._pendingValue=r,_t17(this)}if(this._pendingValue===r)return;var t=this._pendingValue,e=this.value,i=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),n=null!=t&&(null==e||i);i&&this.element.removeEventListener(this.eventName,this._boundHandleEvent,this._options),n&&(this._options=P(t),this.element.addEventListener(this.eventName,this._boundHandleEvent,this._options)),this.value=t,this._pendingValue=r}},{key:"handleEvent",value:function handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}]);return A}();var P=function P(t){return t&&(E?{capture:t.capture,passive:t.passive,once:t.once}:t.capture)};var S=function(){function S(){_classCallCheck(this,S)}_createClass(S,[{key:"handleAttributeExpressions",value:function handleAttributeExpressions(t,e,s,i){var n=e[0];if("."===n){return new w(t,e.slice(1),s).parts}return"@"===n?[new A(t,e.slice(1),i.eventContext)]:"?"===n?[new b(t,e.slice(1),s)]:new y(t,e,s).parts}},{key:"handleTextExpression",value:function handleTextExpression(t){return new V(t)}}]);return S}();var C=new S;function M(t){var e=L.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},L.set(t.type,e));var s=e.stringsArray.get(t.strings);if(void 0!==s)return s;var i=t.strings.join(l);return void 0===(s=e.keyString.get(i))&&(s=new u(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}var L=new Map,k=new WeakMap;(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.0.0");t.html=function(t){for(var _len=arguments.length,e=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){e[_key-1]=arguments[_key]}return new f(t,e,"html",C)},t.svg=function(t){for(var _len2=arguments.length,e=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++){e[_key2-1]=arguments[_key2]}return new x(t,e,"svg",C)},t.DefaultTemplateProcessor=S,t.defaultTemplateProcessor=C,t.directive=function(t){return function(){var i=t.apply(void 0,arguments);return e.set(i,!0),i}},t.isDirective=s,t.removeNodes=o,t.reparentNodes=n,t.noChange=r,t.nothing=a,t.AttributeCommitter=y,t.AttributePart=N,t.BooleanAttributePart=b,t.EventPart=A,t.isPrimitive=_,t.NodePart=V,t.PropertyCommitter=w,t.PropertyPart=T,t.parts=k,t.render=function(t,e,s){var i=k.get(e);void 0===i&&(o(e,e.firstChild),k.set(e,i=new V(Object.assign({templateFactory:M},s))),i.appendInto(e)),i.setValue(t),i.commit()},t.templateCaches=L,t.templateFactory=M,t.TemplateInstance=v,t.SVGTemplateResult=x,t.TemplateResult=f,t.createMarker=m,t.isTemplatePartActive=p,t.Template=u,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/prism.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/prism.js deleted file mode 100644 index 92675911..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/prism.js +++ /dev/null @@ -1,46 +0,0 @@ -/* PrismJS 1.29.0 -https://prismjs.com/download.html?#themes=prism&languages=markup+css+clike+javascript+apacheconf+aspnet+bash+c+csharp+cpp+coffeescript+dart+docker+elm+git+go+graphql+handlebars+haskell+http+ignore+java+json+kotlin+less+markdown+markup-templating+nginx+php+powershell+ruby+rust+sass+scss+sql+swift+typescript+wasm+yaml&plugins=line-highlight+line-numbers+toolbar+copy-to-clipboard */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; -!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; -Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; -!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); -Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); -!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; -!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); -!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); -!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); -!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); -Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; -Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; -Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; -Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",(function(n){if("graphql"===n.language)for(var t=n.tokens.filter((function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type})),e=0;e0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); -!function(a){a.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); -Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; -!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); -!function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism); -!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); -Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; -!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); -Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); -!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); -!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism); -!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); -!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); -!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); -!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); -!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); -Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; -Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; -Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); -!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); -Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; -!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var e,t="line-numbers",i="linkable-line-numbers",n=/\n(?!$)/g,r=!0;Prism.plugins.lineHighlight={highlightLines:function(o,u,c){var h=(u="string"==typeof u?u:o.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+o.getAttribute("data-line-offset")||0,f=(function(){if(void 0===e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding="0",t.style.border="0",t.innerHTML=" 
                                                                                                                                                                                 ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}()?parseInt:parseFloat)(getComputedStyle(o).lineHeight),p=Prism.util.isActive(o,t),g=o.querySelector("code"),m=p?o:g||o,v=[],y=g.textContent.match(n),b=y?y.length+1:1,A=g&&m!=g?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(o,g):0;h.forEach((function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i;if(!((n=Math.min(b+d,n))i&&r.setAttribute("data-end",String(n)),r.style.top=(i-d-1)*f+A+"px",r.textContent=new Array(n-i+2).join(" \n")}));v.push((function(){r.style.width=o.scrollWidth+"px"})),v.push((function(){m.appendChild(r)}))}}));var P=o.id;if(p&&Prism.util.isActive(o,i)&&P){l(o,i)||v.push((function(){o.classList.add(i)}));var E=parseInt(o.getAttribute("data-start")||"1");s(".line-numbers-rows > span",o).forEach((function(e,t){var i=t+E;e.onclick=function(){var e=P+"."+i;r=!1,location.hash=e,setTimeout((function(){r=!0}),1)}}))}return function(){v.forEach(a)}}};var o=0;Prism.hooks.add("before-sanity-check",(function(e){var t=e.element.parentElement;if(u(t)){var i=0;s(".line-highlight",t).forEach((function(e){i+=e.textContent.length,e.parentNode.removeChild(e)})),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}})),Prism.hooks.add("complete",(function e(i){var n=i.element.parentElement;if(u(n)){clearTimeout(o);var r=Prism.plugins.lineNumbers,s=i.plugins&&i.plugins.lineNumbers;l(n,t)&&r&&!s?Prism.hooks.add("line-numbers",e):(Prism.plugins.lineHighlight.highlightLines(n)(),o=setTimeout(c,1))}})),window.addEventListener("hashchange",c),window.addEventListener("resize",(function(){s("pre").filter(u).map((function(e){return Prism.plugins.lineHighlight.highlightLines(e)})).forEach(a)}))}function s(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function l(e,t){return e.classList.contains(t)}function a(e){e()}function u(e){return!!(e&&/pre/i.test(e.nodeName)&&(e.hasAttribute("data-line")||e.id&&Prism.util.isActive(e,i)))}function c(){var e=location.hash.slice(1);s(".temporary.line-highlight").forEach((function(e){e.parentNode.removeChild(e)}));var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),n=document.getElementById(i);n&&(n.hasAttribute("data-line")||n.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(n,t,"temporary ")(),r&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}}(); -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e="line-numbers",n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var i=n.querySelector(".line-numbers-rows");if(i){var r=parseInt(n.getAttribute("data-start"),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r - * Licensed under the New BSD License. - * https://github.com/stackp/promisejs - */ -(function(a){function b(){this._callbacks=[];}b.prototype.then=function(a,c){var d;if(this._isdone)d=a.apply(c,this.result);else{d=new b();this._callbacks.push(function(){var b=a.apply(c,arguments);if(b&&typeof b.then==='function')b.then(d.done,d);});}return d;};b.prototype.done=function(){this.result=arguments;this._isdone=true;for(var a=0;a=300)&&j.status!==304);h.done(a,j.responseText,j);}};j.send(k);return h;}function h(a){return function(b,c,d){return g(a,b,c,d);};}var i={Promise:b,join:c,chain:d,ajax:g,get:h('GET'),post:h('POST'),put:h('PUT'),del:h('DELETE'),ENOXHR:1,ETIMEOUT:2,ajaxTimeout:0};if(typeof define==='function'&&define.amd)define(function(){return i;});else a.promise=i;})(this); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/svg-pan-zoom.min.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/svg-pan-zoom.min.js deleted file mode 100644 index 4904d12d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/libs/svg-pan-zoom.min.js +++ /dev/null @@ -1,3 +0,0 @@ -// svg-pan-zoom v3.6.1 -// https://github.com/ariutta/svg-pan-zoom -!function s(r,a,l){function u(e,t){if(!a[e]){if(!r[e]){var o="function"==typeof require&&require;if(!t&&o)return o(e,!0);if(h)return h(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var i=a[e]={exports:{}};r[e][0].call(i.exports,function(t){return u(r[e][1][t]||t)},i,i.exports,s,r,a,l)}return a[e].exports}for(var h="function"==typeof require&&require,t=0;tthis.options.maxZoom*n.zoom&&(t=this.options.maxZoom*n.zoom/this.getZoom());var i=this.viewport.getCTM(),s=e.matrixTransform(i.inverse()),r=this.svg.createSVGMatrix().translate(s.x,s.y).scale(t).translate(-s.x,-s.y),a=i.multiply(r);a.a!==i.a&&this.viewport.setCTM(a)},i.prototype.zoom=function(t,e){this.zoomAtPoint(t,a.getSvgCenterPoint(this.svg,this.width,this.height),e)},i.prototype.publicZoom=function(t,e){e&&(t=this.computeFromRelativeZoom(t)),this.zoom(t,e)},i.prototype.publicZoomAtPoint=function(t,e,o){if(o&&(t=this.computeFromRelativeZoom(t)),"SVGPoint"!==r.getType(e)){if(!("x"in e&&"y"in e))throw new Error("Given point is invalid");e=a.createSVGPoint(this.svg,e.x,e.y)}this.zoomAtPoint(t,e,o)},i.prototype.getZoom=function(){return this.viewport.getZoom()},i.prototype.getRelativeZoom=function(){return this.viewport.getRelativeZoom()},i.prototype.computeFromRelativeZoom=function(t){return t*this.viewport.getOriginalState().zoom},i.prototype.resetZoom=function(){var t=this.viewport.getOriginalState();this.zoom(t.zoom,!0)},i.prototype.resetPan=function(){this.pan(this.viewport.getOriginalState())},i.prototype.reset=function(){this.resetZoom(),this.resetPan()},i.prototype.handleDblClick=function(t){var e;if((this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),this.options.controlIconsEnabled)&&-1<(t.target.getAttribute("class")||"").indexOf("svg-pan-zoom-control"))return!1;e=t.shiftKey?1/(2*(1+this.options.zoomScaleSensitivity)):2*(1+this.options.zoomScaleSensitivity);var o=a.getEventPoint(t,this.svg).matrixTransform(this.svg.getScreenCTM().inverse());this.zoomAtPoint(e,o)},i.prototype.handleMouseDown=function(t,e){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),r.mouseAndTouchNormalize(t,this.svg),this.options.dblClickZoomEnabled&&r.isDblClick(t,e)?this.handleDblClick(t):(this.state="pan",this.firstEventCTM=this.viewport.getCTM(),this.stateOrigin=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()))},i.prototype.handleMouseMove=function(t){if(this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&this.options.panEnabled){var e=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()),o=this.firstEventCTM.translate(e.x-this.stateOrigin.x,e.y-this.stateOrigin.y);this.viewport.setCTM(o)}},i.prototype.handleMouseUp=function(t){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&(this.state="none")},i.prototype.fit=function(){var t=this.viewport.getViewBox(),e=Math.min(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.contain=function(){var t=this.viewport.getViewBox(),e=Math.max(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.center=function(){var t=this.viewport.getViewBox(),e=.5*(this.width-(t.width+2*t.x)*this.getZoom()),o=.5*(this.height-(t.height+2*t.y)*this.getZoom());this.getPublicInstance().pan({x:e,y:o})},i.prototype.updateBBox=function(){this.viewport.simpleViewBoxCache()},i.prototype.pan=function(t){var e=this.viewport.getCTM();e.e=t.x,e.f=t.y,this.viewport.setCTM(e)},i.prototype.panBy=function(t){var e=this.viewport.getCTM();e.e+=t.x,e.f+=t.y,this.viewport.setCTM(e)},i.prototype.getPan=function(){var t=this.viewport.getState();return{x:t.x,y:t.y}},i.prototype.resize=function(){var t=a.getBoundingClientRectNormalized(this.svg);this.width=t.width,this.height=t.height;var e=this.viewport;e.options.width=this.width,e.options.height=this.height,e.processCTM(),this.options.controlIconsEnabled&&(this.getPublicInstance().disableControlIcons(),this.getPublicInstance().enableControlIcons())},i.prototype.destroy=function(){var e=this;for(var t in this.beforeZoom=null,this.onZoom=null,this.beforePan=null,this.onPan=null,(this.onUpdatedCTM=null)!=this.options.customEventsHandler&&this.options.customEventsHandler.destroy({svgElement:this.svg,eventsListenerElement:this.options.eventsListenerElement,instance:this.getPublicInstance()}),this.eventListeners)(this.options.eventsListenerElement||this.svg).removeEventListener(t,this.eventListeners[t],!this.options.preventMouseEventsDefault&&h);this.disableMouseWheelZoom(),this.getPublicInstance().disableControlIcons(),this.reset(),c=c.filter(function(t){return t.svg!==e.svg}),delete this.options,delete this.viewport,delete this.publicInstance,delete this.pi,this.getPublicInstance=function(){return null}},i.prototype.getPublicInstance=function(){var o=this;return this.publicInstance||(this.publicInstance=this.pi={enablePan:function(){return o.options.panEnabled=!0,o.pi},disablePan:function(){return o.options.panEnabled=!1,o.pi},isPanEnabled:function(){return!!o.options.panEnabled},pan:function(t){return o.pan(t),o.pi},panBy:function(t){return o.panBy(t),o.pi},getPan:function(){return o.getPan()},setBeforePan:function(t){return o.options.beforePan=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnPan:function(t){return o.options.onPan=null===t?null:r.proxy(t,o.publicInstance),o.pi},enableZoom:function(){return o.options.zoomEnabled=!0,o.pi},disableZoom:function(){return o.options.zoomEnabled=!1,o.pi},isZoomEnabled:function(){return!!o.options.zoomEnabled},enableControlIcons:function(){return o.options.controlIconsEnabled||(o.options.controlIconsEnabled=!0,s.enable(o)),o.pi},disableControlIcons:function(){return o.options.controlIconsEnabled&&(o.options.controlIconsEnabled=!1,s.disable(o)),o.pi},isControlIconsEnabled:function(){return!!o.options.controlIconsEnabled},enableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!0,o.pi},disableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!1,o.pi},isDblClickZoomEnabled:function(){return!!o.options.dblClickZoomEnabled},enableMouseWheelZoom:function(){return o.enableMouseWheelZoom(),o.pi},disableMouseWheelZoom:function(){return o.disableMouseWheelZoom(),o.pi},isMouseWheelZoomEnabled:function(){return!!o.options.mouseWheelZoomEnabled},setZoomScaleSensitivity:function(t){return o.options.zoomScaleSensitivity=t,o.pi},setMinZoom:function(t){return o.options.minZoom=t,o.pi},setMaxZoom:function(t){return o.options.maxZoom=t,o.pi},setBeforeZoom:function(t){return o.options.beforeZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnZoom:function(t){return o.options.onZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},zoom:function(t){return o.publicZoom(t,!0),o.pi},zoomBy:function(t){return o.publicZoom(t,!1),o.pi},zoomAtPoint:function(t,e){return o.publicZoomAtPoint(t,e,!0),o.pi},zoomAtPointBy:function(t,e){return o.publicZoomAtPoint(t,e,!1),o.pi},zoomIn:function(){return this.zoomBy(1+o.options.zoomScaleSensitivity),o.pi},zoomOut:function(){return this.zoomBy(1/(1+o.options.zoomScaleSensitivity)),o.pi},getZoom:function(){return o.getRelativeZoom()},setOnUpdatedCTM:function(t){return o.options.onUpdatedCTM=null===t?null:r.proxy(t,o.publicInstance),o.pi},resetZoom:function(){return o.resetZoom(),o.pi},resetPan:function(){return o.resetPan(),o.pi},reset:function(){return o.reset(),o.pi},fit:function(){return o.fit(),o.pi},contain:function(){return o.contain(),o.pi},center:function(){return o.center(),o.pi},updateBBox:function(){return o.updateBBox(),o.pi},resize:function(){return o.resize(),o.pi},getSizes:function(){return{width:o.width,height:o.height,realZoom:o.getZoom(),viewBox:o.viewport.getViewBox()}},destroy:function(){return o.destroy(),o.pi}}),this.publicInstance};var c=[];e.exports=function(t,e){var o=r.getSvg(t);if(null===o)return null;for(var n=c.length-1;0<=n;n--)if(c[n].svg===o)return c[n].instance.getPublicInstance();return c.push({svg:o,instance:new i(o,e)}),c[c.length-1].instance.getPublicInstance()}},{"./control-icons":1,"./shadow-viewport":2,"./svg-utilities":5,"./uniwheel":6,"./utilities":7}],5:[function(t,e,o){var l=t("./utilities"),s="unknown";document.documentMode&&(s="ie"),e.exports={svgNS:"http://www.w3.org/2000/svg",xmlNS:"http://www.w3.org/XML/1998/namespace",xmlnsNS:"http://www.w3.org/2000/xmlns/",xlinkNS:"http://www.w3.org/1999/xlink",evNS:"http://www.w3.org/2001/xml-events",getBoundingClientRectNormalized:function(t){if(t.clientWidth&&t.clientHeight)return{width:t.clientWidth,height:t.clientHeight};if(t.getBoundingClientRect())return t.getBoundingClientRect();throw new Error("Cannot get BoundingClientRect for SVG.")},getOrCreateViewport:function(t,e){var o=null;if(!(o=l.isElement(e)?e:t.querySelector(e))){var n=Array.prototype.slice.call(t.childNodes||t.children).filter(function(t){return"defs"!==t.nodeName&&"#text"!==t.nodeName});1===n.length&&"g"===n[0].nodeName&&null===n[0].getAttribute("transform")&&(o=n[0])}if(!o){var i="viewport-"+(new Date).toISOString().replace(/\D/g,"");(o=document.createElementNS(this.svgNS,"g")).setAttribute("id",i);var s=t.childNodes||t.children;if(s&&00)if(a.tHead&&a.tHead.rows.length>0){for(e=0;e0&&n.push(m),o++;if(!n)return}for(o=0;o2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;ln?1:or)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0 -;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v},function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o=r&&nt.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)},e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n=e&&r=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s=i.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&t0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;ithis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||Mt.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.lefte.x&&t.tope.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;hdocument.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")},n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(ns&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&othis.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) -;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))},n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.heighti.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop0&&this.current.milliseconds()0&&this.current.seconds()0&&this.current.minutes()0&&this.current.hours()0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"+r.format("dddd").toLowerCase():""), -h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width},o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o0)for(var u=0;u0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;t.subgroups[e].items.forEach(function(t){new Date(t.data.start)new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o0)for(var l=0;lh}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;lh})}var p={},f=0;for(l=0;l0)for(var v=0;v=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;st.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?i-1:0),n=1;n2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?""+t+":":t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;ss&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;nvar options = "+(0,s.default)(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;ethis.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}},{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.shape.boundingBox.left&&(s=e.shape.boundingBox.left),re.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.x&&(s=e.x),re.y&&(o=e.y),nh;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(tthis.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;ar&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())}, -o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal;var t=this.cameraRotation.x,e=this.cameraRotation.z,i=this.cameraOffset.x,o=this.cameraOffset.y,n=Math.sin,s=Math.cos;this.cameraLocation.x=this.cameraLocation.x+i*s(e)+o*-n(e)*s(t),this.cameraLocation.y=this.cameraLocation.y+i*n(e)+o*s(e)*s(t),this.cameraLocation.z=this.cameraLocation.z+o*n(t)},t.exports=o},function(t,e,i){function o(t,e,i){this.dataGroup=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=t.getDistinctValues(this.column),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(12);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){if(void 0!==this.index)return this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.dataGroup.getDataSet(),{filter:function(t){return t[i.column]==i.value}}).get();e=this.dataGroup._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");this.index=t,this.value=this.values[t]},o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0){var n=i.groupsData.getDataSet();n.get().forEach(function(t){if(t.nestedGroups){0!=t.showNested&&(t.showNested=!0);var e=[];t.nestedGroups.forEach(function(i){var o=n.get(i);o&&(o.nestedInGroup=t.id,0==t.showNested&&(o.visible=!1),e=e.concat(o))}),n.update(e,o)}})}},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.popup=null,this.touchParams={},this.groupTouchParams={},this._create(),this.setOptions(e)}var s=i(29),r=o(s),a=i(6),h=o(a),d=i(10),l=i(2),u=i(11),c=i(12),p=i(66),f=i(16),m=i(68),v=i(69),g=i(101),y=i(102),b=i(70),_=i(103),w=i(104).default,x="__ungrouped__",k="__background__";n.prototype=new f,n.types={background:_,box:g,range:b,point:y},n.prototype._create=function(){var t=document.createElement("div");t.className="vis-itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="vis-background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="vis-foreground",t.appendChild(i),this.dom.foreground=i;var o=document.createElement("div");o.className="vis-axis",this.dom.axis=o;var n=document.createElement("div");n.className="vis-labelset",this.dom.labelSet=n,this._updateUngrouped();var s=new v(k,null,this);s.show(),this.groups[k]=s,this.hammer=new d(this.body.dom.centerContainer),this.hammer.on("hammer.input",function(t){t.isFirst&&this._onTouch(t)}.bind(this)),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:d.DIRECTION_HORIZONTAL}),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("press",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.options.rtl?this.groupHammer=new d(this.body.dom.rightContainer):this.groupHammer=new d(this.body.dom.leftContainer),this.groupHammer.on("tap",this._onGroupClick.bind(this)),this.groupHammer.on("panstart",this._onGroupDragStart.bind(this)),this.groupHammer.on("panmove",this._onGroupDrag.bind(this)),this.groupHammer.on("panend",this._onGroupDragEnd.bind(this)),this.groupHammer.get("pan").set({threshold:5,direction:d.DIRECTION_VERTICAL}),this.body.dom.centerContainer.addEventListener("mouseover",this._onMouseOver.bind(this)),this.body.dom.centerContainer.addEventListener("mouseout",this._onMouseOut.bind(this)),this.body.dom.centerContainer.addEventListener("mousemove",this._onMouseMove.bind(this)),this.body.dom.centerContainer.addEventListener("contextmenu",this._onDragEnd.bind(this)),this.body.dom.centerContainer.addEventListener("mousewheel",this._onMouseWheel.bind(this)),this.show()},n.prototype.setOptions=function(t){if(t){var e=["type","rtl","align","order","stack","stackSubgroups","selectable","multiselect","multiselectPerGroup","groupOrder","dataAttributes","template","groupTemplate","visibleFrameTemplate","hide","snap","groupOrderSwap","showTooltips","tooltip","tooltipOnItemUpdateTime"];l.selectiveExtend(e,this.options,t),"itemsAlwaysDraggable"in t&&("boolean"==typeof t.itemsAlwaysDraggable?(this.options.itemsAlwaysDraggable.item=t.itemsAlwaysDraggable,this.options.itemsAlwaysDraggable.range=!1):"object"===(0,h.default)(t.itemsAlwaysDraggable)&&(l.selectiveExtend(["item","range"],this.options.itemsAlwaysDraggable,t.itemsAlwaysDraggable),this.options.itemsAlwaysDraggable.item||(this.options.itemsAlwaysDraggable.range=!1))),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.item="top"===t.orientation?"top":"bottom":"object"===(0,h.default)(t.orientation)&&"item"in t.orientation&&(this.options.orientation.item=t.orientation.item)),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"===(0,h.default)(t.margin)&&(l.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"===(0,h.default)(t.margin.item)&&l.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable,this.options.editable.overrideItems=!1):"object"===(0,h.default)(t.editable)&&l.selectiveExtend(["updateTime","updateGroup","add","remove","overrideItems"],this.options.editable,t.editable)),"groupEditable"in t&&("boolean"==typeof t.groupEditable?(this.options.groupEditable.order=t.groupEditable,this.options.groupEditable.add=t.groupEditable,this.options.groupEditable.remove=t.groupEditable):"object"===(0,h.default)(t.groupEditable)&&l.selectiveExtend(["order","add","remove"],this.options.groupEditable,t.groupEditable));["onDropObjectOnItem","onAdd","onUpdate","onRemove","onMove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup"].forEach(function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this)),this.markDirty()}},n.prototype.markDirty=function(t){this.groupIds=[],t&&t.refreshItems&&l.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()})},n.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},n.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},n.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||(this.options.rtl?this.body.dom.right.appendChild(this.dom.labelSet):this.body.dom.left.appendChild(this.dom.labelSet))},n.prototype.setSelection=function(t){var e,i,o,n;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;et&&o.push(h.id):h.lefte&&o.push(h.id)}return o},n.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;i0){for(var w={},x=0;x<_;x++)l.forEach(b,function(t,e){w[e]=t[x]()});l.forEach(this.groups,function(t,e){if(e!==k){var i=w[e];s=i||s,g+=t.height}}),g=Math.max(g,y)}return g=Math.max(g,y),r.style.height=i(g),this.props.width=r.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.options.rtl?this.dom.axis.style.right="0":this.dom.axis.style.left="0",this.initialItemSetDrawn=!0,s=this._isResized()||s},n.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t];return this.groups[e]||this.groups[x]||null},n.prototype._updateUngrouped=function(){var t,e,i=this.groups[x];if(this.groupsData){if(i){i.hide(),delete this.groups[x];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){i=new m(null,null,this),this.groups[x]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},n.prototype.getLabelSet=function(){return this.dom.labelSet},n.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(l.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;l.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},n.prototype.getItems=function(){return this.itemsData},n.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(l.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.groupsData;this.groupsData instanceof c&&(o=this.groupsData.getDataSet()),o.get().forEach(function(t){t.nestedGroups&&t.nestedGroups.forEach(function(e){var i=o.get(e);i.nestedInGroup=t.id,0==t.showNested&&(i.visible=!1),o.update(i)})});var n=this.id;l.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype.getGroups=function(){return this.groupsData},n.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},n.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},n.prototype._getGroupId=function(t){return"background"==this._getType(t)&&void 0==t.group?k:this.groupsData?t.group:x},n.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,o=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=o?e._getType(o):null,a=n.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,o):(i=s.selected,e._removeItem(s),s=null)),!s&&o){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(o,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onAdd=n.prototype._onUpdate,n.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.body.emitter.emit("_change",{queue:!0}))},n.prototype._order=function(){l.forEach(this.groups,function(t){t.order()})},n.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},n.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==x||t==k)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=(0,r.default)(e.options);l.extend(n,{height:null}),o=new m(t,i,e),e.groups[t]=o;for(var s in e.items)if(e.items.hasOwnProperty(s)){var a=e.items[s];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder});t=this._orderNestedGroups(t);var e=!l.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},n.prototype._orderNestedGroups=function(t){var e=[];return t.forEach(function(t){var i=this.groupsData.get(t);if(i.nestedInGroup||e.push(t),i.nestedGroups){var o=this.groupsData.get({filter:function(e){return e.nestedInGroup==t},order:this.options.groupOrder}),n=o.map(function(t){return t.id});e=e.concat(n)}},this),e},n.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i?i&&i.data&&i.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1,i&&i.add(t)},n.prototype._updateItem=function(t,e){t.setData(e);var i=this._getGroupId(t.data),o=this.groups[i];o?o&&o.data&&o.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1},n.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},n.prototype._constructByEndArray=function(t){for(var e=[],i=0;in)return}}if(i&&i!=this.groupTouchParams.group){var a=e.get(i.groupId),h=e.get(this.groupTouchParams.group.groupId);h&&a&&(this.options.groupOrderSwap(h,a,e),e.update(h),e.update(a));var d=e.getIds({order:this.options.groupOrder});if(!l.equalArray(d,this.groupTouchParams.originalOrder))for(var u=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(u.length,d.length),m=0,v=0,g=0;m=f)break;if(d[m+v]==p)v=1;else if(u[m+g]==p)g=1;else{var y=d.indexOf(u[m+g]),b=e.get(d[m+v]),_=e.get(u[m+g]);this.options.groupOrderSwap(b,_,e),e.update(b),e.update(_);var w=d[m+v];d[m+v]=u[m+g],d[y]=w,m++}}}}},n.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=l.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!l.equalArray(n,e.groupTouchParams.originalOrder))for(var s=e.groupTouchParams.originalOrder,r=Math.min(s.length,n.length),a=0;a=r)break;var h=n.indexOf(s[a]),d=o.get(n[a]),u=o.get(s[a]);e.options.groupOrderSwap(d,u,o),o.update(d),o.update(u);var c=n[a];n[a]=s[a],n[h]=c,a++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},n.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},n.prototype._onMouseOver=function(t){var e=this.itemFromTarget(t);if(e){if(e!==this.itemFromRelatedTarget(t)){var i=e.getTitle();if(this.options.showTooltips&&i){null==this.popup&&(this.popup=new w(this.body.dom.root,this.options.tooltip.overflowMethod||"flip")),this.popup.setText(i);var o=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(o)+o.offsetLeft,t.clientY-l.getAbsoluteTop(o)+o.offsetTop),this.popup.show()}else null!=this.popup&&this.popup.hide();this.body.emitter.emit("itemover",{item:e.id,event:t})}}},n.prototype._onMouseOut=function(t){var e=this.itemFromTarget(t);if(e){e!==this.itemFromRelatedTarget(t)&&(null!=this.popup&&this.popup.hide(),this.body.emitter.emit("itemout",{item:e.id,event:t}))}},n.prototype._onMouseMove=function(t){if(this.itemFromTarget(t)&&this.options.showTooltips&&this.options.tooltip.followMouse&&this.popup&&!this.popup.hidden){var e=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(e)+e.offsetLeft,t.clientY-l.getAbsoluteTop(e)+e.offsetTop),this.popup.show()}},n.prototype._onMouseWheel=function(t){this.touchParams.itemIsDragging&&this._onDragEnd(t)},n.prototype._onUpdateItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this;if(t){var i=e.itemsData.get(t.id);this.options.onUpdate(i,function(t){t&&e.itemsData.getDataSet().update(t)})}}},n.prototype._onDropObjectOnItem=function(t){var e=this.itemFromTarget(t),i=JSON.parse(t.dataTransfer.getData("text"));this.options.onDropObjectOnItem(i,e)},n.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e,i,o=this,n=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e);var s,r,a=this.body.util.toTime(i),h=this.body.util.getScale(),d=this.body.util.getStep();"drop"==t.type?(r=JSON.parse(t.dataTransfer.getData("text")),r.content=r.content?r.content:"new item",r.start=r.start?r.start:n?n(a,h,d):a,r.type=r.type||"box",r[this.itemsData._fieldId]=r.id||l.randomUUID(),"range"!=r.type||r.end||(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s)):(r={start:n?n(a,h,d):a,content:"new item"},r[this.itemsData._fieldId]=l.randomUUID(),"range"===this.options.type&&(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s));var u=this.groupFromTarget(t);u&&(r.group=u.groupId),r=this._cloneItemData(r),this.options.onAdd(r,function(e){e&&(o.itemsData.getDataSet().add(e),"drop"==t.type&&o.setSelection([e.id]))})}},n.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){ -var i=this.options.multiselect?this.getSelection():[];if((t.srcEvent&&t.srcEvent.shiftKey||!1)&&this.options.multiselect){var o=this.itemsData.get(e.id).group,s=void 0;this.options.multiselectPerGroup&&i.length>0&&(s=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=s&&s!=o||i.push(e.id);var r=n._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||s==o){i=[];for(var a in this.items)if(this.items.hasOwnProperty(a)){var h=this.items[a],d=h.data.start,l=void 0!==h.data.end?h.data.end:d;!(d>=r.min&&l<=r.max)||this.options.multiselectPerGroup&&s!=this.itemsData.get(h.id).group||h instanceof _||i.push(h.id)}}}else{var u=i.indexOf(e.id);-1==u?i.push(e.id):i.splice(u,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},n._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},n.prototype.itemFromElement=function(t){for(var e=t;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},n.prototype.itemFromTarget=function(t){return this.itemFromElement(t.target)},n.prototype.itemFromRelatedTarget=function(t){return this.itemFromElement(t.relatedTarget)},n.prototype.groupFromTarget=function(t){var e=t.center?t.center.y:t.clientY,i=this.groupIds;i.length<=0&&this.groupsData&&(i=this.groupsData.getIds({order:this.options.groupOrder}));for(var o=0;oa&&ea)return s}else if(0===o&&es&&(s=r.top+r.height)}while(a)}}o.height=s-o.top+.5*i.item.vertical},e.nostack=function(t,i,o,n){for(var s=0;so[r].index&&e.collisionByTimes(o[n],o[r])){s=o[r];break}null!=s&&(o[n].top=s.top+s.height)}while(s)}for(var a=0;ao[h].index&&(o[r].top+=o[h].height);for(var d=t[r],l=0;le.right&&t.top-i.vertical+.001e.top:t.left-i.horizontal+.001e.left&&t.top-i.vertical+.001e.top},e.collisionByTimes=function(t,e){return t.start<=e.start&&t.end>=e.start&&t.tope.top||e.start<=t.start&&e.end>=t.start&&e.topt.top}},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.options.align,i=this.width*t.getMillisecondsPerPixel();return"right"==e?this.data.start.getTime()>t.start&&this.data.start.getTime()-it.start&&this.data.start.getTime()t.start&&this.data.start.getTime()-i/2t.start&&this.data.startt.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.background;if(!t)throw new Error("Cannot redraw item: parent has no background container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var t=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");this.dom.box.className=this.baseClassName+t}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.content).overflow,{content:{width:this.dom.content.offsetWidth}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=0,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e,i=this.options.orientation.item;if(void 0!==this.data.subgroup){var o=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[o].height+"px",this.dom.box.style.top="top"==i?this.parent.top+this.parent.subgroups[o].top+"px":this.parent.top+this.parent.height-this.parent.subgroups[o].top-this.parent.subgroups[o].height+"px",this.dom.box.style.bottom=""}else this.parent instanceof s?(e=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.bottom="bottom"==i?"0":"",this.dom.box.style.top="top"==i?"0":""):(e=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=e+"px"},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i){(0,s.default)(this,t),this.container=e,this.overflowMethod=i||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}return(0,a.default)(t,[{key:"setPosition",value:function(t,e){this.x=parseInt(t),this.y=parseInt(e)}},{key:"setText",value:function(t){t instanceof Element?(this.frame.innerHTML="",this.frame.appendChild(t)):this.frame.innerHTML=t}},{key:"show",value:function(t){if(void 0===t&&(t=!0),!0===t){var e=this.frame.clientHeight,i=this.frame.clientWidth,o=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,s=0,r=0;if("flip"==this.overflowMethod){var a=!1,h=!0;this.y-en-this.padding&&(a=!0),s=a?this.x-i:this.x,r=h?this.y-e:this.y}else r=this.y-e,r+e+this.padding>o&&(r=o-e-this.padding),rn&&(s=n-i-this.padding),s0){var r={};for(this._getRelevantData(s,r,o,n),this._applySampling(s,r),e=0;e0)switch(t.options.style){case"line":d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(r[s[e]],t)),m.draw(d[s[e]],t,this.framework);case"point":case"points":"point"!=t.options.style&&"points"!=t.options.style&&1!=t.options.drawPoints.enabled||v.draw(r[s[e]],t,this.framework)}}}return a.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;at[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,t[a].y=0==o?t[a].orginalY+r.y:t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var n,s,a,h;if(t.length>0)for(s=0;s0)for(var o=0;o0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;l0){for(s=0;s0&&(n=this.groups[t[s]],!0===r.stack&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(o):h=h.concat(o):i[t[s]]=n.getYRange(o,t[s]));f.getStackedYRange(a,i,t,"__barStackLeft","left"),f.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;ui?i:a,d=di?i:h,l=l=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),!0===t.master&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var r=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(r=this.props.titleCharHeight);var h=!0===this.options.icons?Math.max(this.options.iconWidth,r)+this.options.labelOffsetX+15:r+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-h&&!0===this.options.visible?(this.width=this.maxLabelSize+h,this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+h),this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var s=a.getDOMElement("div",this.DOMelements.labels,this.dom.frame);s.className=o,s.innerHTML=e,"left"===i?(s.style.left="-"+this.options.labelOffsetX+"px",s.style.textAlign="right"):(s.style.right="-"+this.options.labelOffsetX+"px",s.style.textAlign="left"),s.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize6&&void 0!==arguments[6]&&arguments[6],a=arguments.length>7&&void 0!==arguments[7]&&arguments[7];if(this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.customLines=null,this.containerHeight=n,this.majorCharHeight=s,this._start=t,this._end=e,this.scale=1,this.minorStepIdx=-1,this.magnitudefactor=1,this.determineScale(),this.zeroAlign=r,this.autoScaleStart=i,this.autoScaleEnd=o,this.formattingFunction=a,i||o){var h=this,d=function(t){var e=t-t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx]);return t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx])>h.magnitudefactor*h.minorSteps[h.minorStepIdx]*.5?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}o.prototype.setCharHeight=function(t){this.majorCharHeight=t},o.prototype.setHeight=function(t){this.containerHeight=t},o.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=t>0?Math.round(Math.log(t)/Math.LN10):0;this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;i<0&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r=e){n=!0,this.minorStepIdx=r;break}}if(!0===n)break}},o.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])==0},o.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},o.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},o.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},o.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},o.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdxo+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&ue.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];r.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible||t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){i={svg:document.createElementNS("http://www.w3.org/2000/svg","svg"),svgElements:{},options:this.options,groups:[this]}}switch(void 0!=o&&null!=o||(o=0),void 0!=n&&null!=n||(n=.5*e),this.options.style){case"line":h.drawIcon(this,o,n,t,e,i);break;case"points":case"point":d.drawIcon(this,o,n,t,e,i);break;case"bar":a.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOrientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;ot[o].y?t[o].y:e,i=i0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t0?(o=t0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupIde[s].screen_y?e[s].screen_y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n0){return 1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o,n=e;if(i)for(o=t.length-2;o>0;o--)n+=t[o][0]+","+t[o][1]+" ";else for(o=1;o0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;i");this.dom.textArea.innerHTML=r,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=(0,s.default)(this.groups);t.sort(function(t,e){return t=0;i--){var a=s[i];a.nodes||(a.nodes=[]),-1===a.nodes.indexOf(n)&&a.nodes.push(n)}e.attr&&(n.attr=h(n.attr,e.attr))}function u(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=h({},t.edge);e.attr=h(i,e.attr)}}function c(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=h({},t.edge)),s.attr=h(s.attr||{},n),s}function p(){for(F=I.NULL,L="";" "===z||"\t"===z||"\n"===z||"\r"===z;)s();do{var t=!1;if("#"===z){for(var e=A-1;" "===R.charAt(e)||"\t"===R.charAt(e);)e--;if("\n"===R.charAt(e)||""===R.charAt(e)){for(;""!=z&&"\n"!=z;)s();t=!0}}if("/"===z&&"/"===r()){for(;""!=z&&"\n"!=z;)s();t=!0}if("/"===z&&"*"===r()){for(;""!=z;){if("*"===z&&"/"===r()){s(),s();break}s()}t=!0}for(;" "===z||"\t"===z||"\n"===z||"\r"===z;)s()}while(t);if(""===z)return void(F=I.DELIMITER);var i=z+r();if(N[i])return F=I.DELIMITER,L=i,s(),void s();if(N[z])return F=I.DELIMITER,L=z,void s();if(a(z)||"-"===z){for(L+=z,s();a(z);)L+=z,s();return"false"===L?L=!1:"true"===L?L=!0:isNaN(Number(L))||(L=Number(L)),void(F=I.IDENTIFIER)}if('"'===z){for(s();""!=z&&('"'!=z||'"'===z&&'"'===r());)'"'===z?(L+=z,s()):"\\"===z&&"n"===r()?(L+="\n",s()):L+=z,s();if('"'!=z)throw x('End of string " expected');return s(),void(F=I.IDENTIFIER)}for(F=I.UNKNOWN;""!=z;)L+=z,s();throw new SyntaxError('Syntax error in part "'+k(L,30)+'"')}function f(){var t={};if(n(),p(),"strict"===L&&(t.strict=!0,p()),"graph"!==L&&"digraph"!==L||(t.type=L,p()),F===I.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)v(t),";"===L&&p()}function v(t){var e=g(t);if(e)return void _(t,e);if(!y(t)){if(F!=I.IDENTIFIER)throw x("Identifier expected");var i=L;if(p(),"="===L){if(p(),F!=I.IDENTIFIER)throw x("Identifier expected");t[i]=L,p()}else b(t,i)}}function g(t){var e=null;if("subgraph"===L&&(e={},e.type="subgraph",p(),F===I.IDENTIFIER&&(e.id=L,p())),"{"===L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function y(t){return"node"===L?(p(),t.node=w(),"node"):"edge"===L?(p(),t.edge=w(),"edge"):"graph"===L?(p(),t.graph=w(),"graph"):null}function b(t,e){var i={id:e},o=w();o&&(i.attr=o),l(t,i),_(t,e)}function _(t,e){for(;"->"===L||"--"===L;){var i,o=L;p();var n=g(t);if(n)i=n;else{if(F!=I.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,l(t,{id:i}),p()}u(t,c(t,e,i,o,w())),e=i}}function w(){for(var t=null,e={dashed:!0,solid:!1,dotted:[1,5]};"["===L;){for(p(),t={};""!==L&&"]"!=L;){if(F!=I.IDENTIFIER)throw x("Attribute name expected");var i=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),F!=I.IDENTIFIER)throw x("Attribute value expected");var o=L;"style"===i&&(o=e[o]),d(t,i,o),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+k(L,30)+'" (char '+A+")")}function k(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r":!0,"--":!0},R="",A=0,z="",L="",F=I.NULL,B=/[a-zA-Z_0-9.:#]/;e.parseDOT=o,e.DOTToGraph=C},function(t,e,i){function o(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;a2&&void 0!==arguments[2]&&arguments[2];(0,d.default)(this,t),this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(i),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=o}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(this.elementOptions=t,this.initFontOptions(t.font),p.isValidLabel(t.label)?this.labelDirty=!0:t.label="",void 0!==t.font&&null!==t.font)if("string"==typeof t.font)this.baseSize=this.fontOptions.size;else if("object"===(0,a.default)(t.font)){var e=t.font.size;void 0!==e&&(this.baseSize=e)}}},{key:"initFontOptions",value:function(e){var i=this;if(c.forEach(m,function(t){i.fontOptions[t]={}}),t.parseFontString(this.fontOptions,e))return void(this.fontOptions.vadjust=0);c.forEach(e,function(t,e){void 0!==t&&null!==t&&"object"!==(void 0===t?"undefined":(0,a.default)(t))&&(i.fontOptions[e]=t)})}},{key:"constrain",value:function(t){var e={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=c.topMost(t,"widthConstraint");if("number"==typeof i)e.maxWdt=Number(i),e.minWdt=Number(i);else if("object"===(void 0===i?"undefined":(0,a.default)(i))){var o=c.topMost(t,["widthConstraint","maximum"]);"number"==typeof o&&(e.maxWdt=Number(o));var n=c.topMost(t,["widthConstraint","minimum"]);"number"==typeof n&&(e.minWdt=Number(n))}var s=c.topMost(t,"heightConstraint");if("number"==typeof s)e.minHgt=Number(s);else if("object"===(void 0===s?"undefined":(0,a.default)(s))){var r=c.topMost(t,["heightConstraint","minimum"]);"number"==typeof r&&(e.minHgt=Number(r));var h=c.topMost(t,["heightConstraint","valign"]);"string"==typeof h&&("top"!==h&&"bottom"!==h||(e.valign=h))}return e}},{key:"update",value:function(t,e){this.setOptions(t,!0),this.propagateFonts(e),c.deepExtend(this.fontOptions,this.constrain(e)),this.fontOptions.chooser=p.choosify("label",e)}},{key:"adjustSizes",value:function(t){var e=t?t.right+t.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=e,this.fontOptions.minWdt-=e);var i=t?t.top+t.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}},{key:"addFontOptionsToPile",value:function(t,e){for(var i=0;i5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0!==this.elementOptions.label){var r=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&r=this.elementOptions.scaling.label.maxVisible&&(r=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(t,o,n,e,i,s),this._drawBackground(t),this._drawText(t,e,this.size.yLine,s,r))}}},{key:"_drawBackground",value:function(t){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var e=this.getSize();t.fillRect(e.left,e.top,e.width,e.height)}}},{key:"_drawText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",n=arguments[4],r=this._setAlignment(t,e,i,o),a=(0,s.default)(r,2);e=a[0],i=a[1],t.textAlign="left",e-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(i-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(i+=(this.size.height-this.size.labelHeight)/2));for(var h=0;h0&&(t.lineWidth=c.strokeWidth,t.strokeStyle=v,t.lineJoin="round"),t.fillStyle=m,c.strokeWidth>0&&t.strokeText(c.text,e+l,i+c.vadjust),t.fillText(c.text,e+l,i+c.vadjust),l+=c.width}i+=d.height}}}},{key:"_setAlignment",value:function(t,e,i,o){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){e=0,i=0;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=4):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=4):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t,e,i){var o=t||"#000000",n=i||"#ffffff";if(e<=this.elementOptions.scaling.label.drawThreshold){var s=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-e)));o=c.overrideOpacity(o,s),n=c.overrideOpacity(n,s)}return[o,n]}},{key:"getTextSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(t,e,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:"getSize",value:function(){var t=this.size.left,e=this.size.top-1;if(this.isEdgeLabel){var i=.5*-this.size.width;switch(this.fontOptions.align){case"middle":t=i,e=.5*-this.size.height;break;case"top":t=i,e=-(this.size.height+2);break;case"bottom":t=i,e=2}}return{left:t,top:e,width:this.size.width,height:this.size.height}}},{key:"calculateLabelSize",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(t,e,i),this.size.left=o-.5*this.size.width,this.size.top=n-.5*this.size.height,this.size.yLine=n+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===s&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}},{key:"getFormattingValues",value:function(t,e,i,o){var n=function(t,e,i){return"normal"===e?"mod"===i?"":t[i]:void 0!==t[e][i]?t[e][i]:t[i]},s={color:n(this.fontOptions,o,"color"),size:n(this.fontOptions,o,"size"),face:n(this.fontOptions,o,"face"),mod:n(this.fontOptions,o,"mod"),vadjust:n(this.fontOptions,o,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(e||i)&&("normal"===o&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?s.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(s,this.elementOptions.id,e,i));var r="";return void 0!==s.mod&&""!==s.mod&&(r+=s.mod+" "),r+=s.size+"px "+s.face,t.font=r.replace(/"/g,""),s.font=t.font,s.height=s.size,s}},{key:"differentState",value:function(t,e){return t!==this.selectedState||e!==this.hoverState}},{key:"_processLabelText",value:function(t,e,i,o){return new f(t,this,e,i).process(o)}},{key:"_processLabel",value:function(t,e,i){if(!1!==this.labelDirty||this.differentState(e,i)){var o=this._processLabelText(t,e,i,this.elementOptions.label);this.fontOptions.minWdt>0&&o.width0&&o.heighto.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=0,d=this.options.selfReferenceSize,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=.5*(s+r);s<=r&&h<10&&(m=.5*(s+r),l=this._pointOnCircle(o,n,d,m),u=Math.atan2(t.y-l.y,t.x-l.x),c=t.distanceToBorder(e,u),p=Math.sqrt(Math.pow(l.x-t.x,2)+Math.pow(l.y-t.y,2)),f=c-p,!(Math.abs(f)<.05));)f>0?a>0?s=m:r=m:a>0?r=m:s=m,h++;return l.t=m,l}},{key:"getLineWidth",value:function(t,e){return!0===t?Math.max(this.selectionWidth,.3/this.body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i,o){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,r=void 0;return s=this.from.options.color.highlight.border,r=this.to.options.color.highlight.border,!1===this.from.selected&&!1===this.to.selected?(s=l.overrideOpacity(this.from.options.color.border,e.opacity),r=l.overrideOpacity(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?r=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,r),n}return"to"===e.inheritsColor?l.overrideOpacity(this.to.options.color.border,e.opacity):l.overrideOpacity(this.from.options.color.border,e.opacity)}return l.overrideOpacity(e.color,e.opacity)}},{key:"_circle", -value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t,e)}},{key:"getDistanceToEdge",value:function(t,e,i,o,n,r,a,h){var d=0;if(this.from!=this.to)d=this._getDistanceToEdge(t,e,i,o,n,r,a);else{var l=this._getCircleData(void 0),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2],m=c-n,v=p-r;d=Math.abs(Math.sqrt(m*m+v*v)-f)}return d}},{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:d<0&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,n,r){var a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=r.width;if("from"===e?(d=this.from,l=this.to,u=.1,c=r.fromArrowScale,p=r.fromArrowType):"to"===e?(d=this.to,l=this.from,u=-.1,c=r.toArrowScale,p=r.toArrowType):(d=this.to,l=this.from,c=r.middleArrowScale,p=r.middleArrowType),d!=l)if("middle"!==e)if(!0===this.options.smooth.enabled){h=this.findBorderPosition(d,t,{via:i});var m=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);a=Math.atan2(h.y-m.y,h.x-m.x)}else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.5,i);else{var v=this._getCircleData(t),g=(0,s.default)(v,3),y=g[0],b=g[1],_=g[2];"from"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),a=-2*h.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),a=-2*h.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(h=this._pointOnCircle(y,b,_,.175),a=3.9269908169872414)}"middle"===e&&c<0&&(f*=-1);var w=15*c+3*f;return{point:h,core:{x:h.x-.9*w*Math.cos(a),y:h.y-.9*w*Math.sin(a)},angle:a,length:w,type:p}}},{key:"drawArrowHead",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.fillStyle=t.strokeStyle,t.lineWidth=e.width,u.draw(t,n),this.enableShadow(t,e),t.fill(),this.disableShadow(t,e)}},{key:"enableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"transform",value:function(t,e){t instanceof Array||(t=[t]);for(var i=e.point.x,o=e.point.y,n=e.angle,s=e.length,r=0;r0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;s0&&this._getForceContributions(n.root,t)}}},{key:"_getForceContributions",value:function(t,e){this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?this._getForceContributions(t,e):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}},{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;h0&&(lr&&(r=l),ua&&(a=u))}var c=Math.abs(r-n)-Math.abs(a-s);c>0?(s-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var p=Math.max(1e-5,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var y=0;y0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.centerOfMass,o=t.mass+e.options.mass,n=1/o;i.x=i.x*t.mass+e.x*e.options.mass,i.x*=n,i.y=i.y*t.mass+e.y*e.options.mass,i.y*=n,t.mass=o;var s=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?o.maxY>e.y?"NW":"SW":o.maxY>e.y?"NE":"SE",this._placeInRegion(t,e,n)}},{key:"_placeInRegion",value:function(t,e,i){var o=t.children[i];switch(o.childrenCount){case 0:o.children.data=e,o.childrenCount=1,this._updateBranchMass(o,e);break;case 1:o.children.data.x===e.x&&o.children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(o),this._placeInTree(o,e));break;case 4:this._placeInTree(o,e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=void 0,o=void 0,n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=0;a=t.length?(this._t=void 0,n(1)):"keys"==e?n(0,i):"values"==e?n(0,t[i]):n(0,[i,t[i]])},"values"),s.Arguments=s.Array,o("keys"),o("values"),o("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var o=i(54),n=i(39),s=i(59),r={};i(26)(r,i(13)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=o(r,{next:n(1,i)}),s(t,e+" Iterator")}},function(t,e,i){var o=i(20),n=i(27),s=i(33);t.exports=i(21)?Object.defineProperties:function(t,e){n(t);for(var i,r=s(e),a=r.length,h=0;a>h;)o.f(t,i=r[h++],e[i]);return t}},function(t,e,i){var o=i(25),n=i(132),s=i(133);t.exports=function(t){return function(e,i,r){var a,h=o(e),d=n(h.length),l=s(r,d);if(t&&i!=i){for(;d>l;)if((a=h[l++])!=a)return!0}else for(;d>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var o=i(55),n=Math.min;t.exports=function(t){return t>0?n(o(t),9007199254740991):0}},function(t,e,i){var o=i(55),n=Math.max,s=Math.min;t.exports=function(t,e){return t=o(t),t<0?n(t+e,0):s(t,e)}},function(t,e,i){var o=i(18).document;t.exports=o&&o.documentElement},function(t,e,i){var o=i(55),n=i(51);t.exports=function(t){return function(e,i){var s,r,a=String(n(e)),h=o(i),d=a.length;return h<0||h>=d?t?"":void 0:(s=a.charCodeAt(h),s<55296||s>56319||h+1===d||(r=a.charCodeAt(h+1))<56320||r>57343?t?a.charAt(h):s:t?a.slice(h,h+2):r-56320+(s-55296<<10)+65536)}}},function(t,e,i){var o=i(27),n=i(137);t.exports=i(7).getIterator=function(t){var e=n(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return o(e.call(t))}},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).getIteratorMethod=function(t){if(void 0!=t)return t[n]||t["@@iterator"]||s[o(t)]}},function(t,e,i){i(139);var o=i(7).Object;t.exports=function(t,e){return o.create(t,e)}},function(t,e,i){var o=i(17);o(o.S,"Object",{create:i(54)})},function(t,e,i){i(141),t.exports=i(7).Object.keys},function(t,e,i){var o=i(41),n=i(33);i(87)("keys",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(143),__esModule:!0}},function(t,e,i){i(60),i(49),t.exports=i(61).f("iterator")},function(t,e,i){t.exports={default:i(145),__esModule:!0}},function(t,e,i){i(146),i(151),i(152),i(153),t.exports=i(7).Symbol},function(t,e,i){var o=i(18),n=i(22),s=i(21),r=i(17),a=i(83),h=i(147).KEY,d=i(28),l=i(57),u=i(59),c=i(40),p=i(13),f=i(61),m=i(62),v=i(148),g=i(149),y=i(27),b=i(25),_=i(53),w=i(39),x=i(54),k=i(150),S=i(89),D=i(20),M=i(33),C=S.f,O=D.f,E=k.f,T=o.Symbol,P=o.JSON,I=P&&P.stringify,N=p("_hidden"),R=p("toPrimitive"),A={}.propertyIsEnumerable,z=l("symbol-registry"),L=l("symbols"),F=l("op-symbols"),B=Object.prototype,j="function"==typeof T,H=o.QObject,W=!H||!H.prototype||!H.prototype.findChild,Y=s&&d(function(){return 7!=x(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,i){var o=C(B,e);o&&delete B[e],O(t,e,i),o&&t!==B&&O(B,e,o)}:O,G=function(t){var e=L[t]=x(T.prototype);return e._k=t,e},V=j&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},U=function(t,e,i){return t===B&&U(F,e,i),y(t),e=_(e,!0),y(i),n(L,e)?(i.enumerable?(n(t,N)&&t[N][e]&&(t[N][e]=!1),i=x(i,{enumerable:w(0,!1)})):(n(t,N)||O(t,N,w(1,{})),t[N][e]=!0),Y(t,e,i)):O(t,e,i)},q=function(t,e){y(t);for(var i,o=v(e=b(e)),n=0,s=o.length;s>n;)U(t,i=o[n++],e[i]);return t},X=function(t,e){return void 0===e?x(t):q(x(t),e)},Z=function(t){var e=A.call(this,t=_(t,!0));return!(this===B&&n(L,t)&&!n(F,t))&&(!(e||!n(this,t)||!n(L,t)||n(this,N)&&this[N][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==B||!n(L,e)||n(F,e)){var i=C(t,e);return!i||!n(L,e)||n(t,N)&&t[N][e]||(i.enumerable=!0),i}},J=function(t){for(var e,i=E(b(t)),o=[],s=0;i.length>s;)n(L,e=i[s++])||e==N||e==h||o.push(e);return o},$=function(t){for(var e,i=t===B,o=E(i?F:b(t)),s=[],r=0;o.length>r;)!n(L,e=o[r++])||i&&!n(B,e)||s.push(L[e]);return s};j||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=c(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(F,i),n(this,N)&&n(this[N],t)&&(this[N][t]=!1),Y(this,t,w(1,i))};return s&&W&&Y(B,t,{configurable:!0,set:e}),G(t)},a(T.prototype,"toString",function(){return this._k}),S.f=K,D.f=U,i(88).f=k.f=J,i(42).f=Z,i(63).f=$,s&&!i(52)&&a(B,"propertyIsEnumerable",Z,!0),f.f=function(t){return G(p(t))}),r(r.G+r.W+r.F*!j,{Symbol:T});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)p(Q[tt++]);for(var et=M(p.store),it=0;et.length>it;)m(et[it++]);r(r.S+r.F*!j,"Symbol",{for:function(t){return n(z,t+="")?z[t]:z[t]=T(t)},keyFor:function(t){if(!V(t))throw TypeError(t+" is not a symbol!");for(var e in z)if(z[e]===t)return e},useSetter:function(){W=!0},useSimple:function(){W=!1}}),r(r.S+r.F*!j,"Object",{create:X,defineProperty:U,defineProperties:q,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:$}),P&&r(r.S+r.F*(!j||d(function(){var t=T();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,i,o=[t],n=1;arguments.length>n;)o.push(arguments[n++]);return e=o[1],"function"==typeof e&&(i=e),!i&&g(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!V(e))return e}),o[1]=e,I.apply(P,o)}}}),T.prototype[R]||i(26)(T.prototype,R,T.prototype.valueOf),u(T,"Symbol"),u(Math,"Math",!0),u(o.JSON,"JSON",!0)},function(t,e,i){var o=i(40)("meta"),n=i(32),s=i(22),r=i(20).f,a=0,h=Object.isExtensible||function(){return!0},d=!i(28)(function(){return h(Object.preventExtensions({}))}),l=function(t){r(t,o,{value:{i:"O"+ ++a,w:{}}})},u=function(t,e){if(!n(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,o)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[o].i},c=function(t,e){if(!s(t,o)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[o].w},p=function(t){return d&&f.NEED&&h(t)&&!s(t,o)&&l(t),t},f=t.exports={KEY:o,NEED:!1,fastKey:u,getWeak:c,onFreeze:p}},function(t,e,i){var o=i(33),n=i(63),s=i(42);t.exports=function(t){var e=o(t),i=n.f;if(i)for(var r,a=i(t),h=s.f,d=0;a.length>d;)h.call(t,r=a[d++])&&e.push(r);return e}},function(t,e,i){var o=i(50);t.exports=Array.isArray||function(t){return"Array"==o(t)}},function(t,e,i){var o=i(25),n=i(88).f,s={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return n(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==s.call(t)?a(t):n(o(t))}},function(t,e){},function(t,e,i){i(62)("asyncIterator")},function(t,e,i){i(62)("observable")},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(0,function(){function e(){return Co.apply(null,arguments)}function i(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function n(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function s(t){return void 0===t}function r(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function a(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function h(t,e){var i,o=[];for(i=0;i0)for(i=0;i0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(eun)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n, -r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,zStep:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)},o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D=" "+this.xValueLabel(S)+" ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C=" "+this.yValueLabel(M)+" ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i"+this.xLabel+":"+t.point.x+""+this.yLabel+":"+t.point.y+""+this.zLabel+":"+t.point.z+"",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||1),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;os)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have field 'style' for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have field '"+this.colValue+"' for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.maxi)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o},function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanced+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||es)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;ci&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||oe)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)},0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") -;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;rr?r:t,e=null==e?r:e0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateValueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)},o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)},o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelöscht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"Átras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possível linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"Редактировать",del:"Удалить выбранное",back:"Назад",addNode:"Добавить узел",addEdge:"Добавить ребро",editNode:"Редактировать узел",editEdge:"Редактировать ребро",addDescription:"Кликните в свободное место, чтобы добавить новый узел.",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",createEdgeError:"Невозможно соединить ребра в кластер.",deleteClusterError:"Кластеры не могут быть удалены",editClusterError:"Кластеры недоступны для редактирования."},e.ru_RU=e.ru,e.cn={edit:"编辑",del:"删除选定",back:"返回",addNode:"添加节点",addEdge:"添加连接线",editNode:"编辑节点",editEdge:"编辑连接线",addDescription:"单击空白处放置新节点。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它们。",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",createEdgeError:"无法将连接线连接到群集。",deleteClusterError:"无法删除群集。",editClusterError:"无法编辑群集。"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i2){e*=.5;for(var r=0;e>2&&r=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){ -function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i0)for(var r=0;r0)for(var p=0;p0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position/.test(t.substr(i.position,3))?i.mono||i.ital||!//.test(t.substr(i.position,3))?!i.mono&&//.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/</.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.positionthis.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;tt&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)} -}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=nthis.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.xt?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}},{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;oo&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o=t&&i.push(n.id)}for(var s=0;s0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}},{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],n=[];for(var r in t)t.hasOwnProperty(r)&&void 0!==this.clusteredNodes[r]&&n.push(r);for(var a=0;ao?a.x:o,n=a.yr?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;ho&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio) -;this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s),this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0 -;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties";if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i0)for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s1)for(var h=0;h2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n0&&Math.abs(p)0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;ne&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._validatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-ot.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}},{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h0&&e-1 in t)}function q(t){return a.call(t,function(t){return null!=t})}function H(t){return t.length>0?r.fn.concat.apply([],t):t}function I(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function V(t){return t in l?l[t]:l[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function _(t,e){return"number"!=typeof e||h[I(t)]?e:e+"px"}function B(t){var e,n;return c[t]||(e=f.createElement(t),f.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),c[t]=n),c[t]}function U(t){return"children"in t?u.call(t.children):r.map(t.childNodes,function(t){return 1==t.nodeType?t:void 0})}function X(t,e){var n,r=t?t.length:0;for(n=0;r>n;n++)this[n]=t[n];this.length=r,this.selector=e||""}function J(t,r,i){for(n in r)i&&(Z(r[n])||L(r[n]))?(Z(r[n])&&!Z(t[n])&&(t[n]={}),L(r[n])&&!L(t[n])&&(t[n]=[]),J(t[n],r[n],i)):r[n]!==e&&(t[n]=r[n])}function W(t,e){return null==e?r(t):r(t).filter(e)}function Y(t,e,n,r){return F(e)?e.call(t,n,r):e}function G(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function K(t,n){var r=t.className||"",i=r&&r.baseVal!==e;return n===e?i?r.baseVal:r:void(i?r.baseVal=n:t.className=n)}function Q(t){try{return t?"true"==t||("false"==t?!1:"null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?r.parseJSON(t):t):t}catch(e){return t}}function tt(t,e){e(t);for(var n=0,r=t.childNodes.length;r>n;n++)tt(t.childNodes[n],e)}var e,n,r,i,O,P,o=[],s=o.concat,a=o.filter,u=o.slice,f=t.document,c={},l={},h={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},p=/^\s*<(\w+|!)[^>]*>/,d=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,m=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,g=/^(?:body|html)$/i,v=/([A-Z])/g,y=["val","css","html","text","data","width","height","offset"],x=["after","prepend","before","append"],b=f.createElement("table"),E=f.createElement("tr"),j={tr:f.createElement("tbody"),tbody:b,thead:b,tfoot:b,td:E,th:E,"*":f.createElement("div")},w=/complete|loaded|interactive/,T=/^[\w-]*$/,S={},C=S.toString,N={},A=f.createElement("div"),D={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},L=Array.isArray||function(t){return t instanceof Array};return N.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=A).appendChild(t),r=~N.qsa(i,e).indexOf(t),o&&A.removeChild(t),r},O=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},P=function(t){return a.call(t,function(e,n){return t.indexOf(e)==n})},N.fragment=function(t,n,i){var o,s,a;return d.test(t)&&(o=r(f.createElement(RegExp.$1))),o||(t.replace&&(t=t.replace(m,"<$1>")),n===e&&(n=p.test(t)&&RegExp.$1),n in j||(n="*"),a=j[n],a.innerHTML=""+t,o=r.each(u.call(a.childNodes),function(){a.removeChild(this)})),Z(i)&&(s=r(o),r.each(i,function(t,e){y.indexOf(t)>-1?s[t](e):s.attr(t,e)})),o},N.Z=function(t,e){return new X(t,e)},N.isZ=function(t){return t instanceof N.Z},N.init=function(t,n){var i;if(!t)return N.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&p.test(t))i=N.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}else{if(F(t))return r(f).ready(t);if(N.isZ(t))return t;if(L(t))i=q(t);else if(R(t))i=[t],t=null;else if(p.test(t))i=N.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}}return N.Z(i,t)},r=function(t,e){return N.init(t,e)},r.extend=function(t){var e,n=u.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){J(t,n,e)}),t},N.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,s=T.test(o);return t.getElementById&&s&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:u.call(s&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},r.contains=f.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},r.type=$,r.isFunction=F,r.isWindow=k,r.isArray=L,r.isPlainObject=Z,r.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},r.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},r.inArray=function(t,e,n){return o.indexOf.call(e,t,n)},r.camelCase=O,r.trim=function(t){return null==t?"":String.prototype.trim.call(t)},r.uuid=0,r.support={},r.expr={},r.noop=function(){},r.map=function(t,e){var n,i,o,r=[];if(z(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return o.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return F(t)?this.not(this.not(t)):r(a.call(this,function(e){return N.matches(e,t)}))},add:function(t,e){return r(P(this.concat(r(t,e))))},is:function(t){return this.length>0&&N.matches(this[0],t)},not:function(t){var n=[];if(F(t)&&t.call!==e)this.each(function(e){t.call(this,e)||n.push(this)});else{var i="string"==typeof t?this.filter(t):z(t)&&F(t.item)?u.call(t):r(t);this.forEach(function(t){i.indexOf(t)<0&&n.push(t)})}return r(n)},has:function(t){return this.filter(function(){return R(t)?r.contains(this,t):r(this).find(t).size()})},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!R(t)?t:r(t)},last:function(){var t=this[this.length-1];return t&&!R(t)?t:r(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?r(t).filter(function(){var t=this;return o.some.call(n,function(e){return r.contains(e,t)})}):1==this.length?r(N.qsa(this[0],t)):this.map(function(){return N.qsa(this,t)}):r()},closest:function(t,e){var n=[],i="object"==typeof t&&r(t);return this.each(function(r,o){for(;o&&!(i?i.indexOf(o)>=0:N.matches(o,t));)o=o!==e&&!M(o)&&o.parentNode;o&&n.indexOf(o)<0&&n.push(o)}),r(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=r.map(n,function(t){return(t=t.parentNode)&&!M(t)&&e.indexOf(t)<0?(e.push(t),t):void 0});return W(e,t)},parent:function(t){return W(P(this.pluck("parentNode")),t)},children:function(t){return W(this.map(function(){return U(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||u.call(this.childNodes)})},siblings:function(t){return W(this.map(function(t,e){return a.call(U(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return r.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=B(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=F(t);if(this[0]&&!e)var n=r(t).get(0),i=n.parentNode||this.length>1;return this.each(function(o){r(this).wrapAll(e?t.call(this,o):i?n.cloneNode(!0):n)})},wrapAll:function(t){if(this[0]){r(this[0]).before(t=r(t));for(var e;(e=t.children()).length;)t=e.first();r(t).append(this)}return this},wrapInner:function(t){var e=F(t);return this.each(function(n){var i=r(this),o=i.contents(),s=e?t.call(this,n):t;o.length?o.wrapAll(s):i.append(s)})},unwrap:function(){return this.parent().each(function(){r(this).replaceWith(r(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var n=r(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()})},prev:function(t){return r(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return r(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;r(this).empty().append(Y(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=Y(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,r){var i;return"string"!=typeof t||1 in arguments?this.each(function(e){if(1===this.nodeType)if(R(t))for(n in t)G(this,n,t[n]);else G(this,t,Y(this,r,e,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(i=this[0].getAttribute(t))?i:e},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){G(this,t)},this)})},prop:function(t,e){return t=D[t]||t,1 in arguments?this.each(function(n){this[t]=Y(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=D[t]||t,this.each(function(){delete this[t]})},data:function(t,n){var r="data-"+t.replace(v,"-$1").toLowerCase(),i=1 in arguments?this.attr(r,n):this.attr(r);return null!==i?Q(i):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=Y(this,t,e,this.value)})):this[0]&&(this[0].multiple?r(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each(function(t){var n=r(this),i=Y(this,e,t,n.offset()),o=n.offsetParent().offset(),s={top:i.top-o.top,left:i.left-o.left};"static"==n.css("position")&&(s.position="relative"),n.css(s)});if(!this.length)return null;if(f.documentElement!==this[0]&&!r.contains(f.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var i=this[0];if("string"==typeof t){if(!i)return;return i.style[O(t)]||getComputedStyle(i,"").getPropertyValue(t)}if(L(t)){if(!i)return;var o={},s=getComputedStyle(i,"");return r.each(t,function(t,e){o[e]=i.style[O(e)]||s.getPropertyValue(e)}),o}}var a="";if("string"==$(t))e||0===e?a=I(t)+":"+_(t,e):this.each(function(){this.style.removeProperty(I(t))});else for(n in t)t[n]||0===t[n]?a+=I(n)+":"+_(n,t[n])+";":this.each(function(){this.style.removeProperty(I(n))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(r(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return t?o.some.call(this,function(t){return this.test(K(t))},V(t)):!1},addClass:function(t){return t?this.each(function(e){if("className"in this){i=[];var n=K(this),o=Y(this,t,e,n);o.split(/\s+/g).forEach(function(t){r(this).hasClass(t)||i.push(t)},this),i.length&&K(this,n+(n?" ":"")+i.join(" "))}}):this},removeClass:function(t){return this.each(function(n){if("className"in this){if(t===e)return K(this,"");i=K(this),Y(this,t,n,i).split(/\s+/g).forEach(function(t){i=i.replace(V(t)," ")}),K(this,i.trim())}})},toggleClass:function(t,n){return t?this.each(function(i){var o=r(this),s=Y(this,t,i,K(this));s.split(/\s+/g).forEach(function(t){(n===e?!o.hasClass(t):n)?o.addClass(t):o.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),i=g.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(r(t).css("margin-top"))||0,n.left-=parseFloat(r(t).css("margin-left"))||0,i.top+=parseFloat(r(e[0]).css("border-top-width"))||0,i.left+=parseFloat(r(e[0]).css("border-left-width"))||0,{top:n.top-i.top,left:n.left-i.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||f.body;t&&!g.test(t.nodeName)&&"static"==r(t).css("position");)t=t.offsetParent;return t})}},r.fn.detach=r.fn.remove,["width","height"].forEach(function(t){var n=t.replace(/./,function(t){return t[0].toUpperCase()});r.fn[t]=function(i){var o,s=this[0];return i===e?k(s)?s["inner"+n]:M(s)?s.documentElement["scroll"+n]:(o=this.offset())&&o[t]:this.each(function(e){s=r(this),s.css(t,Y(this,i,e,s[t]()))})}}),x.forEach(function(n,i){var o=i%2;r.fn[n]=function(){var n,a,s=r.map(arguments,function(t){var i=[];return n=$(t),"array"==n?(t.forEach(function(t){return t.nodeType!==e?i.push(t):r.zepto.isZ(t)?i=i.concat(t.get()):void(i=i.concat(N.fragment(t)))}),i):"object"==n||null==t?t:N.fragment(t)}),u=this.length>1;return s.length<1?this:this.each(function(e,n){a=o?n:n.parentNode,n=0==i?n.nextSibling:1==i?n.firstChild:2==i?n:null;var c=r.contains(f.documentElement,a);s.forEach(function(e){if(u)e=e.cloneNode(!0);else if(!a)return r(e).remove();a.insertBefore(e,n),c&&tt(e,function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}})})})},r.fn[o?n+"To":"insert"+(i?"Before":"After")]=function(t){return r(t)[n](this),this}}),N.Z.prototype=X.prototype=r.fn,N.uniq=P,N.deserializeValue=Q,r.zepto=N,r}();return t.Zepto=e,void 0===t.$&&(t.$=e),function(e){function h(t){return t._zid||(t._zid=n++)}function p(t,e,n,r){if(e=d(e),e.ns)var i=m(e.ns);return(a[h(t)]||[]).filter(function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||i.test(t.ns))&&(!n||h(t.fn)===h(n))&&(!r||t.sel==r)})}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function m(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function g(t,e){return t.del&&!f&&t.e in c||!!e}function v(t){return l[t]||f&&c[t]||t}function y(t,n,i,o,s,u,f){var c=h(t),p=a[c]||(a[c]=[]);n.split(/\s/).forEach(function(n){if("ready"==n)return e(document).ready(i);var a=d(n);a.fn=i,a.sel=s,a.e in l&&(i=function(t){var n=t.relatedTarget;return!n||n!==this&&!e.contains(this,n)?a.fn.apply(this,arguments):void 0}),a.del=u;var c=u||i;a.proxy=function(e){if(e=T(e),!e.isImmediatePropagationStopped()){e.data=o;var n=c.apply(t,e._args==r?[e]:[e].concat(e._args));return n===!1&&(e.preventDefault(),e.stopPropagation()),n}},a.i=p.length,p.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,g(a,f))})}function x(t,e,n,r,i){var o=h(t);(e||"").split(/\s/).forEach(function(e){p(t,e,n,r).forEach(function(e){delete a[o][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,g(e,i))})})}function T(t,n){return(n||!t.isDefaultPrevented)&&(n||(n=t),e.each(w,function(e,r){var i=n[e];t[e]=function(){return this[r]=b,i&&i.apply(n,arguments)},t[r]=E}),t.timeStamp||(t.timeStamp=Date.now()),(n.defaultPrevented!==r?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(t.isDefaultPrevented=b)),t}function S(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===r||(n[e]=t[e]);return T(n,t)}var r,n=1,i=Array.prototype.slice,o=e.isFunction,s=function(t){return"string"==typeof t},a={},u={},f="onfocusin"in t,c={focus:"focusin",blur:"focusout"},l={mouseenter:"mouseover",mouseleave:"mouseout"};u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:x},e.proxy=function(t,n){var r=2 in arguments&&i.call(arguments,2);if(o(t)){var a=function(){return t.apply(n,r?r.concat(i.call(arguments)):arguments)};return a._zid=h(t),a}if(s(n))return r?(r.unshift(t[n],t),e.proxy.apply(null,r)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var b=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,w={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,n,a,u,f){var c,l,h=this;return t&&!s(t)?(e.each(t,function(t,e){h.on(t,n,a,e,f)}),h):(s(n)||o(u)||u===!1||(u=a,a=n,n=r),(u===r||a===!1)&&(u=a,a=r),u===!1&&(u=E),h.each(function(r,o){f&&(c=function(t){return x(o,t.type,u),u.apply(this,arguments)}),n&&(l=function(t){var r,s=e(t.target).closest(n,o).get(0);return s&&s!==o?(r=e.extend(S(t),{currentTarget:s,liveFired:o}),(c||u).apply(s,[r].concat(i.call(arguments,1)))):void 0}),y(o,t,u,a,n,l||c)}))},e.fn.off=function(t,n,i){var a=this;return t&&!s(t)?(e.each(t,function(t,e){a.off(t,n,e)}),a):(s(n)||o(i)||i===!1||(i=n,n=r),i===!1&&(i=E),a.each(function(){x(this,t,i,n)}))},e.fn.trigger=function(t,n){return t=s(t)||e.isPlainObject(t)?e.Event(t):T(t),t._args=n,this.each(function(){t.type in c&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)})},e.fn.triggerHandler=function(t,n){var r,i;return this.each(function(o,a){r=S(s(t)?e.Event(t):t),r._args=n,r.target=a,e.each(p(a,t.type||t),function(t,e){return i=e.proxy(r),r.isImmediatePropagationStopped()?!1:void 0})}),i},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}}),e.Event=function(t,e){s(t)||(e=t,t=e.type);var n=document.createEvent(u[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),T(n)}}(e),function(e){function p(t,n,r){var i=e.Event(n);return e(t).trigger(i,r),!i.isDefaultPrevented()}function d(t,e,n,i){return t.global?p(e||r,n,i):void 0}function m(t){t.global&&0===e.active++&&d(t,null,"ajaxStart")}function g(t){t.global&&!--e.active&&d(t,null,"ajaxStop")}function v(t,e){var n=e.context;return e.beforeSend.call(n,t,e)===!1||d(e,n,"ajaxBeforeSend",[t,e])===!1?!1:void d(e,n,"ajaxSend",[t,e])}function y(t,e,n,r){var i=n.context,o="success";n.success.call(i,t,o,e),r&&r.resolveWith(i,[t,o,e]),d(n,i,"ajaxSuccess",[e,n,t]),b(o,e,n)}function x(t,e,n,r,i){var o=r.context;r.error.call(o,n,e,t),i&&i.rejectWith(o,[n,e,t]),d(r,o,"ajaxError",[n,r,t||e]),b(e,n,r)}function b(t,e,n){var r=n.context;n.complete.call(r,e,t),d(n,r,"ajaxComplete",[e,n]),g(n)}function E(t,e,n){if(n.dataFilter==j)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function j(){}function w(t){return t&&(t=t.split(";",2)[0]),t&&(t==c?"html":t==f?"json":a.test(t)?"script":u.test(t)&&"xml")||"text"}function T(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function S(t){t.processData&&t.data&&"string"!=e.type(t.data)&&(t.data=e.param(t.data,t.traditional)),!t.data||t.type&&"GET"!=t.type.toUpperCase()&&"jsonp"!=t.dataType||(t.url=T(t.url,t.data),t.data=void 0)}function C(t,n,r,i){return e.isFunction(n)&&(i=r,r=n,n=void 0),e.isFunction(r)||(i=r,r=void 0),{url:t,data:n,success:r,dataType:i}}function O(t,n,r,i){var o,s=e.isArray(n),a=e.isPlainObject(n);e.each(n,function(n,u){o=e.type(u),i&&(n=r?i:i+"["+(a||"object"==o||"array"==o?n:"")+"]"),!i&&s?t.add(u.name,u.value):"array"==o||!r&&"object"==o?O(t,u,r,n):t.add(n,u)})}var i,o,n=+new Date,r=t.document,s=/)<[^<]*)*<\/script>/gi,a=/^(?:text|application)\/javascript/i,u=/^(?:text|application)\/xml/i,f="application/json",c="text/html",l=/^\s*$/,h=r.createElement("a");h.href=t.location.href,e.active=0,e.ajaxJSONP=function(i,o){if(!("type"in i))return e.ajax(i);var c,p,s=i.jsonpCallback,a=(e.isFunction(s)?s():s)||"Zepto"+n++,u=r.createElement("script"),f=t[a],l=function(t){e(u).triggerHandler("error",t||"abort")},h={abort:l};return o&&o.promise(h),e(u).on("load error",function(n,r){clearTimeout(p),e(u).off().remove(),"error"!=n.type&&c?y(c[0],h,i,o):x(null,r||"error",h,i,o),t[a]=f,c&&e.isFunction(f)&&f(c[0]),f=c=void 0}),v(h,i)===!1?(l("abort"),h):(t[a]=function(){c=arguments},u.src=i.url.replace(/\?(.+)=\?/,"?$1="+a),r.head.appendChild(u),i.timeout>0&&(p=setTimeout(function(){l("timeout")},i.timeout)),h)},e.ajaxSettings={type:"GET",beforeSend:j,success:j,error:j,complete:j,context:null,global:!0,xhr:function(){return new t.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:f,xml:"application/xml, text/xml",html:c,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:j},e.ajax=function(n){var u,f,s=e.extend({},n||{}),a=e.Deferred&&e.Deferred();for(i in e.ajaxSettings)void 0===s[i]&&(s[i]=e.ajaxSettings[i]);m(s),s.crossDomain||(u=r.createElement("a"),u.href=s.url,u.href=u.href,s.crossDomain=h.protocol+"//"+h.host!=u.protocol+"//"+u.host),s.url||(s.url=t.location.toString()),(f=s.url.indexOf("#"))>-1&&(s.url=s.url.slice(0,f)),S(s);var c=s.dataType,p=/\?.+=\?/.test(s.url);if(p&&(c="jsonp"),s.cache!==!1&&(n&&n.cache===!0||"script"!=c&&"jsonp"!=c)||(s.url=T(s.url,"_="+Date.now())),"jsonp"==c)return p||(s.url=T(s.url,s.jsonp?s.jsonp+"=?":s.jsonp===!1?"":"callback=?")),e.ajaxJSONP(s,a);var P,d=s.accepts[c],g={},b=function(t,e){g[t.toLowerCase()]=[t,e]},C=/^([\w-]+:)\/\//.test(s.url)?RegExp.$1:t.location.protocol,N=s.xhr(),O=N.setRequestHeader;if(a&&a.promise(N),s.crossDomain||b("X-Requested-With","XMLHttpRequest"),b("Accept",d||"*/*"),(d=s.mimeType||d)&&(d.indexOf(",")>-1&&(d=d.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(d)),(s.contentType||s.contentType!==!1&&s.data&&"GET"!=s.type.toUpperCase())&&b("Content-Type",s.contentType||"application/x-www-form-urlencoded"),s.headers)for(o in s.headers)b(o,s.headers[o]);if(N.setRequestHeader=b,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=j,clearTimeout(P);var t,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==C){if(c=c||w(s.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)t=N.response;else{t=N.responseText;try{t=E(t,c,s),"script"==c?(1,eval)(t):"xml"==c?t=N.responseXML:"json"==c&&(t=l.test(t)?null:e.parseJSON(t))}catch(r){n=r}if(n)return x(n,"parsererror",N,s,a)}y(t,N,s,a)}else x(N.statusText||null,N.status?"error":"abort",N,s,a)}},v(N,s)===!1)return N.abort(),x(null,"abort",N,s,a),N;var A="async"in s?s.async:!0;if(N.open(s.type,s.url,A,s.username,s.password),s.xhrFields)for(o in s.xhrFields)N[o]=s.xhrFields[o];for(o in g)O.apply(N,g[o]);return s.timeout>0&&(P=setTimeout(function(){N.onreadystatechange=j,N.abort(),x(null,"timeout",N,s,a)},s.timeout)),N.send(s.data?s.data:null),N},e.get=function(){return e.ajax(C.apply(null,arguments))},e.post=function(){var t=C.apply(null,arguments);return t.type="POST",e.ajax(t)},e.getJSON=function(){var t=C.apply(null,arguments);return t.dataType="json",e.ajax(t)},e.fn.load=function(t,n,r){if(!this.length)return this;var a,i=this,o=t.split(/\s/),u=C(t,n,r),f=u.success;return o.length>1&&(u.url=o[0],a=o[1]),u.success=function(t){i.html(a?e("
                                                                                                                                                                                ").html(t.replace(s,"")).find(a):t),f&&f.apply(i,arguments)},e.ajax(u),this};var N=encodeURIComponent;e.param=function(t,n){var r=[];return r.add=function(t,n){e.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(t)+"="+N(n))},O(r,t,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(e){var n=getComputedStyle;t.getComputedStyle=function(t,e){try{return n(t,e)}catch(r){return null}}}}(),e}); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc.js deleted file mode 100644 index 81075b80..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc.js +++ /dev/null @@ -1,423 +0,0 @@ -'use strict'; - -customElements.define('compodoc-menu', class extends HTMLElement { - constructor() { - super(); - this.isNormalMode = this.getAttribute('mode') === 'normal'; - } - - connectedCallback() { - this.render(this.isNormalMode); - } - - render(isNormalMode) { - let tp = lithtml.html(` - - `); - this.innerHTML = tp.strings; - } -}); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc_es5.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc_es5.js deleted file mode 100644 index fa9150a0..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu-wc_es5.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _wrapNativeSuper(t) { var r = "function" == typeof Map ? new Map() : void 0; return _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !_isNativeFunction(t)) return t; if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return _construct(t, arguments, _getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), _setPrototypeOf(Wrapper, t); }, _wrapNativeSuper(t); } -function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf("[native code]"); } catch (n) { return "function" == typeof t; } } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -customElements.define('compodoc-menu', /*#__PURE__*/function (_HTMLElement) { - function _class() { - var _this; - _classCallCheck(this, _class); - _this = _callSuper(this, _class); - _this.isNormalMode = _this.getAttribute('mode') === 'normal'; - return _this; - } - _inherits(_class, _HTMLElement); - return _createClass(_class, [{ - key: "connectedCallback", - value: function connectedCallback() { - this.render(this.isNormalMode); - } - }, { - key: "render", - value: function render(isNormalMode) { - var tp = lithtml.html("\n \n ")); - this.innerHTML = tp.strings; - } - }]); -}(/*#__PURE__*/_wrapNativeSuper(HTMLElement))); \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu.js deleted file mode 100644 index 9b6884af..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/menu.js +++ /dev/null @@ -1,269 +0,0 @@ -document.addEventListener('DOMContentLoaded', function () { - var menuCollapsed = false, - mobileMenu = document.getElementById('mobile-menu'); - - var localContextInUrl = ''; - - if (COMPODOC_CURRENT_PAGE_CONTEXT !== '') { - switch (COMPODOC_CURRENT_PAGE_CONTEXT) { - case 'additional-page': - localContextInUrl = 'additional-documentation'; - break; - case 'class': - localContextInUrl = 'classes'; - break; - case 'miscellaneous-functions': - case 'miscellaneous-variables': - case 'miscellaneous-typealiases': - case 'miscellaneous-enumerations': - localContextInUrl = 'miscellaneous'; - default: - break; - } - } - - function hasClass(el, cls) { - return el.className && new RegExp('(\\s|^)' + cls + '(\\s|$)').test(el.className); - } - - var processLink = function (link, url) { - if (url.charAt(0) !== '.') { - var prefix = ''; - switch (COMPODOC_CURRENT_PAGE_DEPTH) { - case 5: - prefix = '../../../../../'; - break; - case 4: - prefix = '../../../../'; - break; - case 3: - prefix = '../../../'; - break; - case 2: - prefix = '../../'; - break; - case 1: - prefix = '../'; - break; - case 0: - prefix = './'; - break; - } - link.setAttribute('href', prefix + url); - } - }; - - var processMenuLinks = function (links, dontAddClass) { - for (var i = 0; i < links.length; i++) { - var link = links[i]; - var linkHref = link.getAttribute('href'); - if (linkHref) { - var linkHrefFile = linkHref.substr(linkHref.lastIndexOf('/') + 1, linkHref.length); - if ( - linkHrefFile.toLowerCase() === COMPODOC_CURRENT_PAGE_URL.toLowerCase() && - link.innerHTML.indexOf('Getting started') == -1 && - !dontAddClass && - linkHref.toLowerCase().indexOf(localContextInUrl.toLowerCase()) !== -1 - ) { - link.classList.add('active'); - } - processLink(link, linkHref); - } - } - }; - var chapterLinks = document.querySelectorAll('[data-type="chapter-link"]'); - processMenuLinks(chapterLinks); - var entityLinks = document.querySelectorAll('[data-type="entity-link"]'); - processMenuLinks(entityLinks); - var indexLinks = document.querySelectorAll('[data-type="index-link"]'); - processMenuLinks(indexLinks, true); - var compodocLogos = document.querySelectorAll('[data-type="compodoc-logo"]'); - var customLogo = document.querySelectorAll('[data-type="custom-logo"]'); - var processLogos = function (entityLogos) { - for (var i = 0; i < entityLogos.length; i++) { - var entityLogo = entityLogos[i]; - if (entityLogo) { - var url = entityLogo.getAttribute('data-src'); - // Dark mode + logo - let isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; - if (isDarkMode && url.indexOf('compodoc') !== -1) { - url = 'images/compodoc-vectorise-inverted.png'; - } - if (url.charAt(0) !== '.') { - var prefix = ''; - switch (COMPODOC_CURRENT_PAGE_DEPTH) { - case 5: - prefix = '../../../../../'; - break; - case 4: - prefix = '../../../../'; - break; - case 3: - prefix = '../../../'; - break; - case 2: - prefix = '../../'; - break; - case 1: - prefix = '../'; - break; - case 0: - prefix = './'; - break; - } - entityLogo.src = prefix + url; - } - } - } - }; - processLogos(compodocLogos); - processLogos(customLogo); - - setTimeout(function () { - document.getElementById('btn-menu').addEventListener('click', function () { - if (menuCollapsed) { - mobileMenu.style.display = 'none'; - } else { - mobileMenu.style.display = 'block'; - document.getElementsByTagName('body')[0].style['overflow-y'] = 'hidden'; - } - menuCollapsed = !menuCollapsed; - }); - - /** - * Native bootstrap doesn't wait DOMContentLoaded event to start his job, re do it here - */ - var Collapses = document.querySelectorAll('[data-bs-toggle="collapse"]'); - for (var o = 0, cll = Collapses.length; o < cll; o++) { - var collapse = Collapses[o], - options = {}; - options.duration = collapse.getAttribute('data-duration'); - const targetId = collapse.getAttribute('data-bs-target'); - if (targetId !== '') { - options.parent = collapse; - const c = new BSN.Collapse(targetId, options); - } - } - - // collapse menu - var classnameMenuToggler = document.getElementsByClassName('menu-toggler'), - faAngleUpClass = 'ion-ios-arrow-up', - faAngleDownClass = 'ion-ios-arrow-down', - toggleItemMenu = function (e) { - var element = e.target, - parent = element.parentNode, - parentLink, - elementIconChild; - if (parent) { - if (!parent.classList.contains('linked')) { - e.preventDefault(); - } else { - parentLink = parent.parentNode; - if (parentLink && element.classList.contains('link-name')) { - parentLink.trigger('click'); - } - } - elementIconChild = parent.getElementsByClassName(faAngleUpClass)[0]; - if (!elementIconChild) { - elementIconChild = parent.getElementsByClassName(faAngleDownClass)[0]; - } - if (elementIconChild) { - if (elementIconChild.classList.contains(faAngleUpClass)) { - elementIconChild.classList.add(faAngleDownClass); - elementIconChild.classList.remove(faAngleUpClass); - } else { - elementIconChild.classList.add(faAngleUpClass); - elementIconChild.classList.remove(faAngleDownClass); - } - } - } - }; - - for (var i = 0; i < classnameMenuToggler.length; i++) { - classnameMenuToggler[i].addEventListener('click', toggleItemMenu, false); - } - - // Scroll to active link - var menus = document.querySelectorAll('.menu'), - i = 0, - len = menus.length, - activeMenu, - activeMenuClass, - activeLink; - - for (i; i < len; i++) { - if (getComputedStyle(menus[i]).display != 'none') { - activeMenu = menus[i]; - activeMenuClass = activeMenu.getAttribute('class').split(' ')[0]; - } - } - - if (activeMenu) { - activeLink = document.querySelector('.' + activeMenuClass + ' .active'); - if (activeLink) { - var linkType = activeLink.getAttribute('data-type'); - var linkContext = activeLink.getAttribute('data-context'); - if (linkType === 'entity-link') { - var parentLi = activeLink.parentNode, - parentUl, - parentChapterMenu; - if (parentLi) { - parentUl = parentLi.parentNode; - if (parentUl) { - parentChapterMenu = parentUl.parentNode; - if (parentChapterMenu) { - var toggler = parentChapterMenu.querySelector('.menu-toggler'), - elementIconChild = - toggler.getElementsByClassName(faAngleUpClass)[0]; - if (toggler && !elementIconChild) { - toggler.click(); - } - } - } - } - if (linkContext && linkContext === 'sub-entity') { - // Toggle also the master parent menu - var linkContextId = activeLink.getAttribute('data-context-id'); - var toggler = activeMenu.querySelector( - '.chapter.' + linkContextId + ' a .menu-toggler' - ); - if (toggler) { - toggler.click(); - } - if (linkContextId === 'additional') { - var mainToggler = activeMenu.querySelector( - '.chapter.' + linkContextId + ' div.menu-toggler' - ); - if (mainToggler) { - mainToggler.click(); - } - } - } - } else if (linkType === 'chapter-link') { - var linkContextId = activeLink.getAttribute('data-context-id'); - var toggler = activeLink.querySelector('.menu-toggler'); - if (toggler) { - toggler.click(); - } - if (linkContextId === 'additional') { - var mainToggler = activeMenu.querySelector( - '.chapter.' + linkContextId + ' div.menu-toggler' - ); - if (mainToggler) { - mainToggler.click(); - } - } - } - setTimeout(function () { - activeMenu.scrollTop = activeLink.offsetTop; - if ( - activeLink.innerHTML.toLowerCase().indexOf('readme') != -1 || - activeLink.innerHTML.toLowerCase().indexOf('overview') != -1 - ) { - activeMenu.scrollTop = 0; - } - }, 300); - } - } - }, 0); -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/routes.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/routes.js deleted file mode 100644 index 41691999..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/routes.js +++ /dev/null @@ -1,301 +0,0 @@ -document.addEventListener('DOMContentLoaded', function () { - function htmlEntities(str) { - return String(str) - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); - } - - function foundLazyModuleWithPath(path) { - //path is like app/customers/customers.module#CustomersModule - var split = path.split('#'), - lazyModulePath = split[0], - lazyModuleName = split[1]; - return lazyModuleName; - } - - function getBB(selection) { - selection.each(function (d) { - d.bbox = this.getBBox(); - }); - } - - var test_cases, test_case, test_case_num, engine; - - var tree = ROUTES_INDEX; - - function cleanStringChildren(obj) { - for (var property in obj) { - if (obj.hasOwnProperty(property)) { - if (property === 'children' && typeof obj[property] === 'object') { - for (var i = obj[property].length - 1; i >= 0; i--) { - if (typeof obj[property][i] === 'string') { - obj[property].splice(i, 1); - } - } - } - if (typeof obj[property] === 'object') { - cleanStringChildren(obj[property]); - } - } - } - } - cleanStringChildren(tree); - - engine = d3.layout.tree().setNodeSizes(true); - - engine.spacing(function (a, b) { - return a.parent == b.parent ? 0 : engine.rootXSize(); - }); - - engine.nodeSize(function (d) { - return [ - document.getElementById(d.id).getBBox()['height'] + 70, - document.getElementById(d.id).getBBox()['width'] + 30 - ]; - }); - - var nodes = d3.layout.hierarchy()(tree), - svg = d3.select('#body-routes').append('svg'), - svg_g = svg.append('g'), - svg_p = svg.append('g'), - last_id = 0, - node = svg_g - .selectAll('.node') - .data(nodes, function (d) { - return d.id || (d.id = ++last_id); - }) - .enter() - .append('g') - .attr('class', 'node'); - - svg.attr('id', 'main'); - - svg_g.attr('transform', 'translate(20,0)').attr('id', 'main-group'); - - svg_p.attr('transform', 'translate(20,0)').attr('id', 'paths'); - - var infos_group = node.append('g').attr({ - id: function (d) { - return d.id; - }, - dx: 0, - dy: 0 - }); - - //Node icon - infos_group - .append('text') - .attr('font-family', 'Ionicons') - .attr('y', 5) - .attr('x', 0) - .attr('class', function (d) { - return d.children || d._children ? 'icon has-children' : 'icon'; - }) - .attr('font-size', function (d) { - return '15px'; - }) - .text(function (d) { - return '\uf183'; - }); - - //node infos - infos_group - .append('svg:text') - .attr('x', function (d) { - return 0; - }) - .attr('y', function (d) { - return 10; - }) - .attr('dy', '.35em') - .attr('class', 'text') - .attr('text-anchor', function (d) { - return 'start'; - }) - .html(function (d) { - // if kind === module name + module - // if kind === component component + path - var _name = ''; - if (d.kind === 'module') { - if (d.module) { - _name += - '' + - d.module + - ''; - if (d.name) { - _name += '' + d.name + ''; - } - } else { - _name += '' + htmlEntities(d.name) + ''; - } - } else if (d.kind === 'component') { - _name += '' + d.path + ''; - _name += - '' + - d.component + - ''; - if (d.outlet) { - _name += '<outlet> : ' + d.outlet + ''; - } - } else { - _name += '/' + d.path + ''; - if (d.component) { - _name += - '' + - d.component + - ''; - } - if (d.loadChildren) { - var moduleName = foundLazyModuleWithPath(d.loadChildren); - _name += - '' + - moduleName + - ''; - } - if (d.canActivate) { - _name += '✓ canActivate'; - } - if (d.canDeactivate) { - _name += '×  canDeactivate'; - } - if (d.canActivateChild) { - _name += '✓ canActivateChild'; - } - if (d.canLoad) { - _name += '→ canLoad'; - } - if (d.redirectTo) { - _name += '→ ' + d.redirectTo + ''; - } - if (d.pathMatch) { - _name += '> ' + d.pathMatch + ''; - } - if (d.outlet) { - _name += '<outlet> : ' + d.outlet + ''; - } - } - return _name; - }) - .call(getBB); - - // - // Node lazy loaded ? - // - infos_group - .append('svg:text') - .attr('y', function (d) { - return 45; - }) - .attr('x', function (d) { - return -18; - }) - .attr('font-family', 'Ionicons') - .attr('class', function (d) { - return 'icon'; - }) - .attr('font-size', function (d) { - return '15px'; - }) - .text(function (d) { - var _text = ''; - if (d.loadChildren || d.loadComponent) { - _text = '\uf4c1'; - } - if (d.guarded) { - _text = '\uf1b0'; - } - return _text; - }); - - //Node text background - infos_group - .insert('rect', 'text') - .attr('width', function (d) { - return d.bbox.width; - }) - .attr('height', function (d) { - return d.bbox.height; - }) - .attr('y', function (d) { - return 15; - }) - .style('fill', 'white') - .style('fill-opacity', 0.75); - - nodes = engine.nodes(tree); - - function node_extents(n) { - return [n.x - n.x_size / 2, n.y, n.x + n.x_size / 2, n.y + n.y_size]; - } - var root_extents = node_extents(nodes[0]); - var xmin = root_extents[0], - ymin = root_extents[1], - xmax = root_extents[2], - ymax = root_extents[3], - area_sum = (xmax - xmin) * (ymax - ymin), - x_size_min = nodes[0].x_size, - y_size_min = nodes[0].y_size; - - nodes.slice(1).forEach(function (n) { - var ne = node_extents(n); - xmin = Math.min(xmin, ne[0]); - ymin = Math.min(ymin, ne[1]); - xmax = Math.max(xmax, ne[2]); - ymax = Math.max(ymax, ne[3]); - area_sum += (ne[2] - ne[0]) * (ne[3] - ne[1]); - x_size_min = Math.min(x_size_min, n.x_size); - y_size_min = Math.min(y_size_min, n.y_size); - }); - - var area_ave = area_sum / nodes.length; - var scale = 80 / Math.sqrt(area_ave); - - function svg_x(node_y) { - return node_y - ymin; - } - - function svg_y(node_x) { - return (node_x - xmin) * scale; - } - - var nodebox_right_margin = Math.min(x_size_min * scale, 10); - var nodebox_vertical_margin = Math.min(y_size_min * scale, 3); - - node.attr('transform', function (d) { - return 'translate(' + svg_x(d.y) + ',' + svg_y(d.x) + ')'; - }); - - var diagonal = d3.svg.diagonal().projection(function (d) { - return [svg_x(d.y), svg_y(d.x)]; - }); - - var links = engine.links(nodes); - var links = svg_p - .selectAll('.link') - .data(links) - .enter() - .append('path') - .attr('class', 'link') - .attr('d', diagonal); - - var _svg = document.getElementById('main'), - main_g = _svg.childNodes[0]; - - _svg.removeChild(main_g); - _svg.appendChild(main_g); - - svg.attr({ - width: document.getElementById('main-group').getBBox()['width'] + 30, - height: document.getElementById('main-group').getBBox()['height'] + 50 - }); -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/lunr.min.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/lunr.min.js deleted file mode 100644 index cdc94cd3..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/lunr.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ -!function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.3.9",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.utils.clone=function(e){if(null===e||void 0===e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search-lunr.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search-lunr.js deleted file mode 100644 index 24f483b4..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search-lunr.js +++ /dev/null @@ -1,65 +0,0 @@ -(function (compodoc) { - function LunrSearchEngine() { - this.index = undefined; - this.store = {}; - this.name = 'LunrSearchEngine'; - } - - LunrSearchEngine.prototype.init = function () { - var that = this, - d = new promise.Promise(); - - that.index = lunr.Index.load(COMPODOC_SEARCH_INDEX.index); - that.store = COMPODOC_SEARCH_INDEX.store; - d.done(); - - return d; - }; - - LunrSearchEngine.prototype.search = function (q, offset, length) { - var that = this, - results = [], - d = new promise.Promise(); - - if (this.index) { - results = this.index.search('*' + q + '*').map(function (result) { - var doc = that.store[result.ref]; - - return { - title: doc.title, - url: doc.url, - body: doc.summary || doc.body - }; - }); - } - - d.done({ - query: q, - results: length === 0 ? results : results.slice(0, length), - count: results.length - }); - - return d; - }; - - compodoc.addEventListener(compodoc.EVENTS.READY, function (event) { - var engine = new LunrSearchEngine(), - initialized = false; - - function query(q, offset, length) { - if (!initialized) throw new Error('Search has not been initialized'); - return engine.search(q, offset, length); - } - - compodoc.search = { - query: query - }; - - engine.init().then(function () { - initialized = true; - compodoc.dispatchEvent({ - type: compodoc.EVENTS.SEARCH_READY - }); - }); - }); -})(compodoc); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search.js deleted file mode 100644 index 5851086d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search.js +++ /dev/null @@ -1,273 +0,0 @@ -(function (compodoc) { - var usePushState = typeof history.pushState !== 'undefined', - // DOM Elements - $body = document.querySelector('body'), - $searchResults, - $searchInput, - $searchList, - $searchTitle, - $searchResultsCount, - $searchQuery, - $mainContainer, - $xsMenu; - - // Throttle search - function throttle(fn, wait) { - var timeout; - - return function () { - var ctx = this, - args = arguments; - if (!timeout) { - timeout = setTimeout(function () { - timeout = undefined; - fn.apply(ctx, args); - }, wait); - } - }; - } - - function displayResults(res) { - var noResults = res.count == 0; - var groups = {}; - if (noResults) { - $searchResults.classList.add('no-results'); - } else { - $searchResults.classList.remove('no-results'); - } - - // Clear old results - $searchList.innerText = ''; - - // Display title for research - $searchResultsCount.innerText = res.count; - $searchQuery.innerText = res.query; - - // Group result by context - res.results.forEach(function (res) { - var context = res.title.split(' - ')[0]; - if (typeof groups[context] === 'undefined') { - groups[context] = { - results: [res] - }; - } else { - groups[context].results.push(res); - } - }); - - var sortedGroups = Object.keys(groups).sort(); - - for (var i = 0; i < sortedGroups.length; i++) { - var property = sortedGroups[i]; - - var $li = document.createElement('li'); - $li.classList.add('search-results-group'); - var finalPropertyLabel = ''; - var propertyLabels = property.split('-'); - - if ( - propertyLabels.length === 2 && - propertyLabels[0] !== 'miscellaneous' && - propertyLabels[0] !== 'additional' - ) { - finalPropertyLabel = - propertyLabels[0].charAt(0).toUpperCase() + - propertyLabels[0].substring(1) + - ' - ' + - propertyLabels[1].charAt(0).toUpperCase() + - propertyLabels[1].substring(1) + - ' (' + - groups[property].results.length + - ')'; - } else if (propertyLabels[0] === 'additional') { - finalPropertyLabel = - 'Additional pages' + ' (' + groups[property].results.length + ')'; - } else { - finalPropertyLabel = - propertyLabels[0].charAt(0).toUpperCase() + - propertyLabels[0].substring(1) + - ' (' + - groups[property].results.length + - ')'; - } - var $groupTitle = document.createElement('h3'); - $groupTitle.innerText = finalPropertyLabel; - $li.appendChild($groupTitle); - - var $ulResults = document.createElement('ul'); - $ulResults.classList.add('search-results-list'); - - groups[property].results.forEach(function (res) { - var link = ''; - var $liResult = document.createElement('li'); - $liResult.classList.add('search-results-item'); - switch (COMPODOC_CURRENT_PAGE_DEPTH) { - case 0: - link = './'; - break; - case 1: - case 2: - case 3: - case 4: - case 5: - link = '../'.repeat(COMPODOC_CURRENT_PAGE_DEPTH); - break; - } - var finalResLabel = - res.title.split(' - ')[1].charAt(0).toUpperCase() + - res.title.split(' - ')[1].substring(1); - var $link = document.createElement('a'); - $link.innerText = finalResLabel; - $link.href = link + res.url; - $liResult.appendChild($link); - $ulResults.appendChild($liResult); - }); - $li.appendChild($ulResults); - - $searchList.appendChild($li); - } - } - - function launchSearch(q) { - $body.classList.add('with-search'); - - if ($xsMenu.style.display === 'block') { - $mainContainer.style.height = 'calc(100% - 100px)'; - $mainContainer.style.marginTop = '100px'; - } - - throttle( - compodoc.search.query(q, 0, MAX_SEARCH_RESULTS).then(function (results) { - displayResults(results); - }), - 1000 - ); - } - - function closeSearch() { - $body.classList.remove('with-search'); - if ($xsMenu.style.display === 'block') { - $mainContainer.style.height = 'calc(100% - 50px)'; - } - } - - function bindMenuButton() { - document.getElementById('btn-menu').addEventListener('click', function () { - if ($xsMenu.style.display === 'none') { - $body.classList.remove('with-search'); - $mainContainer.style.height = 'calc(100% - 50px)'; - } - $searchInputs.forEach((item, index) => { - item.value = ''; - }); - }); - } - - function bindSearch() { - // Bind DOM - $searchInputs = document.querySelectorAll('#book-search-input input'); - - $searchResults = document.querySelector('.search-results'); - $searchList = $searchResults.querySelector('.search-results-list'); - $searchTitle = $searchResults.querySelector('.search-results-title'); - $searchResultsCount = $searchTitle.querySelector('.search-results-count'); - $searchQuery = $searchTitle.querySelector('.search-query'); - $mainContainer = document.querySelector('.container-fluid'); - $xsMenu = document.querySelector('.xs-menu'); - - // Launch query based on input content - function handleUpdate(item) { - var q = item.value; - - if (q.length == 0) { - closeSearch(); - window.location.href = window.location.href.replace(window.location.search, ''); - } else { - launchSearch(q); - } - } - - // Detect true content change in search input - var propertyChangeUnbound = false; - - $searchInputs.forEach((item, index) => { - // HTML5 (IE9 & others) - item.addEventListener('input', function (e) { - handleUpdate(this); - }); - // Workaround for IE < 9 - item.addEventListener('propertychange', function (e) { - if (e.originalEvent.propertyName == 'value') { - handleUpdate(this); - } - }); - // Push to history on blur - item.addEventListener('blur', function (e) { - // Update history state - if (usePushState) { - var uri = updateQueryString('q', this.value); - if (this.value !== '') { - history.pushState({ path: uri }, null, uri); - } - } - }); - }); - } - - function launchSearchFromQueryString() { - var q = getParameterByName('q'); - if (q && q.length > 0) { - // Update search inputs - $searchInputs.forEach((item, index) => { - item.value = q; - }); - // Launch search - launchSearch(q); - } - } - - compodoc.addEventListener(compodoc.EVENTS.SEARCH_READY, function (event) { - bindSearch(); - - bindMenuButton(); - - launchSearchFromQueryString(); - }); - - function getParameterByName(name) { - var url = window.location.href; - name = name.replace(/[\[\]]/g, '\\$&'); - var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'), - results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, ' ')); - } - - function updateQueryString(key, value) { - value = encodeURIComponent(value); - - var url = window.location.href; - var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), - hash; - - if (re.test(url)) { - if (typeof value !== 'undefined' && value !== null) - return url.replace(re, '$1' + key + '=' + value + '$2$3'); - else { - hash = url.split('#'); - url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); - if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; - return url; - } - } else { - if (typeof value !== 'undefined' && value !== null) { - var separator = url.indexOf('?') !== -1 ? '&' : '?'; - hash = url.split('#'); - url = hash[0] + separator + key + '=' + value; - if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; - return url; - } else return url; - } - } -})(compodoc); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search_index.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search_index.js deleted file mode 100644 index 1663e510..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/search/search_index.js +++ /dev/null @@ -1,4 +0,0 @@ -var COMPODOC_SEARCH_INDEX = { - "index": {"version":"2.3.9","fields":["title","body"],"fieldVectors":[["title/directives/ActivitiesPanelBroadcastingActivityDirective.html",[0,0.005,1,1.744]],["body/directives/ActivitiesPanelBroadcastingActivityDirective.html",[0,0.006,1,1.874,2,0.543,3,0.099,4,0.075,5,0.063,6,0.04,7,3.992,8,3.992,9,0.358,10,6.701,11,1.045,12,1.757,13,1.814,14,3.352,15,2.594,16,0.751,17,1.438,18,2.018,19,1.757,20,1.465,21,0.909,22,1.757,23,0.942,24,3.992,25,0.679,26,1.024,27,0.011,28,0.765,29,1.344,30,0.935,31,0.525,32,0.561,33,1.085,34,2.079,35,1.65,36,4.547,37,0.909,38,1.36,39,6.085,40,2.508,41,4.199,42,2.427,43,3.665,44,2.782,45,3.12,46,6.428,47,2.998,48,1.601,49,2.43,50,3.252,51,3.252,52,2.502,53,1.293,54,2.045,55,3.091,56,2.829,57,3.122,58,2.43,59,2.227,60,4.547,61,4.547,62,0.007,63,0.007]],["title/components/ActivitiesPanelComponent.html",[15,1.804,25,0.632]],["body/components/ActivitiesPanelComponent.html",[1,1.617,2,0.657,3,0.054,4,0.041,5,0.034,6,0.042,9,0.197,10,2.189,11,0.573,13,2.194,15,2.345,16,0.308,21,0.499,23,0.599,25,0.372,27,0.01,28,0.42,31,0.288,32,1.086,33,1.574,34,1.14,35,2.498,53,1.092,55,1.469,62,0.005,63,0.005,64,1.988,65,2.494,66,1.988,67,1.838,68,1.718,69,2.494,70,2.487,71,1.063,72,1.393,73,1.393,74,1.183,75,2.494,76,1.619,77,1.183,78,1.838,79,1.459,80,1.988,81,3.887,82,3.906,83,3.404,84,3.905,85,3.715,86,2.704,87,2.27,88,3.905,89,1.719,90,4.086,91,4.086,92,1.838,93,2.704,94,1.619,95,1.838,96,1.838,97,1.719,98,1.988,99,1.838,100,1.719,101,1.988,102,1.988,103,1.719,104,1.838,105,1.719,106,1.617,107,1.838,108,1.619,109,1.838,110,1.619,111,1.14,112,1.063,113,1.14,114,0.445,115,1.183,116,1.183,117,0.995,118,1.731,119,1.1,120,1.534,121,1.229,122,2.189,123,1.617,124,2.609,125,1.183,126,1.719,127,2.609,128,1.1,129,2.618,130,1.183,131,1.028,132,1.183,133,1.14,134,1.861,135,1.1,136,0.963,137,1.14,138,1.183,139,1.063,140,1.063,141,1.066,142,1.183,143,1.063,144,0.78,145,1.14,146,0.963,147,1.183,148,0.78,149,1.183,150,1.183,151,1.028,152,1.183,153,1.14,154,1.183,155,0.963,156,1.183,157,1.028,158,1.183,159,1.028,160,1.183,161,1.028,162,1.183,163,1.028,164,1.183,165,1.028,166,1.183,167,0.995,168,1.183,169,1.028,170,1.183,171,1.028,172,1.183,173,1.028,174,1.183,175,1.028,176,1.183,177,1.028,178,1.183,179,1.028,180,1.183,181,1.028,182,1.183,183,1.028,184,1.183,185,1.028,186,1.183,187,1.028,188,1.14,189,1.183,190,0.995,191,1.183,192,1.028,193,1.183,194,1.028,195,1.183,196,1.028,197,1.14,198,1.183,199,1.028,200,1.14,201,1.183,202,1.028,203,1.14,204,1.183,205,1.028,206,1.183,207,1.028,208,1.183,209,1.028,210,1.14,211,1.183,212,0.995,213,1.183,214,1.028,215,1.183,216,1.028,217,1.183,218,1.028,219,1.14,220,1.183,221,1.028,222,1.14,223,1.183,224,1.028,225,1.14,226,1.183,227,0.995,228,1.183,229,1.028,230,1.14,231,1.183,232,1.028,233,1.14,234,1.183,235,1.028,236,1.14,237,1.183,238,1.028,239,1.14,240,1.183,241,1.028,242,1.14,243,1.183,244,1.028,245,1.14,246,1.183,247,1.028,248,1.14,249,1.183,250,1.028,251,1.14,252,1.183,253,1.028,254,1.14,255,1.183]],["title/directives/ActivitiesPanelDirective.html",[0,0.005,151,1.744]],["body/directives/ActivitiesPanelDirective.html",[0,0.004,2,0.395,3,0.072,4,0.054,5,0.046,6,0.05,9,0.261,16,0.713,17,0.782,23,0.408,25,0.727,26,0.819,27,0.011,31,0.382,32,0.601,35,2.661,37,0.661,38,1.088,40,2.623,48,1.165,52,1.13,53,0.916,54,0.924,59,1.48,62,0.006,63,0.006,68,1.828,117,1.32,151,1.364,256,1.569,257,1.63,258,4.866,259,2.148,260,2.638,261,2.439,262,3.477,263,3.136,264,2.717,265,1.696,266,2.439,267,2.397,268,2.91,269,2.844,270,1.63,271,1.63,272,2.397,273,1.63,274,2.308,275,1.278,276,1.569,277,1.46,278,1.569,279,1.63,280,1.768,281,2.904,282,2.148,283,2.439,284,2.439,285,2.28,286,2.148,287,2.439,288,2.439,289,1.63,290,1.569,291,1.63,292,1.41,293,1.63,294,2.46,295,2.844,296,1.513,297,1.513,298,1.513,299,1.569,300,1.63,301,1.63,302,1.63,303,1.63,304,1.569,305,2.397,306,2.397,307,2.147,308,2.623,309,1.828,310,2.28,311,1.63,312,1.63,313,2.397,314,2.074,315,2.844,316,3.136,317,2.397,318,1.63,319,1.63,320,1.63,321,2.844,322,1.63,323,1.63,324,1.63,325,1.513,326,1.63,327,1.569,328,1.63,329,1.63,330,2.639,331,1.63,332,1.63,333,1.46,334,1.63,335,1.63,336,1.63,337,1.63,338,1.822,339,2.397,340,1.63,341,2.397,342,1.165,343,1.513,344,1.63,345,1.63,346,1.63,347,1.569,348,3.88,349,1.63,350,2.28,351,2.28,352,1.935,353,2.638,354,2.034,355,2.148,356,2.28,357,4.386,358,2.034,359,3.549,360,3.549]],["title/directives/ActivitiesPanelRecordingActivityDirective.html",[0,0.005,123,1.744]],["body/directives/ActivitiesPanelRecordingActivityDirective.html",[0,0.006,2,0.543,3,0.099,4,0.075,5,0.063,6,0.04,7,3.992,8,3.992,9,0.358,11,1.045,12,1.757,14,3.352,15,2.594,16,0.751,17,1.438,18,2.018,19,1.757,20,1.465,21,0.909,22,1.757,23,0.942,24,3.992,25,0.679,26,1.024,27,0.011,28,0.765,29,1.344,30,0.935,31,0.525,32,0.561,33,1.085,35,1.65,37,0.909,38,1.36,40,2.508,41,4.199,42,2.427,43,3.665,44,2.782,45,3.12,47,2.998,48,1.601,49,2.43,50,3.252,51,3.252,52,2.502,53,1.293,54,2.045,55,3.091,56,2.829,57,3.122,58,2.43,59,2.227,62,0.007,63,0.007,70,1.702,122,6.701,123,1.874,153,2.079,361,4.547,362,6.085,363,6.428,364,4.547,365,4.547]],["title/interfaces/ActivitiesPanelStatusEvent.html",[114,0.755,366,3.119]],["body/interfaces/ActivitiesPanelStatusEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,366,4.929,367,2.284,368,4.111,369,3.294,370,4.34]],["title/directives/AdditionalPanelsDirective.html",[0,0.005,155,1.635]],["body/directives/AdditionalPanelsDirective.html",[0,0.005,2,0.336,3,0.061,4,0.046,5,0.039,6,0.046,9,0.222,16,0.532,17,0.665,23,0.348,25,0.644,26,0.726,27,0.011,31,0.325,32,0.532,48,0.991,55,1.614,59,1.311,62,0.005,63,0.005,68,1.917,139,1.838,141,0.765,155,1.088,256,1.335,257,1.387,260,2.245,262,1.335,263,1.387,265,1.443,266,2.076,268,3.052,269,2.581,270,1.387,271,1.387,272,2.124,273,1.387,274,2.045,275,1.088,276,1.335,277,1.242,278,1.335,279,1.387,280,2.304,282,2.799,283,2.076,284,2.076,285,1.94,286,1.828,287,2.076,288,2.076,289,1.387,290,1.335,291,1.387,292,1.2,293,1.387,294,2.233,295,2.581,296,1.287,297,1.287,298,1.287,299,1.335,300,1.387,301,1.387,302,1.387,303,1.387,304,1.335,305,2.124,306,2.124,307,1.902,308,2.954,309,1.686,311,1.387,312,1.387,313,2.124,314,1.838,315,2.581,316,2.892,317,2.124,318,1.387,319,1.387,320,1.387,321,2.581,322,1.387,323,1.387,324,1.387,325,1.971,326,1.387,327,1.335,328,1.387,329,1.387,330,2.395,331,1.387,332,1.387,333,1.242,334,1.387,335,1.387,336,1.387,337,1.387,338,1.614,339,2.124,340,1.387,341,2.124,342,0.991,343,1.287,344,1.387,345,1.387,346,1.387,347,1.335,349,1.387,371,4.177,372,2.245,373,2.816,374,2.8,375,4.361,376,1.443,377,1.443,378,3.437,379,4.177,380,3.178,381,2.076,382,3.178,383,2.076,384,2.816,385,2.472,386,4.311,387,3.61,388,2.076,389,4.311,390,1.828,391,2.816,392,5.239,393,5.239,394,2.472,395,2.472,396,2.245,397,2.472,398,2.472,399,2.472,400,1.647,401,1.518,402,1.572,403,1.572,404,2.816,405,2.472,406,4.311,407,3.784,408,2.799,409,2.686,410,2.245,411,2.816,412,2.522,413,2.304,414,1.731,415,2.472,416,2.816,417,2.472,418,2.816,419,2.816,420,2.816,421,4.311,422,4.311,423,2.816,424,2.245,425,2.816,426,2.816,427,2.8,428,1.572,429,1.647,430,1.572,431,1.505,432,1.647,433,1.572,434,1.647,435,2.076,436,2.816,437,2.076,438,1.088,439,1.94]],["title/components/AdminDashboardComponent.html",[25,0.632,128,1.867]],["body/components/AdminDashboardComponent.html",[1,0.952,2,0.629,3,0.05,4,0.038,5,0.032,6,0.04,13,0.921,15,0.984,16,0.285,21,0.462,23,0.569,27,0.011,28,0.389,30,0.475,31,0.266,32,1.08,33,1.567,34,1.056,35,1.673,53,0.914,62,0.005,63,0.005,68,1.06,70,1.726,71,0.984,74,1.095,77,1.095,79,1.351,81,3.081,82,2.7,83,2.324,84,3.239,85,3.081,87,1.8,88,3.239,95,1.702,96,2.721,99,1.702,106,0.952,111,2.408,112,0.984,113,1.056,114,0.412,115,1.095,116,1.095,117,0.921,118,1.628,119,1.019,120,1.42,121,1.138,123,0.952,124,2.498,125,1.095,126,1.591,127,2.498,128,2.034,129,2.847,130,1.095,131,0.952,132,1.095,133,1.056,134,1.75,135,1.019,136,0.892,137,1.056,138,1.095,139,0.984,140,0.984,141,1.002,142,1.095,143,0.984,144,0.722,145,1.056,146,0.892,147,1.095,148,0.722,149,1.095,150,1.095,151,0.952,152,1.095,153,1.056,154,1.095,155,0.892,156,1.095,157,1.521,158,1.095,159,0.952,160,1.095,161,0.952,162,1.095,163,0.952,164,1.095,165,0.952,166,1.095,167,0.921,168,1.095,169,0.952,170,1.095,171,0.952,172,1.095,173,0.952,174,1.095,175,0.952,176,1.095,177,0.952,178,1.095,179,0.952,180,1.095,181,0.952,182,1.095,183,0.952,184,1.095,185,0.952,186,1.095,187,0.952,188,1.056,189,1.095,190,0.921,191,1.095,192,0.952,193,1.095,194,0.952,195,1.095,196,0.952,197,1.056,198,1.095,199,0.952,200,1.056,201,1.095,202,0.952,203,1.056,204,1.095,205,0.952,206,1.095,207,0.952,208,1.095,209,0.952,210,1.056,211,1.095,212,0.921,213,1.095,214,0.952,215,1.095,216,0.952,217,1.095,218,0.952,219,1.056,220,1.095,221,0.952,222,1.056,223,1.095,224,0.952,225,1.056,226,1.095,227,0.921,228,1.095,229,0.952,230,1.056,231,1.095,232,0.952,233,1.056,234,1.095,235,0.952,236,1.056,237,1.095,238,0.952,239,1.056,240,1.095,241,0.952,242,1.056,243,1.095,244,0.952,245,1.056,246,1.095,247,0.952,248,1.056,249,1.095,250,0.952,251,1.056,252,1.095,253,0.952,254,1.056,255,1.095,275,0.892,308,0.952,377,2.364,390,1.499,440,2.027,441,2.309,442,2.309,443,1.841,444,2.309,445,2.309,446,2.309,447,2.309,448,1.702,449,4.047,450,2.943,451,4.611,452,2.309,453,2.309,454,3.691,455,2.309,456,2.309,457,3.691,458,2.027,459,1.591,460,1.591,461,2.027,462,4.142,463,2.309,464,2.309,465,2.309,466,3.691,467,3.691,468,3.691,469,3.691,470,2.309,471,2.027,472,2.309,473,2.027,474,2.309,475,2.309,476,2.309,477,2.309,478,2.027,479,2.543,480,3.691,481,3.24,482,2.309,483,2.027,484,1.841,485,2.027,486,3.24,487,1.841,488,2.027,489,2.309,490,2.309,491,2.309,492,2.309,493,2.309,494,2.309]],["title/directives/AdminDashboardRecordingsListDirective.html",[0,0.005,157,1.744]],["body/directives/AdminDashboardRecordingsListDirective.html",[0,0.006,2,0.588,3,0.107,4,0.081,5,0.068,6,0.043,9,0.388,11,1.132,16,0.792,23,0.881,26,0.829,27,0.011,28,0.829,29,1.456,30,1.013,31,0.568,32,0.608,33,0.879,37,0.985,38,1.434,40,2.644,41,4.294,42,2.559,43,3.813,44,2.933,45,3.289,47,3.161,48,1.734,49,2.633,50,3.428,51,3.428,52,2.437,53,1.275,54,1.992,56,2.756,57,3.041,58,2.633,59,2.169,62,0.008,63,0.008,128,2.173,129,2.03,157,2.03,275,1.903,304,2.336,449,4.324,458,6.879,459,5.537,495,3.631,496,4.324,497,4.926,498,4.926,499,6.415,500,4.926]],["title/directives/AdminDashboardTitleDirective.html",[0,0.005,159,1.744]],["body/directives/AdminDashboardTitleDirective.html",[0,0.006,2,0.598,3,0.109,4,0.082,5,0.069,6,0.044,9,0.395,11,1.151,16,0.8,23,0.888,26,0.843,27,0.011,28,0.843,29,1.479,30,1.029,31,0.578,32,0.618,33,0.893,37,1.001,38,1.449,40,2.672,41,4.313,42,2.586,43,3.842,44,2.964,45,3.324,47,3.194,48,1.763,49,2.676,50,3.465,51,3.465,52,2.457,53,1.28,54,2.008,56,2.778,57,3.065,58,2.676,59,2.186,62,0.008,63,0.008,129,2.064,131,2.064,159,2.064,275,1.934,443,3.992,460,3.45,495,3.691,501,6.914,502,3.45,503,4.395,504,4.395,505,5.007,506,5.691,507,3.992,508,4.395]],["title/components/AdminLoginComponent.html",[25,0.632,131,1.744]],["body/components/AdminLoginComponent.html",[1,1.173,2,0.705,3,0.062,4,0.047,5,0.039,6,0.046,13,1.135,15,1.213,16,0.351,21,0.569,23,0.651,27,0.01,28,0.479,31,0.328,32,1.094,33,1.585,34,1.301,35,1.914,53,0.69,59,0.865,62,0.005,63,0.005,68,1.249,70,1.065,71,1.213,74,1.35,77,1.35,79,1.665,81,1.665,82,1.459,83,1.918,84,1.75,85,1.665,87,0.972,88,1.75,106,1.173,111,1.301,112,1.213,113,1.301,114,0.508,115,1.35,116,1.35,117,1.135,118,1.918,119,1.256,120,1.75,121,1.402,123,1.173,124,2.8,125,1.35,127,2.8,128,1.256,129,3.037,130,1.35,131,2.174,132,1.35,133,1.301,134,2.062,135,1.256,136,1.1,137,1.301,138,1.35,139,1.213,140,1.213,141,1.18,142,1.35,143,1.213,144,0.891,145,1.301,146,1.1,147,1.35,148,0.891,149,1.35,150,1.35,151,1.173,152,1.35,153,1.301,154,1.35,155,1.1,156,1.35,157,1.173,158,1.35,159,1.173,160,1.35,161,1.792,162,1.35,163,1.173,164,1.35,165,1.173,166,1.35,167,1.135,168,1.35,169,1.173,170,1.35,171,1.173,172,1.35,173,1.173,174,1.35,175,1.173,176,1.35,177,1.173,178,1.35,179,1.173,180,1.35,181,1.173,182,1.35,183,1.173,184,1.35,185,1.173,186,1.35,187,1.173,188,1.301,189,1.35,190,1.135,191,1.35,192,1.173,193,1.35,194,1.173,195,1.35,196,1.173,197,1.301,198,1.35,199,1.173,200,1.301,201,1.35,202,1.173,203,1.301,204,1.35,205,1.173,206,1.35,207,1.173,208,1.35,209,1.173,210,1.301,211,1.35,212,1.135,213,1.35,214,1.173,215,1.35,216,1.173,217,1.35,218,1.173,219,1.301,220,1.35,221,1.173,222,1.301,223,1.35,224,1.173,225,1.301,226,1.35,227,1.135,228,1.35,229,1.173,230,1.301,231,1.35,232,1.173,233,1.301,234,1.35,235,1.173,236,1.301,237,1.35,238,1.173,239,1.301,240,1.35,241,1.173,242,1.301,243,1.35,244,1.173,245,1.301,246,1.35,247,1.173,248,1.301,249,1.35,250,1.173,251,1.301,252,1.35,253,1.173,254,1.301,255,1.35,338,1.065,440,2.498,460,1.961,461,2.498,462,3.582,509,2.846,510,2.846,511,4.347,512,2.846,513,2.846,514,2.846,515,2.846,516,2.846,517,2.846,518,2.846,519,2.846,520,2.846,521,2.846]],["title/directives/AdminLoginErrorDirective.html",[0,0.005,161,1.744]],["body/directives/AdminLoginErrorDirective.html",[0,0.006,2,0.601,3,0.109,4,0.083,5,0.07,6,0.044,9,0.397,11,1.157,16,0.803,23,0.89,26,0.847,27,0.011,28,0.847,29,1.488,30,1.035,31,0.581,32,0.621,33,0.898,37,1.006,38,1.454,40,2.682,41,4.319,42,2.595,43,3.853,44,2.975,45,3.335,47,3.206,48,1.772,49,2.69,50,3.477,51,3.477,52,2.463,53,1.282,54,2.013,56,2.785,57,3.073,58,2.69,59,2.192,62,0.008,63,0.008,129,2.075,131,2.075,161,2.075,338,3.025,495,3.711,496,4.419,507,5.187,522,5.034,523,5.034,524,6.506,525,5.034]],["title/directives/AdminLoginTitleDirective.html",[0,0.005,163,1.744]],["body/directives/AdminLoginTitleDirective.html",[0,0.006,2,0.598,3,0.109,4,0.082,5,0.069,6,0.044,9,0.395,11,1.151,16,0.8,23,0.888,26,0.843,27,0.011,28,0.843,29,1.479,30,1.029,31,0.578,32,0.618,33,0.893,37,1.001,38,1.449,40,2.672,41,4.313,42,2.586,43,3.842,44,2.964,45,3.324,47,3.194,48,1.763,49,2.676,50,3.465,51,3.465,52,2.457,53,1.28,54,2.008,56,2.778,57,3.065,58,2.676,59,2.186,62,0.008,63,0.008,129,2.064,131,2.064,163,2.064,275,1.934,443,3.992,460,3.45,495,3.691,501,6.914,502,3.45,503,4.395,504,4.395,506,5.691,507,3.992,508,4.395,526,5.007]],["title/modules/ApiDirectiveModule.html",[527,2.916,528,2.916]],["body/modules/ApiDirectiveModule.html",[1,2.898,3,0.053,4,0.04,5,0.034,6,0.021,27,0.011,62,0.005,63,0.005,123,2.898,157,2.898,159,2.898,161,2.898,163,2.898,165,2.898,169,2.898,171,2.898,175,2.898,177,2.898,181,2.898,187,2.898,192,2.898,196,2.898,199,2.898,202,2.898,205,2.898,207,2.898,209,2.898,214,2.898,218,2.898,221,2.898,224,2.898,229,2.898,232,2.898,235,2.898,238,2.898,241,2.898,244,2.898,247,2.898,250,2.898,253,2.898,354,1.499,527,1.68,528,6.169,529,1.68,530,1.943,531,1.943,532,3.072,533,1.943,534,1.797,535,3.072,536,2.14,537,2.14,538,2.14,539,3.072,540,1.943,541,2.438]],["title/directives/AudioEnabledDirective.html",[0,0.005,165,1.744]],["body/directives/AudioEnabledDirective.html",[0,0.008,2,0.747,3,0.136,4,0.103,5,0.086,6,0.054,9,0.493,11,1.437,16,0.772,17,1.478,21,1.25,26,1.052,27,0.01,28,1.052,30,1.286,31,0.722,32,0.772,33,1.115,62,0.009,63,0.009,165,2.577,401,2.201,438,2.416,542,3.342,543,5.489,544,4.609,545,4.309,546,4.059,547,4.309,548,6.253]],["title/components/BroadcastingActivityComponent.html",[25,0.632,133,1.935]],["body/components/BroadcastingActivityComponent.html",[1,1.121,2,0.744,3,0.059,4,0.045,5,0.038,6,0.045,9,0.214,11,0.625,13,2.737,14,3.094,15,1.159,16,0.336,21,0.544,23,0.633,25,0.627,27,0.01,28,0.458,31,0.314,32,1.091,33,1.581,34,1.243,35,1.861,53,0.666,62,0.005,63,0.005,64,2.168,67,2.005,68,1.206,70,1.018,71,1.159,72,1.519,73,1.519,74,1.29,76,1.765,77,1.29,79,1.591,80,2.168,81,2.456,82,2.955,83,2.543,84,2.581,85,2.456,86,1.874,87,1.434,88,2.581,89,1.874,90,2.581,91,2.581,92,2.005,93,1.874,94,1.765,106,1.121,111,1.919,112,1.159,113,1.243,114,0.485,115,1.29,116,1.29,117,1.085,118,1.852,119,1.2,123,1.121,124,2.734,125,1.29,127,2.734,128,1.2,129,2.713,130,1.29,131,1.121,132,1.29,133,2.635,134,1.991,135,1.2,136,1.051,137,1.243,138,1.29,139,1.159,140,1.159,141,1.14,142,1.29,143,1.159,144,0.851,145,1.243,146,1.051,147,1.29,148,0.851,149,1.29,150,1.29,151,1.121,152,1.29,153,1.243,154,1.29,155,1.051,156,1.29,157,1.121,158,1.29,159,1.121,160,1.29,161,1.121,162,1.29,163,1.121,164,1.29,165,1.121,166,1.29,167,1.085,168,1.29,169,1.121,170,1.29,171,1.121,172,1.29,173,1.121,174,1.29,175,1.121,176,1.29,177,1.121,178,1.29,179,1.121,180,1.29,181,1.121,182,1.29,183,1.121,184,1.29,185,1.121,186,1.29,187,1.121,188,1.243,189,1.29,190,1.085,191,1.29,192,1.121,193,1.29,194,1.121,195,1.29,196,1.121,197,1.243,198,1.29,199,1.121,200,1.243,201,1.29,202,1.121,203,1.243,204,1.29,205,1.121,206,1.29,207,1.121,208,1.29,209,1.121,210,1.243,211,1.29,212,1.085,213,1.29,214,1.121,215,1.29,216,1.121,217,1.29,218,1.121,219,1.243,220,1.29,221,1.121,222,1.243,223,1.29,224,1.121,225,1.243,226,1.29,227,1.085,228,1.29,229,1.121,230,1.243,231,1.29,232,1.121,233,1.243,234,1.29,235,1.121,236,1.243,237,1.29,238,1.121,239,1.243,240,1.29,241,1.121,242,1.243,243,1.29,244,1.121,245,1.243,246,1.29,247,1.121,248,1.243,249,1.29,250,1.121,251,1.243,252,1.29,253,1.121,254,1.243,255,1.29,338,1.018,438,1.051,462,3.08,549,2.72,550,2.72,551,2.387,552,2.387,553,2.387,554,3.685,555,2.72,556,2.72,557,2.005,558,2.387,559,2.72,560,2.72,561,2.72,562,2.72,563,2.72]],["title/interfaces/BroadcastingEvent.html",[114,0.755,564,3.119]],["body/interfaces/BroadcastingEvent.html",[3,0.139,4,0.105,5,0.088,6,0.056,9,0.503,13,2.546,27,0.01,37,1.276,38,1.685,53,1.013,62,0.009,63,0.009,83,2.817,114,1.139,307,3.538,309,2.165,367,2.181,564,4.706,565,4.399,566,3.734]],["title/injectables/BroadcastingService.html",[567,2.747,568,3.714]],["body/injectables/BroadcastingService.html",[3,0.124,4,0.094,5,0.079,6,0.05,13,3.271,27,0.01,37,1.145,38,1.578,42,2.815,44,2.618,53,0.908,56,2.726,57,3.008,62,0.009,63,0.009,342,2.693,450,5.626,557,5.202,568,5.026,569,3.521,570,5.726,571,7.057,572,7.65,573,7.65,574,4.863,575,4.565,576,4.581,577,6.195,578,4.565,579,5.626,580,4.863,581,4.221,582,4.565]],["title/interfaces/BroadcastingStartRequestedEvent.html",[89,2.916,114,0.755]],["body/interfaces/BroadcastingStartRequestedEvent.html",[3,0.14,4,0.106,5,0.089,6,0.056,27,0.01,37,1.29,38,1.695,53,1.023,62,0.009,63,0.009,89,4.446,309,2.178,367,2.204,369,3.178,564,4.755,565,4.446,583,8.053]],["title/interfaces/BroadcastingStatusInfo.html",[114,0.755,582,3.374]],["body/interfaces/BroadcastingStatusInfo.html",[3,0.129,4,0.097,5,0.082,6,0.052,9,0.467,13,2.365,27,0.01,37,1.185,38,1.612,53,1.232,54,2.013,62,0.009,63,0.009,114,1.058,309,2.322,338,2.908,342,2.845,367,2.026,557,5.315,565,4.086,566,3.469,582,4.727,584,3.469,585,4.371,586,6.819,587,4.968]],["title/interfaces/BroadcastingStopRequestedEvent.html",[94,2.747,114,0.755]],["body/interfaces/BroadcastingStopRequestedEvent.html",[3,0.14,4,0.106,5,0.089,6,0.056,27,0.01,37,1.29,38,1.695,53,1.023,62,0.009,63,0.009,94,4.188,309,2.178,367,2.204,369,3.178,564,4.755,565,4.446,586,7.069]],["title/components/ChatPanelComponent.html",[25,0.632,135,1.867]],["body/components/ChatPanelComponent.html",[0,0.004,1,1.192,2,0.805,3,0.063,4,0.047,5,0.04,6,0.046,9,0.228,13,1.153,15,1.232,16,0.357,21,0.578,23,0.657,25,0.432,27,0.01,28,0.487,29,0.854,31,0.334,32,1.095,33,1.586,34,1.322,35,1.933,62,0.005,63,0.005,66,2.305,68,1.53,70,1.082,71,1.232,72,1.614,73,1.614,74,1.371,76,1.877,77,1.371,78,2.131,106,1.192,111,2.011,112,1.232,113,1.322,114,0.785,115,1.371,116,1.371,117,1.153,118,1.941,119,1.276,121,1.424,123,1.192,124,2.822,125,1.371,126,1.992,127,2.822,128,1.276,129,2.78,130,1.371,131,1.192,132,1.371,133,1.322,134,2.086,135,2.626,136,2.299,137,1.322,138,1.371,139,1.875,140,1.232,141,1.195,142,1.371,143,1.232,144,0.905,145,1.322,146,1.117,147,1.371,148,0.905,149,1.371,150,1.371,151,1.192,152,1.371,153,1.322,154,1.371,155,1.117,156,1.371,157,1.192,158,1.371,159,1.192,160,1.371,161,1.192,162,1.371,163,1.192,164,1.371,165,1.192,166,1.371,167,1.755,168,1.371,169,1.192,170,1.371,171,1.192,172,1.371,173,1.192,174,1.371,175,1.192,176,1.371,177,1.192,178,1.371,179,1.192,180,1.371,181,1.192,182,1.371,183,1.192,184,1.371,185,1.192,186,1.371,187,1.192,188,1.322,189,1.371,190,1.153,191,1.371,192,1.192,193,1.371,194,1.192,195,1.371,196,1.192,197,1.322,198,1.371,199,1.192,200,1.322,201,1.371,202,1.192,203,1.322,204,1.371,205,1.192,206,1.371,207,1.192,208,1.371,209,1.192,210,1.322,211,1.371,212,1.153,213,1.371,214,1.192,215,1.371,216,1.192,217,1.371,218,1.192,219,1.322,220,1.371,221,1.192,222,1.322,223,1.371,224,1.192,225,1.322,226,1.371,227,1.153,228,1.371,229,1.192,230,1.322,231,1.371,232,1.192,233,1.322,234,1.371,235,1.192,236,1.322,237,1.371,238,1.192,239,1.322,240,1.371,241,1.192,242,1.322,243,1.371,244,1.192,245,1.322,246,1.371,247,1.192,248,1.322,249,1.371,250,1.192,251,1.322,252,1.371,253,1.192,254,1.322,255,1.371,428,1.614,438,1.117,462,2.846,588,2.891,589,2.891,590,2.891,591,2.538,592,2.891,593,1.778,594,2.305,595,2.891,596,1.614,597,2.131,598,2.891,599,2.891,600,2.891,601,2.891]],["title/directives/ChatPanelDirective.html",[0,0.005,167,1.688]],["body/directives/ChatPanelDirective.html",[0,0.005,2,0.315,3,0.057,4,0.043,5,0.037,6,0.044,9,0.208,16,0.621,17,0.624,23,0.507,25,0.613,26,0.847,27,0.011,31,0.305,32,0.507,37,0.528,38,0.917,40,2.339,48,1.445,52,0.902,53,0.798,54,0.738,59,1.248,62,0.005,63,0.005,68,1.63,83,1.165,90,1.624,91,1.624,117,1.054,136,2.622,141,1.114,167,1.054,256,1.253,257,1.301,259,1.715,260,2.106,261,1.947,262,3.22,263,2.022,264,2.291,265,1.354,266,1.947,267,2.022,268,2.594,269,2.48,270,1.301,271,1.301,272,2.022,273,1.301,274,1.946,275,1.02,276,1.253,277,1.165,278,1.253,279,1.301,280,1.412,281,2.318,282,1.715,283,1.947,284,1.947,285,1.82,286,1.715,287,1.947,288,1.947,289,1.301,290,1.253,291,1.301,292,1.126,293,1.301,294,2.145,295,2.48,296,1.208,297,1.208,298,1.208,299,1.253,300,1.301,301,1.301,302,1.301,303,1.301,304,1.253,305,2.022,306,2.022,307,1.811,308,2.893,309,1.95,311,1.301,312,1.301,313,2.022,314,1.749,315,2.48,316,2.796,317,2.022,318,1.301,319,1.301,320,1.301,321,2.48,322,1.301,323,1.301,324,1.301,325,1.876,326,1.301,327,3.085,328,2.022,329,1.301,330,2.81,331,1.301,332,1.301,333,1.811,334,1.301,335,1.301,336,1.301,337,1.301,338,1.536,339,2.022,340,1.301,341,2.022,342,0.93,343,2.81,344,1.301,345,1.301,346,1.301,347,1.253,348,3.272,349,1.301,350,1.82,351,1.82,352,1.545,353,2.106,354,1.624,355,1.715,356,1.82,357,3.911,358,1.624,359,3.095,360,3.095,387,1.624,400,1.545,401,2.164,402,1.475,403,1.475,409,2.58,412,2.944,413,2.193,414,1.624,427,2.689,428,2.81,429,1.545,430,1.475,431,1.412,432,1.545,433,1.475,434,1.545,597,3.025,602,4.104,603,3.602,604,2.641,605,3.095,606,3.602,607,2.641,608,5.033,609,4.104,610,1.545,611,2.641,612,2.641,613,2.641,614,2.641,615,2.641,616,3.602,617,2.641,618,5.033,619,4.104,620,2.641,621,2.641,622,2.641,623,2.641,624,4.104,625,2.641,626,1.947,627,2.641,628,2.641,629,2.641,630,2.641,631,3.025,632,2.641]],["title/interfaces/ChatPanelStatusEvent.html",[114,0.755,633,3.119]],["body/interfaces/ChatPanelStatusEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,367,2.284,368,4.111,369,3.294,370,4.34,633,4.929]],["title/directives/LangDirective.html",[0,0.005,169,1.744]],["body/directives/LangDirective.html",[0,0.007,2,0.697,3,0.127,4,0.096,5,0.081,6,0.051,9,0.46,11,1.341,16,0.881,21,1.166,26,0.982,27,0.009,28,0.982,30,1.2,31,0.673,32,0.72,33,1.041,62,0.009,63,0.009,169,2.405,438,2.758,542,3.118,574,4.021,634,4.301,635,5.122,636,4.92,637,6.267,638,5.692,639,5.835,640,4.652,641,5.835,642,4.652,643,5.835,644,4.652,645,5.835,646,4.652,647,5.835,648,4.652,649,5.835,650,5.835,651,4.652,652,5.835,653,4.652,654,5.835,655,4.652,656,5.835]],["title/interfaces/LangOption.html",[114,0.755,657,2.916]],["body/interfaces/LangOption.html",[3,0.138,4,0.104,5,0.088,6,0.055,23,0.987,27,0.01,37,1.267,38,1.678,53,1.19,62,0.009,63,0.009,309,2.156,367,2.166,634,5.893,657,4.369,658,5.565,659,6.587]],["title/directives/LangOptionsDirective.html",[0,0.005,171,1.744]],["body/directives/LangOptionsDirective.html",[0,0.006,2,0.564,3,0.103,4,0.102,5,0.065,6,0.041,9,0.372,11,1.086,16,0.77,21,0.944,23,1.058,26,0.795,27,0.011,28,0.795,30,0.971,31,0.545,32,0.583,33,0.842,62,0.008,63,0.008,114,0.842,119,2.754,171,1.947,263,2.327,352,2.763,376,3.583,387,3.837,433,2.637,438,1.824,542,2.524,574,3.255,631,3.481,634,6.241,636,5.124,637,4.146,638,3.765,640,3.765,642,3.765,644,3.765,646,3.765,648,3.765,651,3.765,653,3.765,655,3.765,657,3.255,660,4.146,661,4.723,662,4.723,663,3.765,664,4.723,665,3.765,666,4.723,667,4.723,668,4.723,669,4.723,670,4.723,671,4.723,672,4.723,673,4.723,674,4.146,675,4.723,676,2.763,677,4.723,678,4.723,679,4.723,680,4.723,681,4.723]],["title/components/LayoutComponent.html",[25,0.632,137,1.935]],["body/components/LayoutComponent.html",[0,0.006,1,1.164,2,0.798,3,0.061,4,0.046,5,0.039,6,0.046,9,0.223,13,1.127,15,1.204,16,0.533,20,0.91,21,0.864,23,0.648,25,0.645,27,0.01,28,0.475,29,0.835,30,0.581,31,0.326,32,1.093,33,1.584,34,1.291,35,1.905,37,0.565,38,0.966,53,0.685,59,0.859,62,0.005,63,0.005,68,1.241,70,1.057,71,1.204,72,1.577,73,1.577,74,1.34,77,1.34,106,1.164,111,1.976,112,1.842,113,1.291,114,0.504,115,1.34,116,1.34,117,1.127,118,1.907,119,1.246,121,2.129,123,1.164,124,2.789,125,1.34,127,2.789,128,1.246,129,2.755,130,1.34,131,1.164,132,1.34,133,1.291,134,2.05,135,1.246,136,1.091,137,2.688,138,1.34,139,1.204,140,1.204,141,1.173,142,1.34,143,1.204,144,1.352,145,1.291,146,1.669,147,1.34,148,0.884,149,1.34,150,1.34,151,1.164,152,1.34,153,1.291,154,1.34,155,1.091,156,1.34,157,1.164,158,1.34,159,1.164,160,1.34,161,1.164,162,1.34,163,1.164,164,1.34,165,1.164,166,1.34,167,1.127,168,1.34,169,1.164,170,1.34,171,1.164,172,1.34,173,1.781,174,1.34,175,1.164,176,1.34,177,1.164,178,1.34,179,1.164,180,1.34,181,1.164,182,1.34,183,1.164,184,1.34,185,1.164,186,1.34,187,1.164,188,1.291,189,1.34,190,1.127,191,1.34,192,1.164,193,1.34,194,1.781,195,1.34,196,1.164,197,1.291,198,1.34,199,1.164,200,1.291,201,1.34,202,1.164,203,1.291,204,1.34,205,1.164,206,1.34,207,1.164,208,1.34,209,1.164,210,1.291,211,1.34,212,1.127,213,1.34,214,1.164,215,1.34,216,1.164,217,1.34,218,1.164,219,1.291,220,1.34,221,1.164,222,1.291,223,1.34,224,1.164,225,1.291,226,1.34,227,1.127,228,1.34,229,1.164,230,1.291,231,1.34,232,1.164,233,1.291,234,1.34,235,1.164,236,1.291,237,1.34,238,1.164,239,1.291,240,1.34,241,1.164,242,1.291,243,1.34,244,1.164,245,1.291,246,1.34,247,1.164,248,1.291,249,1.34,250,1.164,251,1.291,252,1.34,253,1.164,254,1.291,255,1.34,263,1.392,264,1.577,267,1.392,438,1.091,587,1.946,593,1.737,596,1.577,682,2.824,683,2.805,684,2.805,685,1.737,686,2.479,687,3.185,688,2.824,689,2.824,690,2.978,691,3.185,692,2.129,693,2.252,694,1.833,695,1.833,696,1.737,697,1.737,698,1.946,699,1.946,700,2.082]],["title/directives/LayoutDirective.html",[0,0.005,173,1.744]],["body/directives/LayoutDirective.html",[0,0.003,2,0.303,3,0.055,4,0.042,5,0.035,6,0.043,9,0.2,16,0.686,17,0.6,23,0.491,25,0.594,26,0.67,27,0.011,28,0.427,30,0.818,31,0.293,32,0.491,37,0.508,38,1.097,40,2.29,48,1.401,52,0.867,53,0.778,54,0.709,59,1.21,62,0.005,63,0.005,71,1.696,141,1.508,144,1.888,146,0.981,173,1.047,256,1.204,257,1.251,259,1.648,262,2.634,263,1.96,264,1.418,265,1.302,267,1.251,268,2.758,269,2.418,270,1.251,271,1.251,272,1.96,273,1.251,274,1.887,275,1.537,276,1.887,277,1.12,278,1.204,279,1.251,282,1.648,285,1.75,289,1.251,290,1.204,291,1.251,292,1.082,293,1.251,294,2.571,295,2.418,296,1.161,297,1.161,298,1.161,299,1.204,300,1.251,301,1.251,302,1.251,303,1.251,304,1.204,305,1.96,306,1.96,307,1.756,308,2.855,309,1.596,311,1.251,312,1.251,313,1.96,314,1.696,315,2.418,316,2.737,317,1.96,318,1.251,319,1.251,320,1.251,321,2.418,322,1.251,323,1.251,324,1.251,325,1.161,326,1.251,327,1.204,328,1.251,329,1.251,330,2.243,331,1.251,332,1.251,333,1.12,334,1.251,335,1.251,336,1.251,337,1.251,338,1.49,339,1.96,340,1.251,341,1.96,342,0.894,343,1.161,344,1.251,345,1.251,346,1.251,347,1.204,349,1.251,355,1.648,356,1.75,358,1.561,359,3.017,360,3.017,377,1.302,390,1.648,396,2.024,400,1.485,401,1.728,402,1.418,403,1.418,409,2.516,410,2.024,412,2.328,413,2.126,414,1.561,415,3.493,427,2.622,428,1.418,429,1.485,430,1.418,431,2.126,432,1.485,433,1.418,434,1.485,437,1.872,439,1.75,448,1.872,585,1.872,605,3.017,610,3.743,674,2.229,686,2.229,687,2.933,690,1.75,691,2.933,692,2.418,693,3.172,697,1.561,701,2.229,702,2.539,703,2.539,704,2.539,705,5.102,706,1.648,707,2.539,708,2.539,709,2.742,710,2.539,711,2.539,712,2.539,713,2.024,714,2.539,715,2.539,716,1.648,717,2.024,718,2.539,719,2.229,720,2.539,721,2.539,722,2.539,723,2.539,724,2.539,725,1.872,726,2.539,727,4.307,728,3.979,729,2.539,730,2.539,731,5.295,732,2.933,733,4.907,734,3.979,735,2.539,736,2.229,737,2.539,738,2.539,739,1.648,740,1.872,741,2.024,742,2.539,743,2.229,744,2.539,745,2.229,746,2.229,747,4.307,748,2.229,749,2.229,750,2.539,751,2.229,752,2.229,753,2.229,754,2.229,755,2.229,756,2.229,757,2.229,758,2.229,759,3.172,760,2.229,761,2.229,762,2.229,763,2.229,764,2.229,765,2.539,766,1.485,767,1.485]],["title/directives/LivekitUrlDirective.html",[0,0.005,175,1.744]],["body/directives/LivekitUrlDirective.html",[0,0.007,2,0.729,3,0.133,4,0.1,5,0.084,6,0.053,9,0.481,16,0.754,21,1.221,26,1.028,27,0.01,28,1.028,30,1.256,31,0.705,32,0.754,33,1.089,62,0.009,63,0.009,141,1.993,175,2.517,314,2.603,401,2.584,438,2.359,542,3.264,706,3.965,716,3.965,768,6.442,769,4.502,770,4.869,771,6.107,772,6.107,773,5.361,774,6.107]],["title/directives/MinimalDirective.html",[0,0.005,177,1.744]],["body/directives/MinimalDirective.html",[0,0.008,2,0.741,3,0.135,4,0.102,5,0.086,6,0.054,9,0.489,16,0.767,21,1.241,26,1.045,27,0.01,28,1.045,30,1.277,31,0.717,32,0.767,33,1.108,62,0.009,63,0.009,177,2.56,408,4.032,438,2.399,542,3.319,635,5.452,775,6.508,776,5.452,777,6.211,778,5.452,779,5.452,780,6.211,781,4.952,782,6.211]],["title/modules/OpenViduComponentsDirectiveModule.html",[527,2.916,783,2.916]],["body/modules/OpenViduComponentsDirectiveModule.html",[3,0.086,4,0.065,5,0.055,6,0.048,27,0.011,62,0.007,63,0.007,151,3.309,155,3.101,167,3.202,173,3.309,179,3.309,183,3.309,185,3.309,190,3.202,194,3.309,212,3.202,216,3.309,227,3.202,256,1.89,354,2.45,527,2.746,529,2.746,530,3.176,531,3.176,532,4.432,533,3.176,534,2.937,535,4.432,539,4.432,540,3.176,783,6.131,784,3.497,785,3.497,786,3.497,787,3.984]],["title/injectables/OpenViduService.html",[567,2.747,788,3.374]],["body/injectables/OpenViduService.html",[3,0.12,4,0.091,5,0.076,6,0.048,23,0.681,27,0.01,31,0.637,37,1.103,42,2.752,53,0.875,55,2.066,56,3.307,62,0.008,63,0.008,308,2.275,309,1.585,325,3.604,333,3.044,401,2.956,569,3.394,788,4.4,789,5.519,790,7.524,791,7.524,792,7.524,793,7.524,794,7.524,795,7.524,796,5.519,797,5.519,798,4.844,799,5.519,800,4.4]],["title/components/PanelComponent.html",[25,0.632,139,1.804]],["body/components/PanelComponent.html",[0,0.006,1,1.049,2,0.799,3,0.055,4,0.042,5,0.035,6,0.048,9,0.201,13,1.016,15,1.085,16,0.687,20,0.82,21,0.797,23,0.607,25,0.596,27,0.009,28,0.428,31,0.294,32,1.087,33,1.576,34,1.164,35,2.192,53,0.882,62,0.005,63,0.005,68,2.169,70,0.953,71,1.085,72,1.422,73,1.422,74,1.207,76,1.653,77,1.207,78,1.877,79,1.489,81,3.254,82,2.852,83,2.455,105,3.834,106,1.049,111,1.823,112,1.7,113,1.164,114,0.454,115,1.207,116,1.207,117,1.016,118,2.455,119,1.123,121,1.965,123,1.049,124,2.638,125,1.207,127,2.638,128,1.123,129,2.641,130,1.207,131,1.049,132,1.207,133,1.164,134,1.891,135,1.76,136,2.149,137,1.164,138,1.207,139,2.575,140,1.085,141,1.083,142,1.207,143,1.7,144,1.741,145,1.164,146,0.983,147,1.207,148,0.797,149,1.207,150,1.207,151,1.049,152,1.207,153,1.164,154,1.207,155,1.54,156,1.207,157,1.049,158,1.207,159,1.049,160,1.207,161,1.049,162,1.207,163,1.049,164,1.207,165,1.049,166,1.207,167,1.591,168,1.207,169,1.049,170,1.207,171,1.049,172,1.207,173,1.049,174,1.207,175,1.049,176,1.207,177,1.049,178,1.207,179,1.644,180,1.207,181,1.049,182,1.207,183,1.049,184,1.207,185,1.049,186,1.207,187,1.049,188,1.164,189,1.207,190,1.591,191,1.207,192,1.049,193,1.207,194,1.049,195,1.207,196,1.049,197,1.164,198,1.207,199,1.049,200,1.164,201,1.207,202,1.049,203,1.164,204,1.207,205,1.049,206,1.207,207,1.049,208,1.207,209,1.049,210,1.164,211,1.207,212,1.016,213,1.207,214,1.049,215,1.207,216,1.049,217,1.207,218,1.049,219,1.164,220,1.207,221,1.049,222,1.164,223,1.207,224,1.049,225,1.164,226,1.207,227,1.016,228,1.207,229,1.049,230,1.164,231,1.207,232,1.049,233,1.164,234,1.207,235,1.049,236,1.164,237,1.207,238,1.049,239,1.164,240,1.207,241,1.049,242,1.164,243,1.207,244,1.049,245,1.164,246,1.207,247,1.049,248,1.164,249,1.207,250,1.049,251,1.164,252,1.207,253,1.049,254,1.164,255,1.207,267,1.965,277,1.123,342,2.44,366,1.877,371,2.03,375,2.748,376,1.305,387,3.421,438,0.983,593,1.566,596,1.422,597,1.877,633,1.877,676,3.254,683,1.653,684,1.653,685,1.566,694,2.589,695,1.653,698,1.754,699,1.754,801,2.546,802,2.546,803,2.235,804,2.235,805,2.235,806,4.435,807,5.563,808,2.235,809,2.235,810,1.877,811,2.235,812,2.452,813,1.877,814,1.877,815,1.877,816,2.03,817,2.546,818,1.877]],["title/directives/PanelDirective.html",[0,0.005,179,1.744]],["body/directives/PanelDirective.html",[0,0.004,2,0.554,3,0.067,4,0.051,5,0.043,6,0.048,9,0.244,16,0.686,17,0.733,23,0.383,25,0.693,26,0.781,27,0.011,31,0.358,32,0.573,35,2.017,59,1.41,62,0.006,63,0.006,68,2.168,82,1.59,135,1.368,136,2.146,139,1.322,141,0.842,143,1.322,144,1.739,155,1.198,167,1.85,179,1.278,190,1.237,256,1.471,257,1.528,259,2.013,262,1.471,263,3.413,265,1.59,266,2.286,267,2.285,268,2.819,269,2.737,270,1.528,271,1.528,272,2.285,273,1.528,274,2.2,275,1.198,276,1.471,277,1.368,278,1.471,279,1.528,280,2.969,282,2.013,286,2.013,287,2.286,288,2.286,289,1.528,290,1.471,291,1.528,292,1.322,293,1.528,294,2.368,295,2.737,296,1.418,297,1.418,298,1.418,299,1.471,300,1.528,301,1.528,302,1.528,303,1.528,304,1.471,305,2.285,306,2.285,307,2.047,308,3.043,309,1.771,310,2.137,311,1.528,312,1.528,313,2.285,314,1.977,315,2.737,316,3.038,317,2.285,318,1.528,319,1.528,320,1.528,321,2.737,322,1.528,323,1.528,324,1.528,325,1.418,326,1.528,327,1.471,328,1.528,329,1.528,330,2.54,331,1.528,332,1.528,333,1.368,334,1.528,335,1.528,336,1.528,337,1.528,338,1.736,339,2.285,340,1.528,341,2.285,342,1.092,343,1.418,344,1.528,345,1.528,346,1.528,347,1.471,349,1.528,355,2.013,356,2.137,375,3.829,377,2.378,394,2.722,395,2.722,396,2.473,397,2.722,398,2.722,399,2.722,400,1.814,401,1.633,402,1.732,403,1.732,409,1.59,412,2.713,413,2.479,414,1.907,427,2.969,428,1.732,429,1.814,430,1.732,431,1.657,432,1.814,433,1.732,434,1.814,437,2.286,439,2.137,764,2.722,766,1.814,767,1.814,815,2.286,816,3.698,819,3.101,820,3.101,821,3.101,822,2.722,823,3.101,824,3.101,825,2.013,826,2.722,827,3.101,828,3.101,829,3.101,830,3.101]],["title/injectables/PanelService.html",[379,3.374,567,2.747]],["body/injectables/PanelService.html",[3,0.097,4,0.074,5,0.062,6,0.039,23,0.553,27,0.011,35,1.626,37,0.896,38,1.347,42,2.403,44,2.048,52,1.531,53,1.205,54,1.251,55,2.928,56,3.18,57,2.568,62,0.007,63,0.007,68,2.468,106,1.847,126,4.152,136,1.731,144,1.402,280,2.395,309,2.091,342,1.577,379,3.572,407,3.933,569,2.755,580,4.152,581,3.303,626,3.303,812,2.755,831,4.481,832,6.025,833,6.807,834,6.807,835,6.807,836,6.807,837,6.807,838,6.807,839,6.807,840,6.025,841,4.481,842,7.133,843,5.767,844,3.572,845,3.933,846,3.933,847,4.481,848,5.427,849,5.289,850,6.025,851,4.481,852,4.481,853,3.572,854,3.572,855,4.481,856,4.481,857,4.481,858,3.933]],["title/interfaces/PanelStatusEvent.html",[114,0.755,370,2.747]],["body/interfaces/PanelStatusEvent.html",[3,0.136,4,0.103,5,0.087,6,0.055,9,0.494,27,0.01,37,1.254,38,1.667,53,0.995,55,2.792,62,0.009,63,0.009,68,1.802,83,2.768,114,1.119,277,2.768,342,2.209,367,2.144,368,3.858,370,4.073,566,3.67,846,5.507,859,6.274,860,6.274,861,6.987]],["title/interfaces/PanelStatusInfo.html",[114,0.755,378,3.374]],["body/interfaces/PanelStatusInfo.html",[3,0.114,4,0.086,5,0.073,6,0.046,9,0.414,22,2.028,26,0.884,27,0.01,35,2.426,37,1.05,38,1.494,53,1.296,54,2.282,55,2.502,62,0.008,63,0.008,68,2.296,83,2.317,114,0.937,136,2.028,144,1.643,309,2.347,367,1.794,368,3.229,374,2.806,378,4.186,566,3.071,584,3.071,812,4.11,842,4.609,843,3.87,848,6.62,849,6.455,861,6.455,862,7.353,863,4.609,864,4.609,865,5.25,866,5.25,867,5.25,868,4.186,869,5.25,870,4.609,871,5.25]],["title/classes/ParticipantModel.html",[292,1.804,692,2.085]],["body/classes/ParticipantModel.html",[3,0.086,4,0.065,5,0.055,6,0.035,9,0.313,23,0.898,27,0.011,37,0.793,38,1.239,42,2.211,47,2.731,48,1.397,52,1.894,53,1.013,54,1.548,55,2.897,56,3.387,62,0.007,63,0.007,106,1.635,114,0.708,141,2.307,292,1.691,294,1.691,309,1.835,333,1.75,401,1.951,427,2.12,545,2.734,546,4.147,587,2.734,610,3.242,631,4.086,692,1.954,705,6.294,767,2.321,858,3.482,872,3.967,873,3.163,874,3.967,875,4.865,876,5.543,877,4.865,878,4.419,879,4.419,880,5.543,881,5.543,882,5.543,883,5.543,884,5.543,885,5.543,886,5.543,887,5.543,888,3.967,889,4.419,890,3.967,891,3.163,892,3.482,893,3.482,894,3.482,895,3.482,896,3.967,897,5.543,898,5.543,899,3.482,900,3.967,901,3.967,902,3.967,903,3.967,904,3.967,905,3.967,906,3.598,907,3.967,908,3.967,909,3.82,910,2.924,911,3.967,912,3.967,913,3.967,914,4.766,915,3.967,916,2.321,917,3.967,918,3.598,919,3.967,920,3.967,921,3.967,922,3.967]],["title/directives/ParticipantNameDirective.html",[0,0.005,181,1.744]],["body/directives/ParticipantNameDirective.html",[0,0.008,2,0.744,3,0.135,4,0.102,5,0.086,6,0.054,9,0.491,21,1.246,23,0.769,26,1.049,27,0.01,28,1.049,31,0.719,32,0.769,33,1.112,62,0.009,63,0.009,71,2.656,141,1.692,181,2.569,330,2.849,438,2.407,542,3.33,769,4.594,923,5.47,924,6.232,925,6.232,926,5.47,927,4.968,928,4.294,929,6.232]],["title/components/ParticipantPanelItemComponent.html",[25,0.632,140,1.804]],["body/components/ParticipantPanelItemComponent.html",[0,0.006,1,1.148,2,0.752,3,0.06,4,0.046,5,0.038,6,0.045,9,0.22,13,1.111,15,1.187,16,0.528,20,0.897,21,0.557,23,0.642,27,0.01,28,0.469,30,0.573,31,0.321,32,1.092,33,1.583,34,1.274,35,1.889,53,0.442,55,1.043,62,0.005,63,0.005,68,2.051,70,1.043,71,1.187,72,1.555,73,1.555,74,1.321,77,1.321,106,1.148,111,1.274,112,1.823,113,1.274,114,0.497,115,1.321,116,1.321,117,1.111,118,1.887,119,1.229,120,1.713,121,2.564,123,1.148,124,2.769,125,1.321,127,2.769,128,1.229,129,2.74,130,1.321,131,1.148,132,1.321,133,1.274,134,2.028,135,1.229,136,1.076,137,1.274,138,1.321,139,1.187,140,2.488,141,1.805,142,1.321,143,1.823,144,1.338,145,1.274,146,1.076,147,1.321,148,0.872,149,1.321,150,1.321,151,1.148,152,1.321,153,1.274,154,1.321,155,1.076,156,1.321,157,1.148,158,1.321,159,1.148,160,1.321,161,1.148,162,1.321,163,1.148,164,1.321,165,1.148,166,1.321,167,1.111,168,1.321,169,1.148,170,1.321,171,1.148,172,1.321,173,1.148,174,1.321,175,1.148,176,1.321,177,1.148,178,1.321,179,1.148,180,1.321,181,1.148,182,1.321,183,1.763,184,1.321,185,1.763,186,1.321,187,1.763,188,1.274,189,1.321,190,1.111,191,1.321,192,1.148,193,1.321,194,1.148,195,1.321,196,1.148,197,1.274,198,1.321,199,1.148,200,1.274,201,1.321,202,1.148,203,1.274,204,1.321,205,1.148,206,1.321,207,1.148,208,1.321,209,1.148,210,1.274,211,1.321,212,1.111,213,1.321,214,1.148,215,1.321,216,1.148,217,1.321,218,1.148,219,1.274,220,1.321,221,1.148,222,1.274,223,1.321,224,1.148,225,1.274,226,1.321,227,1.111,228,1.321,229,1.148,230,1.274,231,1.321,232,1.148,233,1.274,234,1.321,235,1.148,236,1.274,237,1.321,238,1.148,239,1.274,240,1.321,241,1.148,242,1.274,243,1.321,244,1.148,245,1.274,246,1.321,247,1.148,248,1.274,249,1.321,250,1.148,251,1.274,252,1.321,253,1.148,254,1.274,255,1.321,374,1.489,376,1.428,462,1.489,584,1.63,593,1.713,596,1.555,683,1.808,684,2.776,685,1.713,694,1.808,695,1.808,698,1.92,699,1.92,739,2.776,930,2.445,931,2.786,932,2.786,933,2.786,934,2.786,935,2.786,936,2.786,937,2.053,938,1.63,939,2.221,940,2.445,941,2.786,942,2.786,943,2.786,944,2.786,945,2.786,946,2.445,947,2.445]],["title/directives/ParticipantPanelItemDirective.html",[0,0.005,183,1.744]],["body/directives/ParticipantPanelItemDirective.html",[0,0.005,2,0.355,3,0.065,4,0.049,5,0.041,6,0.047,9,0.234,11,1.033,16,0.669,17,0.703,23,0.555,25,0.671,26,0.757,27,0.011,31,0.343,32,0.555,37,0.595,38,1.005,40,2.489,48,1.048,52,1.017,53,0.86,54,0.831,59,1.367,62,0.006,63,0.006,68,1.735,87,1.536,117,1.187,141,1.98,143,1.268,183,1.227,256,1.411,257,1.466,262,3.234,265,1.525,267,1.466,268,3.237,269,2.67,270,1.466,271,1.466,272,2.215,273,1.466,274,2.132,275,1.149,276,1.411,277,1.313,278,1.411,279,1.466,289,1.466,290,1.411,291,1.466,292,1.268,293,1.466,294,2.31,295,2.67,296,1.36,297,1.36,298,1.36,299,1.411,300,1.466,301,1.466,302,1.466,303,1.466,304,1.411,305,2.215,306,2.215,307,1.984,308,3.005,309,1.735,310,2.051,311,1.466,312,1.466,313,2.215,314,1.917,315,2.67,316,2.976,317,2.215,318,1.466,319,1.466,320,1.466,321,2.67,322,1.466,323,1.466,324,1.466,325,1.36,326,1.466,327,1.411,328,1.466,329,1.466,330,2.478,331,1.466,332,1.466,333,1.313,334,1.466,335,1.466,336,1.466,337,1.466,338,1.683,339,2.215,340,1.466,341,2.215,342,1.048,343,1.36,344,1.466,345,1.466,346,1.466,347,1.411,349,1.466,350,2.051,351,2.051,352,1.741,357,4.162,358,1.83,359,3.332,360,3.332,377,1.525,380,3.314,381,2.193,382,3.314,383,2.193,388,2.193,390,1.932,400,1.741,401,1.583,402,1.661,403,2.51,409,1.525,412,2.63,413,2.403,414,1.83,427,2.896,428,1.661,429,1.741,430,1.661,431,1.59,432,1.741,433,1.661,434,1.741,435,2.193,502,2.051,676,2.63,692,1.466,696,1.83,706,2.919,739,3.518,766,1.741,825,1.932,937,3.995,948,2.372,949,2.372,950,2.372,951,2.372,952,2.612,953,2.193,954,4.496,955,4.496,956,4.496,957,2.976,958,2.976,959,2.612,960,2.612,961,1.932]],["title/directives/ParticipantPanelItemElementsDirective.html",[0,0.005,185,1.744]],["body/directives/ParticipantPanelItemElementsDirective.html",[0,0.005,2,0.35,3,0.064,4,0.048,5,0.041,6,0.047,9,0.231,11,0.674,16,0.549,17,1.051,23,0.549,25,0.664,26,0.748,27,0.011,31,0.338,32,0.549,37,0.586,38,0.994,40,2.471,48,1.566,52,1.002,53,0.852,54,0.819,59,1.352,62,0.005,63,0.005,68,1.277,87,1.519,140,1.25,141,1.913,185,1.209,256,1.391,257,1.445,262,2.843,265,1.503,268,2.741,269,2.647,270,1.445,271,1.445,272,2.191,273,1.445,274,2.109,275,1.133,276,1.391,277,1.294,278,1.391,279,1.445,289,1.445,290,1.391,291,1.445,292,1.25,293,1.445,294,2.555,295,2.647,296,2.456,297,1.341,298,1.341,299,1.391,300,1.445,301,1.445,302,1.445,303,1.445,304,1.391,305,2.191,306,2.191,307,1.962,308,2.992,309,1.722,311,1.445,312,1.445,313,2.191,314,1.896,315,2.647,316,2.954,317,2.191,318,1.445,319,1.445,320,1.445,321,2.647,322,1.445,323,1.445,324,1.445,325,2.033,326,1.445,327,1.391,328,2.191,329,1.445,330,2.456,331,1.445,332,1.445,333,1.294,334,1.445,335,1.445,336,1.445,337,1.445,338,1.665,339,2.191,340,1.445,341,2.191,342,1.566,343,1.341,344,1.445,345,1.445,346,1.445,347,1.391,349,1.445,355,1.904,357,4.131,358,1.803,359,3.303,360,3.303,372,2.338,374,1.567,376,1.503,377,1.503,400,1.716,401,1.566,402,1.638,403,2.483,408,1.904,409,2.754,412,3.142,413,2.377,414,1.803,427,2.871,428,1.638,429,1.716,430,1.638,431,1.567,432,1.716,433,1.638,434,1.716,594,4.779,676,2.601,692,1.445,696,1.803,706,2.887,739,1.904,766,1.716,788,4.283,800,4.283,822,4.715,825,1.904,845,2.574,939,4.283,948,2.338,949,2.338,950,2.338,951,2.338,952,2.574,953,2.162,960,2.574,961,1.904,962,2.933,963,2.574,964,2.933,965,2.933,966,2.933,967,2.933,968,2.338,969,2.933,970,2.933,971,2.933,972,2.933,973,2.933,974,2.933]],["title/directives/ParticipantPanelItemMuteButtonDirective.html",[0,0.005,187,1.744]],["body/directives/ParticipantPanelItemMuteButtonDirective.html",[0,0.005,2,0.536,3,0.098,4,0.074,5,0.062,6,0.039,9,0.354,11,1.032,12,1.735,16,0.745,17,1.426,18,2.002,19,1.735,20,1.447,21,0.898,22,1.735,23,0.939,25,0.901,26,1.016,27,0.011,28,0.756,29,1.327,30,0.923,31,0.518,32,0.554,33,1.077,37,0.898,38,1.349,40,2.488,41,4.184,42,2.407,43,3.643,44,2.759,45,3.094,47,2.973,48,1.581,49,2.4,50,3.225,51,3.225,52,2.49,53,1.29,54,2.035,55,3.083,56,2.815,57,3.106,58,2.4,59,2.216,62,0.007,63,0.007,68,1.958,87,1.535,140,1.915,141,1.639,187,1.851,188,2.054,739,2.916,940,6.673,975,4.492,976,4.492,977,3.943,978,4.492,979,4.492,980,6.035,981,6.397,982,4.492,983,4.492]],["title/interfaces/ParticipantProperties.html",[114,0.755,889,3.374]],["body/interfaces/ParticipantProperties.html",[3,0.12,4,0.091,5,0.077,6,0.048,9,0.436,27,0.01,37,1.107,38,1.684,53,1.195,54,2.204,62,0.008,63,0.008,106,2.282,114,1.233,141,2.342,144,1.732,294,2.946,309,1.985,367,1.891,401,2.916,606,6.066,690,4.762,709,3.815,767,3.238,798,4.859,873,4.413,875,6.614,889,4.413,891,4.413,892,4.859,893,4.859,894,4.859,895,4.859,984,5.536,985,5.536,986,4.859]],["title/injectables/ParticipantService.html",[567,2.747,605,2.602]],["body/injectables/ParticipantService.html",[3,0.066,4,0.05,5,0.042,6,0.027,9,0.362,17,0.723,18,1.523,23,0.908,27,0.011,37,0.612,38,1.026,42,1.832,44,2.8,52,2.442,53,1.193,54,1.996,55,2.815,56,3.267,57,1.957,62,0.006,63,0.006,67,2.256,83,2.026,85,2.686,90,1.882,91,3.389,141,2.163,144,1.917,294,3.315,298,1.399,309,2.053,325,3.602,333,3.154,387,3.389,401,2.311,408,1.986,545,3.798,546,4.773,547,3.164,569,1.882,580,4.749,581,3.385,587,3.798,603,4.838,605,1.882,610,3.224,616,4.031,665,2.44,676,3.583,690,3.798,691,4.063,692,2.716,709,4.523,716,1.986,769,3.385,877,4.031,899,2.686,906,3.578,909,4.523,910,4.063,987,3.06,988,5.512,989,5.512,990,4.592,991,5.512,992,5.512,993,5.512,994,5.512,995,4.592,996,4.592,997,4.592,998,4.592,999,4.592,1000,4.592,1001,5.512,1002,5.512,1003,5.512,1004,3.06,1005,4.838,1006,3.06,1007,5.512,1008,3.06,1009,3.06,1010,3.06,1011,3.06,1012,3.06,1013,3.06,1014,4.592,1015,3.06,1016,5.512,1017,5.512,1018,4.031,1019,4.031,1020,4.592,1021,3.06,1022,3.06,1023,2.686,1024,3.06,1025,3.06,1026,3.06,1027,3.06,1028,3.06]],["title/interfaces/ParticipantTrackPublication.html",[114,0.755,914,2.916]],["body/interfaces/ParticipantTrackPublication.html",[3,0.105,4,0.079,5,0.067,6,0.042,9,0.381,20,2.041,27,0.01,37,0.967,38,1.58,53,1.292,54,1.77,55,3.201,62,0.008,63,0.008,114,0.862,141,2.115,367,1.652,369,2.382,610,4.765,692,3.123,717,3.855,719,5.563,767,3.707,843,5.892,863,7.017,873,3.855,906,3.139,909,3.332,914,3.332,918,4.114,977,4.244,1029,4.244,1030,4.835,1031,4.835,1032,7.07,1033,7.07,1034,7.07,1035,7.07,1036,7.07,1037,7.07,1038,6.338,1039,6.206,1040,4.835,1041,4.244,1042,4.835,1043,4.835,1044,4.835,1045,4.835,1046,4.835,1047,4.835]],["title/components/ParticipantsPanelComponent.html",[25,0.632,143,1.804]],["body/components/ParticipantsPanelComponent.html",[0,0.006,1,1.171,2,0.8,3,0.062,4,0.047,5,0.039,6,0.046,9,0.224,13,1.134,15,1.211,16,0.351,20,0.915,21,0.568,23,0.65,25,0.648,27,0.009,28,0.478,29,0.84,30,0.584,31,0.328,32,1.094,33,1.585,34,1.299,35,1.912,62,0.005,63,0.005,66,2.266,68,1.513,70,1.064,71,1.211,72,1.587,73,1.587,74,1.348,76,1.845,77,1.348,78,2.095,106,1.171,111,1.985,112,1.851,113,1.299,114,0.507,115,1.348,116,1.348,117,1.134,118,1.916,119,1.254,121,2.139,123,1.171,124,2.798,125,1.348,126,1.958,127,2.798,128,1.254,129,2.761,130,1.348,131,1.171,132,1.348,133,1.299,134,2.059,135,1.254,136,1.098,137,1.299,138,1.348,139,1.851,140,2.246,141,1.431,142,1.348,143,2.709,144,1.846,145,1.299,146,1.098,147,1.348,148,0.889,149,1.348,150,1.348,151,1.171,152,1.348,153,1.299,154,1.348,155,1.098,156,1.348,157,1.171,158,1.348,159,1.171,160,1.348,161,1.171,162,1.348,163,1.171,164,1.348,165,1.171,166,1.348,167,1.134,168,1.348,169,1.171,170,1.348,171,1.171,172,1.348,173,1.171,174,1.348,175,1.171,176,1.348,177,1.171,178,1.348,179,1.171,180,1.348,181,1.171,182,1.348,183,1.79,184,1.348,185,1.171,186,1.348,187,1.171,188,1.299,189,1.348,190,1.732,191,1.348,192,1.171,193,1.348,194,1.171,195,1.348,196,1.171,197,1.299,198,1.348,199,1.171,200,1.299,201,1.348,202,1.171,203,1.299,204,1.348,205,1.171,206,1.348,207,1.171,208,1.348,209,1.171,210,1.299,211,1.348,212,1.134,213,1.348,214,1.171,215,1.348,216,1.171,217,1.348,218,1.171,219,1.299,220,1.348,221,1.171,222,1.299,223,1.348,224,1.171,225,1.299,226,1.348,227,1.134,228,1.348,229,1.171,230,1.299,231,1.348,232,1.171,233,1.299,234,1.348,235,1.171,236,1.299,237,1.348,238,1.171,239,1.299,240,1.348,241,1.171,242,1.299,243,1.348,244,1.171,245,1.299,246,1.348,247,1.171,248,1.299,249,1.348,250,1.171,251,1.299,252,1.348,253,1.171,254,1.299,255,1.348,263,1.4,264,1.587,267,1.4,438,1.098,462,1.519,593,1.748,594,2.266,596,1.587,683,1.845,684,1.845,685,1.748,694,1.845,695,1.845,698,1.958,699,1.958,739,1.845,740,2.095,800,2.266,818,2.095,930,2.495,937,2.095,1048,4.342,1049,3.811,1050,2.842,1051,2.842]],["title/directives/ParticipantsPanelDirective.html",[0,0.005,190,1.688]],["body/directives/ParticipantsPanelDirective.html",[0,0.003,2,0.321,3,0.058,4,0.044,5,0.037,6,0.044,9,0.212,16,0.628,17,0.635,23,0.513,25,0.621,26,0.7,27,0.011,28,0.452,30,0.855,31,0.31,32,0.513,37,0.537,38,1.137,40,2.361,48,1.464,52,0.918,53,0.807,54,0.751,59,1.265,62,0.005,63,0.005,68,1.882,71,1.773,112,1.146,117,1.072,141,1.382,144,2.267,190,1.072,256,1.275,257,1.324,259,1.745,261,1.981,262,3.107,263,1.324,264,1.501,267,1.324,268,2.619,269,2.507,270,1.324,271,1.324,272,2.049,273,1.324,274,1.973,275,1.038,276,1.275,277,1.186,278,1.275,279,1.324,280,2.719,282,1.745,283,1.981,284,1.981,285,1.852,289,1.324,290,1.275,291,1.324,292,1.146,293,1.324,294,2.912,295,2.507,296,1.229,297,1.229,298,1.229,299,1.275,300,1.324,301,1.324,302,1.324,303,1.324,304,1.275,305,2.049,306,2.049,307,1.835,308,2.91,309,1.645,311,1.324,312,1.324,313,2.049,314,1.773,315,2.507,316,2.822,317,2.049,318,1.324,319,1.324,320,1.324,321,2.507,322,1.324,323,1.324,324,1.324,325,1.902,326,1.324,327,1.275,328,1.324,329,1.324,330,2.326,331,1.324,332,1.324,333,1.186,334,1.324,335,1.324,336,1.324,337,1.324,338,1.557,339,2.049,340,1.324,341,2.049,342,0.946,343,1.229,344,1.324,345,1.324,346,1.324,347,1.275,349,1.324,350,1.852,351,1.852,352,1.572,355,1.745,357,3.947,358,1.653,359,3.129,360,3.129,400,1.572,401,1.464,402,1.501,403,1.501,409,2.609,410,2.143,412,1.572,413,2.223,427,2.719,428,1.501,429,1.572,430,2.323,431,1.436,432,1.572,433,1.501,434,1.572,544,1.981,585,1.981,605,3.129,610,1.572,690,1.852,691,3.066,692,2.507,696,1.653,701,2.359,709,3.947,727,4.467,745,2.359,746,2.359,747,4.467,748,2.359,749,2.359,751,2.359,752,2.359,753,2.359,754,2.359,755,2.359,756,2.359,757,2.359,758,2.359,759,4.567,760,2.359,761,2.359,762,2.359,763,2.359,766,1.572,818,3.066,953,1.981,961,1.745,1052,2.688,1053,2.688,1054,2.688,1055,2.688,1056,2.688,1057,4.16,1058,2.688,1059,2.143,1060,2.688,1061,2.688]],["title/interfaces/ParticipantsPanelStatusEvent.html",[114,0.755,810,3.119]],["body/interfaces/ParticipantsPanelStatusEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,367,2.284,368,4.111,369,3.294,370,4.34,810,4.929]],["title/directives/PrejoinDirective.html",[0,0.005,192,1.744]],["body/directives/PrejoinDirective.html",[0,0.008,2,0.744,3,0.135,4,0.102,5,0.086,6,0.054,9,0.491,11,1.432,12,2.407,16,0.769,17,1.473,21,1.246,26,1.049,27,0.01,28,1.049,30,1.281,31,0.719,32,0.769,33,1.112,62,0.009,63,0.009,192,2.569,438,2.407,542,3.33,927,5.923,928,4.294,1062,6.232,1063,4.968,1064,6.232,1065,6.232]],["title/components/RecordingActivityComponent.html",[25,0.632,145,1.935]],["body/components/RecordingActivityComponent.html",[1,0.952,2,0.688,3,0.05,4,0.038,5,0.032,6,0.04,9,0.182,11,0.531,13,0.921,14,2.721,15,0.984,16,0.285,21,0.462,23,0.569,25,0.551,27,0.011,28,0.389,31,0.266,32,1.08,33,1.567,34,1.056,35,1.673,53,0.914,62,0.005,63,0.005,64,1.841,67,1.702,68,1.06,70,2.651,71,0.984,72,1.289,73,1.289,74,1.095,76,1.499,77,1.095,79,1.351,81,3.369,82,3.54,83,3.125,84,3.239,85,3.081,86,1.591,87,1.968,88,3.239,90,3.542,91,3.542,93,1.591,95,1.702,96,2.721,97,1.591,98,1.841,99,2.721,100,1.591,101,1.841,102,1.841,103,1.591,104,1.702,105,1.591,106,1.521,107,1.702,108,1.499,109,1.702,110,1.499,111,1.687,112,0.984,113,1.056,114,0.412,115,1.095,116,1.095,117,0.921,118,1.628,119,1.019,123,0.952,124,2.498,125,1.095,127,2.498,128,1.019,129,2.532,130,1.095,131,0.952,132,1.095,133,1.056,134,1.75,135,1.019,136,0.892,137,1.056,138,1.095,139,0.984,140,0.984,141,1.002,142,1.095,143,0.984,144,0.722,145,2.408,146,0.892,147,1.095,148,0.722,149,1.095,150,1.095,151,0.952,152,1.095,153,1.056,154,1.095,155,0.892,156,1.095,157,0.952,158,1.095,159,0.952,160,1.095,161,0.952,162,1.095,163,0.952,164,1.095,165,0.952,166,1.095,167,0.921,168,1.095,169,0.952,170,1.095,171,0.952,172,1.095,173,0.952,174,1.095,175,0.952,176,1.095,177,0.952,178,1.095,179,0.952,180,1.095,181,0.952,182,1.095,183,0.952,184,1.095,185,0.952,186,1.095,187,0.952,188,1.056,189,1.095,190,0.921,191,1.095,192,0.952,193,1.095,194,0.952,195,1.095,196,0.952,197,1.056,198,1.095,199,0.952,200,1.056,201,1.095,202,0.952,203,1.056,204,1.095,205,0.952,206,1.095,207,0.952,208,1.095,209,0.952,210,1.056,211,1.095,212,0.921,213,1.095,214,0.952,215,1.095,216,0.952,217,1.095,218,0.952,219,1.056,220,1.095,221,0.952,222,1.056,223,1.095,224,0.952,225,1.056,226,1.095,227,0.921,228,1.095,229,0.952,230,1.056,231,1.095,232,0.952,233,1.056,234,1.095,235,0.952,236,1.056,237,1.095,238,0.952,239,1.056,240,1.095,241,0.952,242,1.056,243,1.095,244,0.952,245,1.056,246,1.095,247,0.952,248,1.056,249,1.095,250,0.952,251,1.056,252,1.095,253,0.952,254,1.056,255,1.095,338,0.864,343,1.056,390,1.499,438,0.892,462,3.866,471,2.027,473,2.027,478,2.027,479,1.591,483,2.027,484,1.841,485,2.027,486,3.24,487,1.841,488,2.027,551,2.027,552,2.027,553,2.027,558,2.027,740,2.721,1066,2.309,1067,2.309,1068,2.309,1069,2.027,1070,2.309,1071,2.309,1072,1.591,1073,2.309,1074,2.309,1075,2.027,1076,2.027,1077,2.309,1078,2.309,1079,2.309,1080,2.309,1081,2.309,1082,2.309,1083,2.309,1084,2.309,1085,2.309,1086,2.309,1087,2.309]],["title/interfaces/RecordingDeleteRequestedEvent.html",[97,2.916,114,0.755]],["body/interfaces/RecordingDeleteRequestedEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,97,4.608,367,2.284,369,3.294,1088,3.733,1089,4.111]],["title/interfaces/RecordingDownloadClickedEvent.html",[100,2.916,114,0.755]],["body/interfaces/RecordingDownloadClickedEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,100,4.608,367,2.284,369,3.294,1088,3.733,1089,4.111]],["title/interfaces/RecordingEvent.html",[114,0.755,1089,2.602]],["body/interfaces/RecordingEvent.html",[3,0.134,4,0.102,5,0.086,6,0.054,9,0.488,27,0.01,37,1.237,38,1.654,53,1.174,54,2.066,62,0.009,63,0.009,70,2.317,83,2.731,114,1.104,307,3.492,309,2.355,367,2.115,566,3.621,1088,3.456,1089,3.806,1090,7.914]],["title/interfaces/RecordingInfo.html",[114,0.755,459,2.916]],["body/interfaces/RecordingInfo.html",[3,0.106,4,0.08,5,0.067,6,0.042,9,0.383,27,0.011,37,0.972,38,1.422,53,1.358,54,2.414,55,2.381,62,0.008,63,0.008,70,1.82,114,0.867,307,3.127,309,2.425,342,2.495,367,1.661,459,3.35,484,5.651,487,6.596,566,2.843,1019,6.222,1072,4.383,1088,2.714,1091,7.088,1092,7.088,1093,7.088,1094,7.088,1095,7.088,1096,7.088,1097,7.088,1098,7.088,1099,5.582]],["title/interfaces/RecordingPlayClickedEvent.html",[103,2.916,114,0.755]],["body/interfaces/RecordingPlayClickedEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,103,4.608,367,2.284,369,3.294,1088,3.733,1089,4.111]],["title/injectables/RecordingService.html",[567,2.747,1100,3.714]],["body/injectables/RecordingService.html",[3,0.124,4,0.094,5,0.079,6,0.05,27,0.01,37,1.141,38,1.575,42,2.81,44,2.61,53,0.905,56,2.721,57,3.002,62,0.009,63,0.009,70,2.986,342,2.01,450,5.616,569,3.51,574,4.854,575,4.551,576,4.572,577,6.183,578,4.551,579,5.616,580,4.854,581,4.208,1072,4.854,1100,5.01,1101,5.708,1102,7.044,1103,7.639,1104,7.639,1105,7.044,1106,7.044,1107,3.934]],["title/interfaces/RecordingStartRequestedEvent.html",[108,2.747,114,0.755]],["body/interfaces/RecordingStartRequestedEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,108,4.34,367,2.284,369,3.294,1088,3.733,1089,4.111]],["title/interfaces/RecordingStatusInfo.html",[114,0.755,1108,3.714]],["body/interfaces/RecordingStatusInfo.html",[3,0.127,4,0.096,5,0.081,6,0.051,9,0.46,27,0.01,37,1.166,38,1.596,53,1.275,54,2.245,62,0.009,63,0.009,70,2.184,114,1.041,309,2.051,338,2.888,342,2.83,367,1.994,459,4.92,479,4.92,566,3.413,584,3.413,585,4.301,1072,4.92,1088,3.258,1108,5.122,1109,7.714,1110,7.714]],["title/interfaces/RecordingStopRequestedEvent.html",[110,2.747,114,0.755]],["body/interfaces/RecordingStopRequestedEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,110,4.34,367,2.284,369,3.294,1088,3.733,1089,4.111]],["title/pipes/RemoteParticipantTracksPipe.html",[713,3.374,725,3.119]],["body/pipes/RemoteParticipantTracksPipe.html",[3,0.133,4,0.1,5,0.084,6,0.053,9,0.481,11,1.404,18,2.026,23,0.906,27,0.01,31,0.705,42,2.436,52,2.087,53,0.969,54,1.706,56,2.359,62,0.009,63,0.009,118,2.695,144,2.297,687,4.502,692,3.616,705,6.274,709,4.209,713,5.852,732,4.502,914,4.209,1111,6.107,1112,6.107,1113,6.107,1114,6.107]],["title/interfaces/SettingsPanelStatusEvent.html",[114,0.755,813,3.119]],["body/interfaces/SettingsPanelStatusEvent.html",[3,0.145,4,0.11,5,0.092,6,0.058,27,0.009,62,0.009,63,0.009,367,2.284,368,4.111,369,3.294,370,4.34,813,4.929]],["title/components/StreamComponent.html",[25,0.632,146,1.635]],["body/components/StreamComponent.html",[0,0.003,1,1.145,2,0.793,3,0.06,4,0.046,5,0.038,6,0.051,9,0.219,13,1.108,15,1.184,16,0.641,21,0.555,23,0.719,25,0.415,27,0.01,28,0.467,30,0.571,31,0.321,32,1.092,33,1.583,34,1.27,35,1.885,37,0.555,45,2.187,47,2.102,52,0.949,53,0.824,54,0.776,55,1.944,56,1.073,57,1.184,62,0.005,63,0.005,68,1.225,70,1.04,71,1.184,74,1.317,77,1.317,106,1.145,111,1.27,112,1.184,113,1.27,114,0.495,115,1.317,116,1.317,117,1.108,118,2.292,119,1.225,120,1.708,121,2.102,123,1.145,124,2.764,125,1.317,127,2.764,128,1.225,129,2.736,130,1.317,131,1.145,132,1.317,133,1.27,134,2.023,135,1.225,136,1.073,137,1.95,138,1.317,139,1.184,140,1.184,141,1.411,142,1.317,143,1.184,144,0.869,145,1.27,146,2.429,147,1.317,148,0.869,149,1.317,150,1.317,151,1.145,152,1.317,153,1.27,154,1.317,155,1.073,156,1.317,157,1.145,158,1.317,159,1.145,160,1.317,161,1.145,162,1.317,163,1.145,164,1.317,165,1.145,166,1.317,167,1.108,168,1.317,169,1.145,170,1.317,171,1.145,172,1.317,173,1.145,174,1.317,175,1.145,176,1.317,177,1.145,178,1.317,179,1.145,180,1.317,181,1.145,182,1.317,183,1.145,184,1.317,185,1.145,186,1.317,187,1.145,188,1.27,189,1.317,190,1.108,191,1.317,192,1.145,193,1.317,194,1.758,195,1.317,196,1.758,197,1.27,198,1.317,199,1.758,200,1.27,201,1.317,202,1.758,203,1.27,204,1.317,205,1.145,206,1.317,207,1.145,208,1.317,209,1.145,210,1.27,211,1.317,212,1.108,213,1.317,214,1.145,215,1.317,216,1.145,217,1.317,218,1.145,219,1.27,220,1.317,221,1.145,222,1.27,223,1.317,224,1.145,225,1.27,226,1.317,227,1.108,228,1.317,229,1.145,230,1.27,231,1.317,232,1.145,233,1.27,234,1.317,235,1.145,236,1.27,237,1.317,238,1.145,239,1.27,240,1.317,241,1.145,242,1.27,243,1.317,244,1.145,245,1.27,246,1.317,247,1.145,248,1.27,249,1.317,250,1.145,251,1.27,252,1.317,253,1.145,254,1.27,255,1.317,267,1.368,376,1.424,593,1.708,596,1.551,610,3.679,683,1.803,684,1.803,685,1.708,687,2.047,697,2.623,700,2.047,814,2.047,815,2.047,914,3.579,916,1.625,946,2.438,947,2.438,1115,2.777,1116,2.777,1117,2.777,1118,2.777,1119,2.438,1120,2.438,1121,2.438,1122,2.777,1123,2.777,1124,2.777,1125,2.777,1126,2.777]],["title/directives/StreamDirective.html",[0,0.005,194,1.744]],["body/directives/StreamDirective.html",[0,0.005,2,0.358,3,0.065,4,0.049,5,0.041,6,0.047,9,0.236,11,0.69,16,0.749,17,0.709,23,0.558,25,0.906,26,0.917,27,0.011,31,0.346,32,0.558,37,0.6,38,1.011,40,2.5,48,1.056,52,1.025,53,0.864,54,0.838,59,1.375,62,0.006,63,0.006,117,1.197,141,0.815,146,1.159,194,1.237,256,1.423,257,1.478,259,1.947,261,2.211,262,3.086,263,2.229,264,1.675,265,2.319,268,2.772,269,2.683,270,1.478,271,1.478,272,2.229,273,1.478,274,2.146,275,1.159,276,1.423,277,1.324,278,1.423,279,2.229,280,1.603,289,1.478,290,1.423,291,1.478,292,1.279,293,1.478,294,2.322,295,2.683,296,1.372,297,1.372,298,1.372,299,1.423,300,1.478,301,1.478,302,1.478,303,1.478,304,1.423,305,2.229,306,2.229,307,1.996,308,3.012,309,1.742,310,2.067,311,1.478,312,1.478,313,2.229,314,1.928,315,2.683,316,2.988,317,2.229,318,1.478,319,1.478,320,1.478,321,2.683,322,1.478,323,1.478,324,1.478,325,1.372,326,1.478,327,1.423,328,1.478,329,1.478,330,2.49,331,1.478,332,1.478,333,1.324,334,1.478,335,1.478,336,1.478,337,1.478,338,1.693,339,2.229,340,1.478,341,2.229,342,1.056,343,1.372,344,1.478,345,1.478,346,1.478,347,1.423,349,1.478,350,2.067,351,2.067,352,1.755,358,1.845,359,3.349,360,3.349,377,2.319,400,1.755,401,1.593,402,1.675,403,2.526,409,1.538,412,2.646,413,2.418,414,1.845,427,2.91,428,1.675,429,1.755,430,1.675,431,1.603,432,1.755,433,1.675,434,1.755,435,2.211,502,2.067,528,2.067,610,3.186,663,2.392,676,2.646,692,1.478,696,1.845,697,3.349,700,4.015,706,2.937,717,2.392,731,5.323,740,2.211,743,2.633,759,2.392,766,1.755,783,2.067,825,1.947,948,2.392,949,2.392,950,2.392,951,2.392,953,2.211,961,1.947,1127,3.607,1128,3,1129,3,1130,3,1131,3,1132,3,1133,3,1134,3,1135,3,1136,3,1137,3,1138,3,1139,3,1140,3]],["title/directives/StreamDisplayAudioDetectionDirective.html",[0,0.005,196,1.744]],["body/directives/StreamDisplayAudioDetectionDirective.html",[0,0.006,2,0.548,3,0.1,4,0.075,5,0.063,6,0.04,9,0.362,11,1.056,12,1.774,16,0.567,17,1.085,18,2.032,19,1.774,20,1.479,21,0.918,22,1.774,23,0.946,25,0.915,26,1.031,27,0.011,28,0.773,29,1.357,30,0.944,31,0.53,32,0.567,33,1.093,37,0.918,38,1.369,40,2.525,41,4.211,42,2.444,43,3.684,44,2.801,45,3.14,47,3.018,48,1.617,49,2.454,50,3.274,51,3.274,52,2.512,53,1.296,54,2.054,55,3.097,56,2.84,57,3.134,58,2.454,59,2.096,62,0.007,63,0.007,144,1.437,146,1.774,196,1.893,197,2.1,697,3.767,918,2.981,1120,6.724,1141,3.662,1142,4.593,1143,4.593,1144,6.126,1145,6.454,1146,4.593,1147,4.593]],["title/directives/StreamDisplayParticipantNameDirective.html",[0,0.005,199,1.744]],["body/directives/StreamDisplayParticipantNameDirective.html",[0,0.006,2,0.55,3,0.1,4,0.076,5,0.064,6,0.04,9,0.363,11,1.058,12,1.779,16,0.568,17,1.088,18,2.035,19,1.779,20,1.483,21,0.92,22,1.779,23,0.973,25,0.916,26,1.033,27,0.011,28,0.775,29,1.361,30,0.947,31,0.531,32,0.568,33,1.095,37,0.92,38,1.372,40,2.529,41,4.214,42,2.448,43,3.688,44,2.805,45,3.146,47,3.023,48,1.621,49,2.461,50,3.279,51,3.279,52,2.515,53,1.297,54,2.056,55,3.099,56,2.843,57,3.138,58,2.461,59,2.098,62,0.008,63,0.008,144,1.441,146,1.779,199,1.898,200,2.105,697,3.773,1119,6.729,1141,3.671,1148,4.604,1149,6.136,1150,6.461,1151,4.604,1152,4.604]],["title/directives/StreamVideoControlsDirective.html",[0,0.005,202,1.744]],["body/directives/StreamVideoControlsDirective.html",[0,0.006,2,0.548,3,0.1,4,0.075,5,0.063,6,0.04,9,0.362,11,1.056,12,1.774,16,0.567,17,1.085,18,2.032,19,1.774,20,1.479,21,0.918,22,1.774,23,0.946,25,0.915,26,1.031,27,0.011,28,0.773,29,1.357,30,0.944,31,0.53,32,0.567,33,1.093,37,0.918,38,1.369,40,2.525,41,4.211,42,2.444,43,3.684,44,2.801,45,3.14,47,3.018,48,1.617,49,2.454,50,3.274,51,3.274,52,2.512,53,1.296,54,2.054,55,3.097,56,2.84,57,3.134,58,2.454,59,2.096,62,0.007,63,0.007,144,1.437,146,1.774,202,1.893,203,2.1,697,3.767,778,4.031,916,2.687,1121,6.724,1141,3.662,1153,4.593,1154,6.126,1155,6.454,1156,4.593,1157,4.593]],["title/directives/TokenDirective.html",[0,0.005,205,1.744]],["body/directives/TokenDirective.html",[0,0.007,2,0.729,3,0.133,4,0.1,5,0.084,6,0.053,9,0.481,16,0.754,21,1.221,26,1.028,27,0.01,28,1.028,30,1.256,31,0.705,32,0.754,33,1.089,62,0.009,63,0.009,141,1.993,205,2.517,275,2.359,308,3.243,314,2.603,401,2.584,438,2.359,542,3.264,706,3.965,716,3.965,769,4.502,770,4.869,773,5.361,1158,6.107]],["title/directives/TokenErrorDirective.html",[0,0.005,207,1.744]],["body/directives/TokenErrorDirective.html",[0,0.007,2,0.739,3,0.134,4,0.102,5,0.086,6,0.054,9,0.488,11,1.423,16,0.764,21,1.237,26,1.042,27,0.01,28,1.042,30,1.273,31,0.714,32,0.764,33,1.104,62,0.009,63,0.009,207,2.551,308,2.551,338,2.317,343,2.83,413,3.308,438,2.391,542,3.308,587,4.265,732,4.563,1159,5.433,1160,6.19,1161,6.19,1162,6.19,1163,6.19]],["title/directives/ToolbarActivitiesPanelButtonDirective.html",[0,0.005,209,1.744]],["body/directives/ToolbarActivitiesPanelButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,35,2.18,62,0.009,63,0.009,68,1.726,87,2.052,148,1.88,209,2.476,210,2.746,1164,2.849,1165,5.273,1166,2.995,1167,6.007]],["title/directives/ToolbarAdditionalButtonsDirective.html",[0,0.005,212,1.688]],["body/directives/ToolbarAdditionalButtonsDirective.html",[0,0.004,2,0.38,3,0.069,4,0.052,5,0.044,6,0.049,9,0.251,16,0.584,17,0.752,18,1.055,23,0.393,25,0.706,26,0.796,27,0.011,31,0.367,32,0.584,48,1.12,59,1.438,62,0.006,63,0.006,87,1.087,106,1.949,112,1.356,212,1.269,227,1.269,256,1.509,257,1.568,262,1.509,268,3.197,269,2.78,270,1.568,271,1.568,272,2.329,273,1.568,274,2.242,275,1.229,276,1.509,277,1.404,278,1.509,279,1.568,289,1.568,290,1.509,291,1.568,292,1.356,293,1.568,294,2.405,295,2.78,296,1.455,297,1.455,298,1.455,299,1.509,300,1.568,301,1.568,302,1.568,303,1.568,304,1.509,305,2.329,306,2.329,307,2.086,308,2.984,309,1.794,311,1.568,312,1.568,313,2.329,314,2.015,315,2.78,316,3.077,317,2.329,318,1.568,319,1.568,320,1.568,321,2.78,322,1.568,323,1.568,324,1.568,325,2.579,326,1.568,327,2.676,328,2.78,329,1.568,330,2.579,331,1.568,332,1.568,333,1.404,334,1.568,335,1.568,336,1.568,337,1.568,338,1.77,339,2.329,340,1.568,341,2.329,342,1.12,343,1.455,344,1.568,345,1.568,346,1.568,347,1.509,348,3.77,349,1.568,372,2.537,380,3.485,381,2.346,382,3.485,383,2.346,401,1.12,409,2.892,427,1.701,545,2.193,605,3.84,696,1.957,766,1.861,781,2.537,825,2.066,854,2.537,878,2.537,879,2.537,906,2.066,916,3.3,918,2.066,938,2.766,961,2.066,1059,2.537,1166,1.949,1168,3.77,1169,3.182,1170,3.182,1171,3.182,1172,3.182,1173,2.537,1174,2.793,1175,2.793,1176,3.182,1177,3.182,1178,3.182,1179,3.182,1180,2.793,1181,4.728,1182,3.182,1183,4.728,1184,2.537,1185,4.15,1186,4.728,1187,2.793,1188,2.793,1189,2.793,1190,2.793,1191,2.793,1192,2.793,1193,2.793,1194,3.182,1195,3.182]],["title/directives/ToolbarAdditionalButtonsPossitionDirective.html",[0,0.005,214,1.744]],["body/directives/ToolbarAdditionalButtonsPossitionDirective.html",[0,0.007,2,0.734,3,0.133,4,0.101,5,0.085,6,0.053,9,0.484,16,0.759,18,2.039,20,1.98,26,1.035,27,0.01,28,1.035,29,1.817,30,1.264,31,0.71,32,0.759,62,0.009,63,0.009,212,2.452,214,2.534,374,3.286,596,3.433,938,3.597,1029,5.397,1127,4.902,1164,2.916,1196,7.369,1197,6.148,1198,5.397,1199,6.148,1200,5.397,1201,5.397,1202,6.148]],["title/directives/ToolbarAdditionalPanelButtonsDirective.html",[0,0.005,216,1.744]],["body/directives/ToolbarAdditionalPanelButtonsDirective.html",[0,0.004,2,0.406,3,0.074,4,0.056,5,0.047,6,0.051,9,0.268,11,0.782,16,0.613,17,0.804,23,0.42,25,0.741,26,0.836,27,0.011,31,0.392,32,0.613,59,1.51,62,0.006,63,0.006,68,1.684,87,1.696,88,2.091,141,0.923,155,1.314,216,1.402,256,1.613,257,1.675,262,1.613,265,1.743,268,3.274,269,2.889,270,1.675,271,1.675,272,2.446,273,1.675,274,2.355,275,1.314,276,1.613,277,1.5,278,1.613,279,1.675,289,1.675,290,1.613,291,1.675,292,1.45,293,1.675,294,2.5,295,2.889,296,1.555,297,1.555,298,1.555,299,1.613,300,1.675,301,1.675,302,1.675,303,1.675,304,1.613,305,2.446,306,2.446,307,2.191,308,3.048,309,1.852,310,2.343,311,1.675,312,1.675,313,2.446,314,2.116,315,2.889,316,3.177,317,2.446,318,1.675,319,1.675,320,1.675,321,2.889,322,1.675,323,1.675,324,1.675,325,1.555,326,1.675,327,1.613,328,1.675,329,1.675,330,2.681,331,1.675,332,1.675,333,1.5,334,1.675,335,1.675,336,1.675,337,1.675,338,1.859,339,2.446,340,1.675,341,2.446,342,1.197,343,1.555,344,1.675,345,2.446,346,1.675,347,1.613,349,1.675,353,2.711,374,2.653,376,1.743,380,3.66,381,2.507,382,3.66,383,2.507,385,2.985,401,1.197,402,1.899,403,1.899,409,1.743,413,1.817,424,2.711,431,1.817,439,2.343,574,2.343,767,1.989,853,4.675,938,1.989,963,2.985,1166,2.046,1173,2.711,1203,3.958,1204,2.985,1205,2.985,1206,3.4,1207,3.4,1208,3.4,1209,3.4,1210,3.4,1211,3.4,1212,2.985]],["title/directives/ToolbarBackgroundEffectsButtonDirective.html",[0,0.005,218,1.744]],["body/directives/ToolbarBackgroundEffectsButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,62,0.009,63,0.009,87,2.052,148,1.88,218,2.476,219,2.746,280,3.21,844,4.789,1164,2.849,1166,2.995,1213,5.273,1214,6.007]],["title/directives/ToolbarBroadcastingButtonDirective.html",[0,0.005,221,1.744]],["body/directives/ToolbarBroadcastingButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,13,2.396,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,62,0.009,63,0.009,87,2.052,148,1.88,221,2.476,222,2.746,1164,2.849,1166,2.995,1215,5.273,1216,5.273,1217,6.007]],["title/directives/ToolbarChatPanelButtonDirective.html",[0,0.005,224,1.744]],["body/directives/ToolbarChatPanelButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,62,0.009,63,0.009,68,1.726,87,2.052,136,2.321,148,1.88,224,2.476,225,2.746,1164,2.849,1166,2.995,1218,5.273,1219,6.007]],["title/components/ToolbarComponent.html",[25,0.632,148,1.324]],["body/components/ToolbarComponent.html",[0,0.005,1,0.843,2,0.694,3,0.044,4,0.034,5,0.028,6,0.043,9,0.161,13,1.335,15,0.872,16,0.606,17,1.16,20,0.659,21,0.669,23,0.524,25,0.306,27,0.011,28,0.344,29,0.605,30,0.421,31,0.236,32,1.072,33,1.555,34,0.935,35,1.542,53,1.051,55,2.666,62,0.004,63,0.004,68,0.961,70,1.59,71,0.872,72,1.142,73,1.142,74,0.97,77,0.97,79,1.197,81,3.744,82,2.775,83,3.079,84,2.058,85,1.958,86,1.41,87,0.699,90,2.612,91,2.612,92,1.508,93,2.307,94,1.328,104,1.508,105,1.41,106,1.38,107,1.508,108,1.328,109,1.508,110,1.328,111,0.935,112,1.427,113,0.935,114,0.365,115,0.97,116,0.97,117,0.816,118,1.874,119,0.903,120,1.258,121,2.093,123,0.843,124,2.328,125,0.97,127,2.328,128,0.903,129,2.395,130,0.97,131,0.843,132,0.97,133,0.935,134,1.588,135,0.903,136,1.293,137,0.935,138,0.97,139,0.872,140,0.872,141,0.909,142,0.97,143,0.872,144,1.047,145,0.935,146,0.79,147,0.97,148,1.694,149,0.97,150,0.97,151,0.843,152,0.97,153,0.935,154,0.97,155,0.79,156,0.97,157,0.843,158,0.97,159,0.843,160,0.97,161,0.843,162,0.97,163,0.843,164,0.97,165,0.843,166,0.97,167,0.816,168,0.97,169,0.843,170,0.97,171,0.843,172,0.97,173,0.843,174,0.97,175,0.843,176,0.97,177,0.843,178,0.97,179,0.843,180,0.97,181,0.843,182,0.97,183,0.843,184,0.97,185,0.843,186,0.97,187,0.843,188,0.935,189,0.97,190,0.816,191,0.97,192,0.843,193,0.97,194,0.843,195,0.97,196,0.843,197,0.935,198,0.97,199,0.843,200,0.935,201,0.97,202,0.843,203,0.935,204,0.97,205,0.843,206,0.97,207,0.843,208,0.97,209,1.38,210,0.935,211,0.97,212,1.335,213,0.97,214,0.843,215,0.97,216,1.38,217,0.97,218,1.38,219,0.935,220,0.97,221,1.38,222,0.935,223,0.97,224,1.38,225,0.935,226,0.97,227,1.335,228,0.97,229,1.38,230,0.935,231,0.97,232,1.38,233,0.935,234,0.97,235,1.38,236,0.935,237,0.97,238,1.38,239,0.935,240,0.97,241,1.38,242,0.935,243,0.97,244,1.38,245,0.935,246,0.97,247,1.38,248,0.935,249,0.97,250,1.38,251,0.935,252,0.97,253,0.843,254,0.935,255,0.97,267,1.008,374,1.093,375,1.41,376,1.716,401,0.72,408,3.186,448,1.508,462,3.806,479,1.41,481,1.796,546,3.186,547,3.382,554,2.938,584,2.871,593,1.258,596,1.142,683,1.328,684,1.328,685,1.258,694,3.514,695,1.328,698,1.41,699,1.41,781,1.631,812,1.258,814,1.508,815,1.508,868,3.913,909,2.307,910,2.467,916,2.871,938,1.197,959,1.796,968,1.631,1063,1.631,1069,2.938,1075,1.796,1076,1.796,1107,3.382,1165,1.796,1166,1.38,1168,1.631,1180,1.796,1184,2.669,1203,1.631,1213,1.796,1215,1.796,1218,1.796,1220,2.046,1221,2.046,1222,2.046,1223,2.046,1224,2.046,1225,2.046,1226,1.796,1227,4.751,1228,1.796,1229,3.387,1230,1.796,1231,1.796,1232,1.796,1233,1.631,1234,1.796,1235,1.796,1236,1.796,1237,1.796,1238,1.796,1239,1.796,1240,1.796,1241,1.796,1242,2.046,1243,2.046,1244,2.046,1245,2.046,1246,2.046,1247,2.046,1248,3.347,1249,2.046,1250,2.046,1251,2.046,1252,2.046,1253,2.046,1254,2.046,1255,2.046,1256,2.046,1257,2.046,1258,2.046,1259,2.046,1260,2.046,1261,2.046,1262,2.046,1263,2.046,1264,2.046,1265,2.046,1266,2.046]],["title/directives/ToolbarDirective.html",[0,0.005,227,1.688]],["body/directives/ToolbarDirective.html",[0,0.004,2,0.396,3,0.072,4,0.055,5,0.046,6,0.05,9,0.262,11,0.763,16,0.787,17,0.785,18,1.101,23,0.41,25,0.864,26,0.821,27,0.011,31,0.383,32,0.602,48,1.169,59,1.483,62,0.006,63,0.006,118,1.465,141,1.325,227,1.325,256,1.575,257,1.636,262,1.575,263,2.404,264,1.854,265,1.702,267,1.636,268,2.915,269,2.85,270,1.636,271,1.636,272,2.404,273,1.636,274,2.314,275,1.283,276,1.575,277,1.465,278,1.575,289,1.636,290,1.575,291,1.636,292,1.415,293,1.636,294,2.466,295,2.85,296,1.518,297,1.518,298,1.518,299,1.575,300,1.636,301,1.636,302,1.636,303,1.636,304,1.575,305,2.404,306,2.404,307,2.153,308,3.025,309,1.831,311,1.636,312,1.636,313,2.404,314,2.08,315,2.85,316,3.141,317,2.404,318,1.636,319,1.636,320,1.636,321,2.85,322,1.636,323,1.636,324,1.636,325,2.644,326,1.636,327,2.743,328,2.85,329,1.636,330,2.644,331,1.636,332,1.636,333,1.465,334,1.636,335,1.636,336,1.636,337,1.636,338,1.826,339,2.404,340,1.636,341,2.404,342,1.169,343,1.518,344,2.404,345,1.636,346,1.636,347,1.575,349,1.636,377,1.702,401,1.169,409,2.965,424,3.89,439,3.362,545,2.288,605,3.92,767,1.942,878,2.647,879,2.647,906,2.155,916,2.854,918,3.167,938,1.942,1059,2.647,1166,2.384,1173,2.647,1184,2.647,1185,4.283,1187,4.283,1188,2.915,1189,2.915,1190,4.283,1191,2.915,1192,2.915,1204,2.915,1212,2.915,1233,3.89,1267,2.915,1268,3.32,1269,3.32]],["title/directives/ToolbarDisplayLogoDirective.html",[0,0.005,229,1.744]],["body/directives/ToolbarDisplayLogoDirective.html",[0,0.007,2,0.722,3,0.131,4,0.099,5,0.084,6,0.053,9,0.476,11,1.39,12,2.336,16,0.746,17,1.429,18,2.42,19,2.336,20,1.948,21,1.209,22,2.336,23,0.746,25,0.903,26,1.228,27,0.01,28,1.018,29,1.787,30,1.243,31,0.698,32,0.746,33,1.301,62,0.009,63,0.009,148,1.892,229,2.492,230,2.765,1164,2.868,1166,2.492,1241,5.308,1270,6.047,1271,5.308,1272,6.047]],["title/directives/ToolbarDisplayRoomNameDirective.html",[0,0.005,232,1.744]],["body/directives/ToolbarDisplayRoomNameDirective.html",[0,0.007,2,0.722,3,0.131,4,0.099,5,0.084,6,0.053,9,0.476,11,1.39,12,2.336,16,0.746,17,1.429,18,2.42,19,2.336,20,1.948,21,1.209,22,2.336,23,0.901,25,0.903,26,1.228,27,0.01,28,1.018,29,1.787,30,1.243,31,0.698,32,0.746,33,1.301,62,0.009,63,0.009,148,1.892,232,2.492,233,2.765,401,2.129,1164,2.868,1166,2.492,1240,5.308,1273,6.047]],["title/directives/ToolbarFullscreenButtonDirective.html",[0,0.005,235,1.744]],["body/directives/ToolbarFullscreenButtonDirective.html",[0,0.007,2,0.72,3,0.131,4,0.099,5,0.083,6,0.052,9,0.475,11,1.385,12,2.328,16,0.744,17,1.424,18,2.415,19,2.328,20,1.941,21,1.205,22,2.328,23,0.744,25,0.9,26,1.225,27,0.01,28,1.014,29,1.781,30,1.239,31,0.696,32,0.744,33,1.299,62,0.009,63,0.009,87,2.059,148,1.886,235,2.484,236,2.755,1164,2.858,1166,3.001,1229,4.805,1236,5.29,1274,6.027]],["title/directives/ToolbarLeaveButtonDirective.html",[0,0.005,238,1.744]],["body/directives/ToolbarLeaveButtonDirective.html",[0,0.007,2,0.72,3,0.131,4,0.099,5,0.083,6,0.052,9,0.475,11,1.385,12,2.328,16,0.744,17,1.424,18,2.415,19,2.328,20,1.941,21,1.205,22,2.328,23,0.744,25,0.9,26,1.225,27,0.01,28,1.014,29,1.781,30,1.239,31,0.696,32,0.744,33,1.299,62,0.009,63,0.009,87,2.059,148,1.886,238,2.484,239,2.755,296,2.755,1164,2.858,1166,3.001,1238,5.29,1275,6.027]],["title/directives/ToolbarParticipantsPanelButtonDirective.html",[0,0.005,241,1.744]],["body/directives/ToolbarParticipantsPanelButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,62,0.009,63,0.009,68,1.726,87,2.052,144,1.88,148,1.88,241,2.476,242,2.746,1164,2.849,1166,2.995,1239,5.273,1276,6.007]],["title/directives/ToolbarRecordingButtonDirective.html",[0,0.005,244,1.744]],["body/directives/ToolbarRecordingButtonDirective.html",[0,0.007,2,0.717,3,0.13,4,0.099,5,0.083,6,0.052,9,0.473,11,1.381,12,2.321,16,0.742,17,1.42,18,2.41,19,2.321,20,1.935,21,1.201,22,2.321,23,0.742,25,0.897,26,1.223,27,0.01,28,1.011,29,1.775,30,1.235,31,0.693,32,0.742,33,1.296,62,0.009,63,0.009,70,2.249,87,2.052,148,1.88,244,2.476,245,2.746,1164,2.849,1166,2.995,1216,5.273,1235,5.273,1277,6.007]],["title/directives/ToolbarScreenshareButtonDirective.html",[0,0.005,247,1.744]],["body/directives/ToolbarScreenshareButtonDirective.html",[0,0.007,2,0.72,3,0.131,4,0.099,5,0.083,6,0.052,9,0.475,11,1.385,12,2.328,16,0.744,17,1.424,18,2.415,19,2.328,20,1.941,21,1.205,22,2.328,23,0.744,25,0.9,26,1.225,27,0.01,28,1.014,29,1.781,30,1.239,31,0.696,32,0.744,33,1.299,62,0.009,63,0.009,87,2.059,148,1.886,247,2.484,248,2.755,1164,2.858,1166,3.001,1234,5.29,1278,6.027,1279,6.027]],["title/directives/ToolbarSettingsButtonDirective.html",[0,0.005,250,1.744]],["body/directives/ToolbarSettingsButtonDirective.html",[0,0.007,2,0.72,3,0.131,4,0.099,5,0.083,6,0.052,9,0.475,11,1.385,12,2.328,16,0.744,17,1.424,18,2.415,19,2.328,20,1.941,21,1.205,22,2.328,23,0.744,25,0.9,26,1.225,27,0.01,28,1.014,29,1.781,30,1.239,31,0.696,32,0.744,33,1.299,62,0.009,63,0.009,87,2.059,148,1.886,250,2.484,251,2.755,812,3.706,1164,2.858,1166,3.001,1237,5.29,1280,6.027]],["title/injectables/TranslateService.html",[567,2.747,1281,3.714]],["body/injectables/TranslateService.html",[3,0.099,4,0.075,5,0.063,6,0.04,9,0.54,18,1.508,23,0.847,27,0.01,37,0.909,38,1.36,42,2.736,48,1.601,52,2.343,53,1.162,54,1.915,56,2.649,57,1.938,59,1.383,62,0.007,63,0.007,82,2.331,119,2.006,277,2.006,298,2.079,309,2.193,347,2.886,352,2.66,374,3.665,376,2.331,438,2.351,462,3.914,569,2.796,580,3.134,631,4.486,636,5.414,657,3.134,665,3.625,676,2.66,716,2.952,725,3.352,804,3.992,853,3.625,864,3.992,1005,3.992,1193,3.992,1281,3.992,1282,4.547,1283,5.341,1284,3.992,1285,4.547,1286,8.153,1287,6.085,1288,3.992,1289,4.547,1290,3.992,1291,6.085,1292,6.085,1293,6.858,1294,4.547,1295,6.858,1296,4.547,1297,6.085,1298,4.547,1299,4.547,1300,4.547,1301,3.992,1302,7.324,1303,4.547,1304,4.547,1305,4.547,1306,4.547,1307,4.547,1308,4.547,1309,6.02,1310,4.547,1311,4.547,1312,4.547,1313,6.085,1314,3.992]],["title/directives/VideoEnabledDirective.html",[0,0.005,253,1.744]],["body/directives/VideoEnabledDirective.html",[0,0.008,2,0.747,3,0.136,4,0.103,5,0.086,6,0.054,9,0.493,11,1.437,16,0.772,17,1.478,21,1.25,26,1.052,27,0.01,28,1.052,30,1.286,31,0.722,32,0.772,33,1.115,62,0.009,63,0.009,253,2.577,254,2.859,401,2.201,438,2.416,542,3.342,544,4.609,546,4.059,547,4.309,906,4.059,1315,5.489]],["title/components/VideoconferenceComponent.html",[21,0.846,25,0.632]],["body/components/VideoconferenceComponent.html",[0,0.002,1,1.156,2,0.574,3,0.036,4,0.027,5,0.023,6,0.037,9,0.13,13,1.456,15,1.556,16,0.346,17,1.016,19,0.639,21,0.962,23,0.531,27,0.01,28,0.278,29,0.489,30,0.34,31,0.191,32,1.054,33,1.531,34,0.756,35,1.746,46,1.452,53,1.226,55,2.851,62,0.003,63,0.003,68,1.814,70,1.956,71,0.705,74,0.785,77,0.785,79,0.968,80,1.319,81,4.489,82,3.962,83,3.578,84,3.998,85,3.803,86,1.933,87,1.903,88,3.213,89,1.14,90,4.187,91,3.884,92,1.22,93,1.933,94,1.074,95,1.22,96,1.22,97,1.14,98,1.319,99,1.22,100,1.14,101,1.319,102,1.319,103,1.14,104,1.22,105,3.315,106,1.156,107,1.22,108,1.074,109,1.22,110,1.074,111,0.756,112,0.705,113,0.756,114,0.295,115,0.785,116,0.785,117,0.66,118,1.896,119,0.73,120,1.017,121,1.382,123,1.156,124,2.039,125,0.785,127,2.039,128,0.73,129,2.154,130,0.785,131,0.682,132,0.785,133,0.756,134,1.33,135,0.73,136,1.41,137,0.756,138,0.785,139,0.705,140,0.705,141,1.306,142,0.785,143,0.705,144,1.142,145,0.756,146,0.639,147,0.785,148,0.518,149,0.785,150,0.785,151,0.682,152,0.785,153,0.756,154,0.785,155,1.083,156,0.785,157,0.682,158,0.785,159,0.682,160,0.785,161,0.682,162,0.785,163,0.682,164,0.785,165,1.156,166,0.785,167,1.119,168,0.785,169,1.156,170,0.785,171,1.156,172,0.785,173,1.156,174,0.785,175,1.156,176,0.785,177,1.156,178,0.785,179,1.156,180,0.785,181,1.156,182,0.785,183,1.156,184,0.785,185,1.156,186,0.785,187,1.156,188,0.756,189,0.785,190,1.119,191,0.785,192,1.156,193,0.785,194,1.156,195,0.785,196,1.156,197,0.756,198,0.785,199,1.156,200,0.756,201,0.785,202,1.156,203,0.756,204,0.785,205,1.156,206,0.785,207,1.156,208,0.785,209,1.156,210,0.756,211,0.785,212,1.119,213,0.785,214,0.682,215,0.785,216,1.156,217,0.785,218,1.156,219,0.756,220,0.785,221,1.156,222,0.756,223,0.785,224,1.156,225,0.756,226,0.785,227,1.119,228,0.785,229,1.156,230,0.756,231,0.785,232,1.156,233,0.756,234,0.785,235,1.156,236,0.756,237,0.785,238,1.156,239,0.756,240,0.785,241,1.156,242,0.756,243,0.785,244,1.156,245,0.756,246,0.785,247,1.156,248,0.756,249,0.785,250,1.156,251,0.756,252,0.785,253,1.156,254,0.756,255,0.785,262,0.785,263,1.798,275,1.083,294,0.705,308,1.156,309,1.235,330,0.756,338,0.619,342,2.062,363,1.452,366,1.22,371,1.319,377,0.848,387,3.425,401,1.513,408,2.79,462,0.884,543,1.452,544,1.22,546,2.79,547,2.962,584,3.258,596,0.924,597,1.22,626,1.22,633,1.22,634,1.22,636,1.933,657,1.14,660,1.452,692,0.815,693,1.319,694,3.615,700,1.22,768,1.452,775,1.452,805,1.452,806,3.427,808,1.452,809,1.452,810,1.22,811,1.452,812,1.725,813,1.22,816,1.319,818,1.22,826,1.452,868,4.44,870,1.452,909,1.933,910,2.067,916,2.135,918,2.37,923,1.452,927,2.236,928,1.14,937,1.22,939,1.319,968,1.319,981,1.452,1018,3.773,1107,2.962,1145,1.452,1150,1.452,1155,1.452,1159,1.452,1168,1.319,1203,1.319,1226,1.452,1227,5.142,1228,1.452,1229,2.236,1230,1.452,1231,1.452,1232,1.452,1233,1.319,1288,4.223,1290,1.452,1315,1.452,1316,1.655,1317,1.655,1318,1.452,1319,1.655,1320,1.452,1321,1.452,1322,1.452,1323,1.655,1324,1.655,1325,1.655,1326,1.655,1327,1.655,1328,2.805,1329,1.655,1330,2.462,1331,1.655,1332,1.655,1333,1.655,1334,1.655,1335,1.655,1336,1.655,1337,1.655,1338,1.655,1339,1.655,1340,1.655,1341,1.655,1342,1.655,1343,1.655,1344,1.655,1345,1.655,1346,1.655,1347,1.655,1348,1.655,1349,1.655,1350,1.655,1351,1.655,1352,1.655]],["title/miscellaneous/enumerations.html",[1353,2.287,1354,4.472]],["body/miscellaneous/enumerations.html",[5,0.102,6,0.064,27,0.011,35,2.231,37,0.923,59,2.664,62,0.008,63,0.008,70,1.728,114,0.823,136,2.374,144,1.923,280,2.467,342,2.164,368,2.838,374,2.467,375,3.181,557,4.531,565,3.181,566,4.31,575,5.874,576,4.783,578,5.874,579,5.874,812,3.78,844,3.68,848,4.9,938,2.7,1049,5.395,1072,4.236,1088,2.577,1099,5.395,1127,3.68,1166,1.903,1198,5.395,1200,5.395,1201,4.052,1330,5.395,1353,2.996,1354,4.052,1355,4.616,1356,4.616,1357,6.146,1358,4.616,1359,6.91,1360,4.616,1361,7.368,1362,4.052,1363,4.052,1364,4.616,1365,5.395,1366,4.616,1367,4.616,1368,4.616,1369,4.616]],["title/index.html",[37,0.704,576,2.287,1370,2.809]],["body/index.html",[4,0.064,6,0.071,23,0.483,26,1.264,27,0.011,33,1.496,62,0.007,63,0.007,68,1.822,87,1.338,111,2.511,121,1.929,268,2.511,274,1.857,275,3.089,276,3.951,278,1.857,279,1.929,280,2.935,286,3.566,290,2.605,296,1.79,299,1.857,314,1.669,327,1.857,354,2.408,356,2.699,376,2.816,377,2.008,387,2.408,417,3.437,431,2.093,435,2.887,437,2.887,502,2.699,534,2.887,576,4.118,584,2.291,695,2.542,741,3.122,766,2.291,891,6.376,916,3.213,926,4.821,928,2.699,938,2.291,961,2.542,1107,2.699,1271,3.437,1318,4.821,1320,3.437,1321,3.437,1322,3.437,1370,4.379,1371,3.916,1372,3.916,1373,3.916,1374,3.916,1375,3.916,1376,3.916,1377,3.916,1378,3.916,1379,3.916,1380,3.916,1381,3.916,1382,3.916,1383,3.916,1384,3.916,1385,6.344,1386,3.916,1387,5.493,1388,3.916,1389,3.916,1390,5.493,1391,3.916,1392,5.493,1393,3.916,1394,3.916,1395,3.916,1396,3.916,1397,3.916,1398,3.916,1399,3.916,1400,3.916,1401,3.916,1402,3.916,1403,3.916,1404,3.916,1405,3.916,1406,3.916,1407,3.916,1408,3.916,1409,3.916,1410,3.916,1411,3.916,1412,3.916,1413,3.916,1414,3.916,1415,5.493,1416,3.916,1417,6.877,1418,3.916,1419,5.493,1420,3.916,1421,3.437,1422,4.379,1423,3.916,1424,3.916,1425,3.916]],["title/license.html",[576,2.287,1370,2.809,1426,3.093]],["body/license.html",[4,0.094,9,0.124,23,0.433,26,0.699,27,0.006,62,0.003,63,0.003,82,1.375,83,0.693,112,1.496,113,1.226,264,0.876,265,0.805,268,0.718,286,2.695,292,0.669,314,2.638,352,2.053,354,0.965,367,0.536,374,2.492,376,1.375,377,0.805,388,1.157,405,3.645,430,0.876,438,0.606,448,1.157,460,1.082,479,1.082,584,0.918,591,3.645,626,1.157,636,1.082,663,3.718,676,2.972,685,2.159,696,0.965,716,2.695,732,1.977,736,1.378,741,1.251,767,0.918,770,2.799,776,1.378,779,3.081,803,6.356,806,1.251,814,1.977,825,3.714,843,3.061,854,1.251,928,1.082,986,3.081,1039,5.745,1041,2.354,1063,1.251,1107,1.082,1174,2.354,1175,3.081,1205,4.094,1267,1.378,1283,1.378,1284,1.378,1309,1.378,1314,4.46,1362,1.378,1363,1.378,1365,3.081,1421,3.081,1422,1.251,1426,7.062,1427,4.152,1428,3.081,1429,3.51,1430,1.57,1431,1.57,1432,1.57,1433,5.972,1434,6.694,1435,4.152,1436,4.664,1437,1.57,1438,6.945,1439,6.188,1440,1.57,1441,1.57,1442,1.57,1443,1.57,1444,1.57,1445,6.188,1446,6.694,1447,5.081,1448,6.188,1449,2.681,1450,1.57,1451,4.664,1452,1.57,1453,1.57,1454,1.57,1455,1.57,1456,5.972,1457,1.57,1458,4.152,1459,2.681,1460,2.681,1461,1.57,1462,3.51,1463,2.681,1464,2.681,1465,1.57,1466,1.57,1467,2.681,1468,1.57,1469,2.681,1470,1.57,1471,1.57,1472,1.57,1473,1.57,1474,1.57,1475,1.57,1476,1.57,1477,3.51,1478,2.681,1479,6.694,1480,1.57,1481,1.57,1482,5.081,1483,5.972,1484,4.152,1485,2.681,1486,1.57,1487,3.51,1488,1.57,1489,1.57,1490,1.57,1491,1.57,1492,2.681,1493,1.57,1494,8.045,1495,3.51,1496,1.57,1497,5.972,1498,1.57,1499,2.681,1500,7.241,1501,7.323,1502,1.57,1503,1.57,1504,1.57,1505,1.57,1506,1.57,1507,1.57,1508,1.57,1509,2.681,1510,2.681,1511,3.51,1512,1.57,1513,1.57,1514,1.57,1515,1.57,1516,4.152,1517,4.664,1518,1.57,1519,2.681,1520,4.152,1521,2.681,1522,1.57,1523,4.664,1524,2.681,1525,1.57,1526,1.57,1527,3.51,1528,1.57,1529,1.57,1530,1.57,1531,1.57,1532,2.681,1533,1.57,1534,1.57,1535,1.57,1536,3.51,1537,1.57,1538,1.57,1539,3.51,1540,1.57,1541,1.57,1542,1.57,1543,4.152,1544,6.188,1545,1.57,1546,2.681,1547,2.681,1548,2.681,1549,2.681,1550,2.681,1551,2.681,1552,3.51,1553,2.681,1554,2.681,1555,2.681,1556,2.681,1557,2.681,1558,1.57,1559,2.681,1560,1.57,1561,1.57,1562,4.664,1563,5.428,1564,2.681,1565,1.57,1566,1.57,1567,2.681,1568,2.681,1569,1.57,1570,2.681,1571,1.57,1572,1.57,1573,1.57,1574,3.51,1575,1.57,1576,1.57,1577,1.57,1578,2.681,1579,2.681,1580,1.57,1581,1.57,1582,1.57,1583,1.57,1584,1.57,1585,1.57,1586,1.57,1587,2.681,1588,1.57,1589,1.57,1590,1.57,1591,1.57,1592,1.57,1593,1.57,1594,1.57,1595,1.57,1596,1.57,1597,3.51,1598,1.57,1599,1.57,1600,1.57,1601,1.57,1602,5.721,1603,1.57,1604,1.57,1605,1.57,1606,1.57,1607,4.152,1608,2.681,1609,1.57,1610,1.57,1611,1.57,1612,1.57,1613,1.57,1614,3.51,1615,1.57,1616,1.57,1617,2.681,1618,2.681,1619,1.57,1620,1.57,1621,1.57,1622,1.57,1623,1.57,1624,1.57,1625,1.57,1626,1.57,1627,1.57,1628,1.57,1629,1.57,1630,1.57,1631,3.51,1632,4.152,1633,1.57,1634,1.57,1635,1.57,1636,1.57,1637,1.57,1638,1.57,1639,1.57,1640,1.57,1641,1.57,1642,1.57,1643,2.681,1644,1.57,1645,1.57,1646,2.681,1647,1.57,1648,1.57,1649,4.152,1650,1.57,1651,1.57,1652,1.57,1653,1.57,1654,1.57,1655,1.57,1656,4.152,1657,3.51,1658,3.51,1659,2.681,1660,3.51,1661,2.681,1662,2.681,1663,2.681,1664,1.57,1665,1.57,1666,1.57,1667,1.57,1668,1.57,1669,1.57,1670,2.681,1671,1.57,1672,1.57,1673,1.57,1674,4.664,1675,1.57,1676,1.57,1677,1.57,1678,1.57,1679,1.57,1680,1.57,1681,1.57,1682,1.57,1683,4.664,1684,1.57,1685,1.57,1686,1.57,1687,1.57,1688,1.57,1689,1.57,1690,1.57,1691,1.57,1692,1.57,1693,1.57,1694,1.57,1695,1.57,1696,1.57,1697,1.57,1698,1.57,1699,1.57,1700,1.57,1701,1.57,1702,3.51,1703,1.57,1704,1.57,1705,1.57,1706,1.57,1707,2.681,1708,1.57,1709,1.57,1710,1.57,1711,1.57,1712,1.57,1713,1.57,1714,1.57,1715,1.57,1716,1.57,1717,1.57,1718,1.57,1719,1.57,1720,1.57,1721,1.57,1722,1.57,1723,2.681,1724,1.57,1725,1.57,1726,1.57,1727,2.681,1728,2.681,1729,1.57,1730,1.57,1731,1.57,1732,1.57,1733,1.57,1734,1.57,1735,1.57,1736,1.57,1737,1.57,1738,1.57,1739,1.57,1740,1.57,1741,1.57,1742,1.57,1743,1.57,1744,1.57,1745,1.57,1746,1.57,1747,1.57]],["title/modules.html",[529,3.994]],["body/modules.html",[27,0.009,62,0.009,63,0.009,528,4.574,529,4.574,783,4.574,1023,6.768,1422,6.147,1748,7.71,1749,7.71]],["title/overview.html",[1750,5.087]],["body/overview.html",[1,2.596,2,0.26,6,0.019,27,0.011,62,0.004,63,0.004,123,2.596,151,2.596,155,2.433,157,2.596,159,2.596,161,2.596,163,2.596,165,2.596,167,2.513,169,2.596,171,2.596,173,2.596,175,2.596,177,2.596,179,2.596,181,2.596,183,2.596,185,2.596,187,2.596,190,2.513,192,2.596,194,2.596,196,2.596,199,2.596,202,2.596,205,2.596,207,2.596,209,2.596,212,2.513,214,2.596,216,2.596,218,2.596,221,2.596,224,2.596,227,2.513,229,2.596,232,2.596,235,2.596,238,2.596,241,2.596,244,2.596,247,2.596,250,2.596,253,2.596,292,0.929,354,1.34,367,0.745,388,2.598,390,1.415,527,1.502,528,6.141,529,1.502,530,1.738,531,1.738,532,1.738,533,1.738,534,1.607,535,1.738,536,1.913,537,1.913,538,1.913,539,2.81,540,1.738,569,1.34,725,1.607,783,5.842,784,1.913,785,1.913,786,1.913,1750,1.913,1751,2.18,1752,2.18,1753,2.18,1754,2.18]],["title/properties.html",[38,1.139,1755,3.524]],["body/properties.html",[27,0.01,38,1.517,62,0.01,63,0.01,1428,5.956,1756,6.785,1757,6.785]],["title/miscellaneous/typealiases.html",[1353,2.287,1758,5.095]],["body/miscellaneous/typealiases.html",[5,0.085,6,0.054,27,0.011,37,1.233,53,0.979,62,0.009,63,0.009,638,4.918,640,4.918,642,4.918,644,4.918,646,4.918,648,4.918,651,4.918,653,4.918,655,4.918,658,5.415,659,6.481,1301,5.415,1353,4.005,1759,6.169,1760,7.384,1761,7.384]],["title/miscellaneous/variables.html",[297,2.329,1353,2.287]],["body/miscellaneous/variables.html",[5,0.09,6,0.057,16,0.802,27,0.01,37,1.299,53,1.031,59,1.975,62,0.009,63,0.009,297,2.97,309,1.866,1353,4.217,1762,7.614,1763,6.497,1764,6.497,1765,6.497]]],"invertedIndex":[["",{"_index":27,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"license.html":{},"modules.html":{},"overview.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["0",{"_index":740,"title":{},"body":{"directives/LayoutDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"directives/StreamDirective.html":{}}}],["000000",{"_index":1140,"title":{},"body":{"directives/StreamDirective.html":{}}}],["1",{"_index":388,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"license.html":{},"overview.html":{}}}],["1.1",{"_index":488,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["100",{"_index":283,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["1024",{"_index":486,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["10px",{"_index":1418,"title":{},"body":{"index.html":{}}}],["13",{"_index":1751,"title":{},"body":{"overview.html":{}}}],["17.0.0",{"_index":1386,"title":{},"body":{"index.html":{}}}],["1d1d1d",{"_index":1416,"title":{},"body":{"index.html":{}}}],["2",{"_index":390,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/RecordingActivityComponent.html":{},"overview.html":{}}}],["2.0",{"_index":1429,"title":{},"body":{"license.html":{}}}],["2004",{"_index":1431,"title":{},"body":{"license.html":{}}}],["20px",{"_index":397,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/PanelDirective.html":{}}}],["21",{"_index":1754,"title":{},"body":{"overview.html":{}}}],["250px",{"_index":742,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["2px",{"_index":1138,"title":{},"body":{"directives/StreamDirective.html":{}}}],["3.0.0",{"_index":1756,"title":{},"body":{"properties.html":{}}}],["303030",{"_index":1403,"title":{},"body":{"index.html":{}}}],["360",{"_index":384,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["3a3d3d",{"_index":1414,"title":{},"body":{"index.html":{}}}],["3e3f3f",{"_index":1405,"title":{},"body":{"index.html":{}}}],["404",{"_index":340,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["40px",{"_index":395,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/PanelDirective.html":{}}}],["45",{"_index":1752,"title":{},"body":{"overview.html":{}}}],["50",{"_index":741,"title":{},"body":{"directives/LayoutDirective.html":{},"index.html":{},"license.html":{}}}],["598eff",{"_index":1407,"title":{},"body":{"index.html":{}}}],["5px",{"_index":1419,"title":{},"body":{"index.html":{}}}],["6",{"_index":1753,"title":{},"body":{"overview.html":{}}}],["6443",{"_index":320,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["7443",{"_index":324,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["7fb8ff",{"_index":1056,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["9",{"_index":1443,"title":{},"body":{"license.html":{}}}],["_",{"_index":617,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["_participant",{"_index":944,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["_participant.name",{"_index":942,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["_screen",{"_index":1123,"title":{},"body":{"components/StreamComponent.html":{}}}],["_track.participant.name",{"_index":1122,"title":{},"body":{"components/StreamComponent.html":{}}}],["a184ff",{"_index":1055,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["aafffc",{"_index":281,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{}}}],["above",{"_index":1635,"title":{},"body":{"license.html":{}}}],["absolute",{"_index":1136,"title":{},"body":{"directives/StreamDirective.html":{}}}],["accent",{"_index":1410,"title":{},"body":{"index.html":{}}}],["acceptance",{"_index":1705,"title":{},"body":{"license.html":{}}}],["accepting",{"_index":1702,"title":{},"body":{"license.html":{}}}],["access",{"_index":706,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{}}}],["accessor",{"_index":707,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["accessors",{"_index":47,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["achieve",{"_index":1133,"title":{},"body":{"directives/StreamDirective.html":{}}}],["act",{"_index":1711,"title":{},"body":{"license.html":{}}}],["acting",{"_index":1453,"title":{},"body":{"license.html":{}}}],["activate",{"_index":965,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["active",{"_index":1017,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["activities",{"_index":35,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["activitiespanel",{"_index":24,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["activitiespanelbroadcastingactivity",{"_index":46,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["activitiespanelbroadcastingactivitydirective",{"_index":1,"title":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["activitiespanelbutton",{"_index":1165,"title":{},"body":{"directives/ToolbarActivitiesPanelButtonDirective.html":{},"components/ToolbarComponent.html":{}}}],["activitiespanelcomponent",{"_index":15,"title":{"components/ActivitiesPanelComponent.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["activitiespaneldirective",{"_index":151,"title":{"directives/ActivitiesPanelDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["activitiespanelrecordingactivity",{"_index":363,"title":{},"body":{"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["activitiespanelrecordingactivitydirective",{"_index":123,"title":{"directives/ActivitiesPanelRecordingActivityDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["activitiespanelstatusevent",{"_index":366,"title":{"interfaces/ActivitiesPanelStatusEvent.html":{}},"body":{"interfaces/ActivitiesPanelStatusEvent.html":{},"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["activity",{"_index":14,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["activity'},{'name",{"_index":134,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["activity.component.html",{"_index":553,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["activity.component.scss,../activities",{"_index":552,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["activity.component.ts",{"_index":551,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["activity/broadcasting",{"_index":550,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["activity/recording",{"_index":1067,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["acts",{"_index":1681,"title":{},"body":{"license.html":{}}}],["actual_component",{"_index":255,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["actually",{"_index":1106,"title":{},"body":{"injectables/RecordingService.html":{}}}],["add",{"_index":376,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LangOptionsDirective.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"index.html":{},"license.html":{}}}],["added",{"_index":1204,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["addendum",{"_index":1624,"title":{},"body":{"license.html":{}}}],["adding",{"_index":845,"title":{},"body":{"injectables/PanelService.html":{},"directives/ParticipantPanelItemElementsDirective.html":{}}}],["addition",{"_index":1169,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["additional",{"_index":374,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"miscellaneous/enumerations.html":{},"license.html":{}}}],["additionalbtn",{"_index":1182,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["additionally",{"_index":1176,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["additionalpanelsdirective",{"_index":155,"title":{"directives/AdditionalPanelsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["additionaltranslationstype",{"_index":1760,"title":{},"body":{"miscellaneous/typealiases.html":{}}}],["additions",{"_index":1518,"title":{},"body":{"license.html":{}}}],["adds",{"_index":1298,"title":{},"body":{"injectables/TranslateService.html":{}}}],["addtranslations",{"_index":1292,"title":{},"body":{"injectables/TranslateService.html":{}}}],["addtranslations(translations",{"_index":1296,"title":{},"body":{"injectables/TranslateService.html":{}}}],["admin",{"_index":129,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["admin.dashboard_title",{"_index":461,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{}}}],["admin.load_more",{"_index":493,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.login",{"_index":521,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["admin.password",{"_index":519,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["admin.password_required",{"_index":520,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["admin.powered_by",{"_index":494,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.date_end",{"_index":467,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.date_start",{"_index":466,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.duration",{"_index":468,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.empty",{"_index":470,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.name",{"_index":472,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.output",{"_index":476,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.room",{"_index":474,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.size",{"_index":469,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.recordings.status",{"_index":490,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["admin.username",{"_index":517,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["admin.username_required",{"_index":518,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["admindashboardcomponent",{"_index":128,"title":{"components/AdminDashboardComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["admindashboardrecordingslistdirective",{"_index":157,"title":{"directives/AdminDashboardRecordingsListDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["admindashboardtitledirective",{"_index":159,"title":{"directives/AdminDashboardTitleDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["adminlogincomponent",{"_index":131,"title":{"components/AdminLoginComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["adminloginerrordirective",{"_index":161,"title":{"directives/AdminLoginErrorDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["adminlogintitledirective",{"_index":163,"title":{"directives/AdminLoginTitleDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["advised",{"_index":1700,"title":{},"body":{"license.html":{}}}],["after_menu",{"_index":1369,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["aftermenu",{"_index":1201,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"miscellaneous/enumerations.html":{}}}],["afterviewinit",{"_index":29,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["against",{"_index":1579,"title":{},"body":{"license.html":{}}}],["agree",{"_index":1714,"title":{},"body":{"license.html":{}}}],["agreed",{"_index":1658,"title":{},"body":{"license.html":{}}}],["agreement",{"_index":1640,"title":{},"body":{"license.html":{}}}],["aim",{"_index":115,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["alert('button",{"_index":1211,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["aliases",{"_index":1759,"title":{},"body":{"miscellaneous/typealiases.html":{}}}],["align",{"_index":287,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/PanelDirective.html":{}}}],["alleging",{"_index":1584,"title":{},"body":{"license.html":{}}}],["allow",{"_index":1317,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["allows",{"_index":11,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{}}}],["alone",{"_index":1575,"title":{},"body":{"license.html":{}}}],["along",{"_index":1615,"title":{},"body":{"license.html":{}}}],["alongside",{"_index":1623,"title":{},"body":{"license.html":{}}}],["and/or",{"_index":1708,"title":{},"body":{"license.html":{}}}],["angular",{"_index":276,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["angular.directive.module.ts",{"_index":787,"title":{},"body":{"modules/OpenViduComponentsDirectiveModule.html":{}}}],["angular.directive.ts",{"_index":257,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["angular/common",{"_index":729,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["angular/common/http",{"_index":270,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["angular/core",{"_index":271,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["angular/material",{"_index":1389,"title":{},"body":{"index.html":{}}}],["angular/material/button",{"_index":383,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["angular/material/icon",{"_index":381,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["angular/material/menu",{"_index":957,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{}}}],["angular/src/lib/admin/admin",{"_index":440,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{}}}],["angular/src/lib/components/layout/layout.component.ts",{"_index":682,"title":{},"body":{"components/LayoutComponent.html":{}}}],["angular/src/lib/components/panel/activities",{"_index":64,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["angular/src/lib/components/panel/chat",{"_index":588,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["angular/src/lib/components/panel/panel.component.ts",{"_index":801,"title":{},"body":{"components/PanelComponent.html":{}}}],["angular/src/lib/components/panel/participants",{"_index":930,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{}}}],["angular/src/lib/components/stream/stream.component.ts",{"_index":1115,"title":{},"body":{"components/StreamComponent.html":{}}}],["angular/src/lib/components/toolbar/toolbar.component.ts",{"_index":1220,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["angular/src/lib/components/videoconference/videoconference.component.ts",{"_index":1316,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["angular/src/lib/directives/api/activities",{"_index":7,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["angular/src/lib/directives/api/admin.directive.ts",{"_index":495,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["angular/src/lib/directives/api/api.directive.module.ts",{"_index":541,"title":{},"body":{"modules/ApiDirectiveModule.html":{}}}],["angular/src/lib/directives/api/participant",{"_index":975,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["angular/src/lib/directives/api/stream.directive.ts",{"_index":1141,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["angular/src/lib/directives/api/toolbar.directive.ts",{"_index":1164,"title":{},"body":{"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["angular/src/lib/directives/api/videoconference.directive.ts",{"_index":542,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"directives/ParticipantNameDirective.html":{},"directives/PrejoinDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/VideoEnabledDirective.html":{}}}],["angular/src/lib/directives/template/openvidu",{"_index":256,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["angular/src/lib/models/broadcasting.model.ts",{"_index":565,"title":{},"body":{"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"miscellaneous/enumerations.html":{}}}],["angular/src/lib/models/lang.model.ts",{"_index":658,"title":{},"body":{"interfaces/LangOption.html":{},"miscellaneous/typealiases.html":{}}}],["angular/src/lib/models/panel.model.ts",{"_index":368,"title":{},"body":{"interfaces/ActivitiesPanelStatusEvent.html":{},"interfaces/ChatPanelStatusEvent.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"miscellaneous/enumerations.html":{}}}],["angular/src/lib/models/participant.model.ts",{"_index":873,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{},"interfaces/ParticipantTrackPublication.html":{}}}],["angular/src/lib/models/recording.model.ts",{"_index":1088,"title":{},"body":{"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"miscellaneous/enumerations.html":{}}}],["angular/src/lib/models/storage.model.ts",{"_index":1764,"title":{},"body":{"miscellaneous/variables.html":{}}}],["angular/src/lib/models/toolbar.model.ts",{"_index":1366,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["angular/src/lib/pipes/participant.pipe.ts",{"_index":1112,"title":{},"body":{"pipes/RemoteParticipantTracksPipe.html":{}}}],["angular/src/lib/services/broadcasting/broadcasting.service.ts",{"_index":570,"title":{},"body":{"injectables/BroadcastingService.html":{}}}],["angular/src/lib/services/openvidu/openvidu.service.ts",{"_index":789,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["angular/src/lib/services/panel/panel.service.ts",{"_index":831,"title":{},"body":{"injectables/PanelService.html":{}}}],["angular/src/lib/services/participant/participant.service.ts",{"_index":987,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["angular/src/lib/services/recording/recording.service.ts",{"_index":1101,"title":{},"body":{"injectables/RecordingService.html":{}}}],["angular/src/lib/services/translate/translate.service.ts",{"_index":1282,"title":{},"body":{"injectables/TranslateService.html":{}}}],["annotations",{"_index":1506,"title":{},"body":{"license.html":{}}}],["another",{"_index":391,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["apache",{"_index":1427,"title":{},"body":{"license.html":{}}}],["api",{"_index":111,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["apidirectivemodule",{"_index":528,"title":{"modules/ApiDirectiveModule.html":{}},"body":{"modules/ApiDirectiveModule.html":{},"directives/StreamDirective.html":{},"modules.html":{},"overview.html":{}}}],["aplications",{"_index":924,"title":{},"body":{"directives/ParticipantNameDirective.html":{}}}],["app",{"_index":277,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"interfaces/PanelStatusEvent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{}}}],["appcomponent",{"_index":293,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["appear",{"_index":1620,"title":{},"body":{"license.html":{}}}],["appearance",{"_index":827,"title":{},"body":{"directives/PanelDirective.html":{}}}],["appendix",{"_index":1499,"title":{},"body":{"license.html":{}}}],["applicable",{"_index":986,"title":{},"body":{"interfaces/ParticipantProperties.html":{},"license.html":{}}}],["application",{"_index":119,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{}}}],["application_server_url",{"_index":305,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["applications",{"_index":1374,"title":{},"body":{"index.html":{}}}],["applies",{"_index":776,"title":{},"body":{"directives/MinimalDirective.html":{},"license.html":{}}}],["apply",{"_index":1723,"title":{},"body":{"license.html":{}}}],["appropriate",{"_index":1731,"title":{},"body":{"license.html":{}}}],["appropriateness",{"_index":1669,"title":{},"body":{"license.html":{}}}],["apps",{"_index":1321,"title":{},"body":{"components/VideoconferenceComponent.html":{},"index.html":{}}}],["archives",{"_index":1739,"title":{},"body":{"license.html":{}}}],["arising",{"_index":1688,"title":{},"body":{"license.html":{}}}],["array",{"_index":665,"title":{},"body":{"directives/LangOptionsDirective.html":{},"injectables/ParticipantService.html":{},"injectables/TranslateService.html":{}}}],["arrow_drop_down",{"_index":465,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["asserted",{"_index":1720,"title":{},"body":{"license.html":{}}}],["assess",{"_index":1178,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["assets/lang",{"_index":678,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["assigned",{"_index":901,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["assistance",{"_index":1424,"title":{},"body":{"index.html":{}}}],["associated",{"_index":767,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"license.html":{}}}],["assume",{"_index":1671,"title":{},"body":{"license.html":{}}}],["async",{"_index":325,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["attach",{"_index":1724,"title":{},"body":{"license.html":{}}}],["attached",{"_index":1498,"title":{},"body":{"license.html":{}}}],["attempts",{"_index":1307,"title":{},"body":{"injectables/TranslateService.html":{}}}],["attribution",{"_index":1607,"title":{},"body":{"license.html":{}}}],["audio",{"_index":918,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["audioenabled",{"_index":543,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["audioenableddirective",{"_index":165,"title":{"directives/AudioEnabledDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["audiotracks",{"_index":883,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["authenticate",{"_index":1183,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["authentication",{"_index":522,"title":{},"body":{"directives/AdminLoginErrorDirective.html":{}}}],["authorized",{"_index":1449,"title":{},"body":{"license.html":{}}}],["authorship",{"_index":1495,"title":{},"body":{"license.html":{}}}],["automatically",{"_index":577,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{}}}],["available",{"_index":438,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"license.html":{}}}],["availablelangs",{"_index":659,"title":{},"body":{"interfaces/LangOption.html":{},"miscellaneous/typealiases.html":{}}}],["await",{"_index":328,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["b",{"_index":1598,"title":{},"body":{"license.html":{}}}],["backend",{"_index":345,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["background",{"_index":280,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"miscellaneous/enumerations.html":{},"index.html":{}}}],["background_effects",{"_index":1364,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["background_replace",{"_index":1258,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["backgroundeffectsbutton",{"_index":1213,"title":{},"body":{"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"components/ToolbarComponent.html":{}}}],["based",{"_index":1502,"title":{},"body":{"license.html":{}}}],["basis",{"_index":1659,"title":{},"body":{"license.html":{}}}],["before",{"_index":867,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["before_menu",{"_index":1367,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["beforemenu",{"_index":1368,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["behalf",{"_index":1523,"title":{},"body":{"license.html":{}}}],["behavior",{"_index":828,"title":{},"body":{"directives/PanelDirective.html":{}}}],["below",{"_index":265,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"license.html":{}}}],["beneficial",{"_index":1475,"title":{},"body":{"license.html":{}}}],["beta3",{"_index":1757,"title":{},"body":{"properties.html":{}}}],["between",{"_index":738,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["bind",{"_index":1515,"title":{},"body":{"license.html":{}}}],["boilerplate",{"_index":1725,"title":{},"body":{"license.html":{}}}],["boolean",{"_index":55,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"interfaces/RecordingInfo.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["bootstrap",{"_index":533,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["bootstrapapplication(appcomponent",{"_index":1395,"title":{},"body":{"index.html":{}}}],["border",{"_index":1137,"title":{},"body":{"directives/StreamDirective.html":{}}}],["bottom",{"_index":743,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/StreamDirective.html":{}}}],["brackets",{"_index":1728,"title":{},"body":{"license.html":{}}}],["branding",{"_index":1270,"title":{},"body":{"directives/ToolbarDisplayLogoDirective.html":{}}}],["broadcast",{"_index":1360,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["broadcasting",{"_index":13,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStatusInfo.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["broadcastingactivity",{"_index":10,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{}}}],["broadcastingactivitycomponent",{"_index":133,"title":{"components/BroadcastingActivityComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["broadcastingactivityvalue",{"_index":39,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{}}}],["broadcastingbutton",{"_index":1215,"title":{},"body":{"directives/ToolbarBroadcastingButtonDirective.html":{},"components/ToolbarComponent.html":{}}}],["broadcastingerror",{"_index":563,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["broadcastingevent",{"_index":564,"title":{"interfaces/BroadcastingEvent.html":{}},"body":{"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{}}}],["broadcastingid",{"_index":586,"title":{},"body":{"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{}}}],["broadcastingservice",{"_index":568,"title":{"injectables/BroadcastingService.html":{}},"body":{"injectables/BroadcastingService.html":{}}}],["broadcastingstartrequestedevent",{"_index":89,"title":{"interfaces/BroadcastingStartRequestedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["broadcastingstatus",{"_index":557,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStatusInfo.html":{},"miscellaneous/enumerations.html":{}}}],["broadcastingstatusinfo",{"_index":582,"title":{"interfaces/BroadcastingStatusInfo.html":{}},"body":{"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStatusInfo.html":{}}}],["broadcastingstatusobs",{"_index":571,"title":{},"body":{"injectables/BroadcastingService.html":{}}}],["broadcastingstoprequestedevent",{"_index":94,"title":{"interfaces/BroadcastingStopRequestedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["broadcasturl",{"_index":583,"title":{},"body":{"interfaces/BroadcastingStartRequestedEvent.html":{}}}],["browse",{"_index":1749,"title":{},"body":{"modules.html":{}}}],["browser",{"_index":1023,"title":{},"body":{"injectables/ParticipantService.html":{},"modules.html":{}}}],["btn",{"_index":1208,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["build",{"_index":1372,"title":{},"body":{"index.html":{}}}],["button",{"_index":87,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/RecordingActivityComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["buttons",{"_index":938,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"miscellaneous/enumerations.html":{},"index.html":{}}}],["c",{"_index":1604,"title":{},"body":{"license.html":{}}}],["c9ffb2",{"_index":398,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/PanelDirective.html":{}}}],["calc(100",{"_index":394,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/PanelDirective.html":{}}}],["call",{"_index":504,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["call_end",{"_index":1264,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["called",{"_index":1059,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["calling",{"_index":852,"title":{},"body":{"injectables/PanelService.html":{}}}],["cam",{"_index":780,"title":{},"body":{"directives/MinimalDirective.html":{}}}],["camera",{"_index":906,"title":{},"body":{"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"directives/VideoEnabledDirective.html":{}}}],["cameratracks",{"_index":884,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["carry",{"_index":1600,"title":{},"body":{"license.html":{}}}],["case",{"_index":1160,"title":{},"body":{"directives/TokenErrorDirective.html":{}}}],["catch",{"_index":337,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["catch((err",{"_index":1399,"title":{},"body":{"index.html":{}}}],["category",{"_index":1265,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["cause",{"_index":1464,"title":{},"body":{"license.html":{}}}],["center",{"_index":288,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/PanelDirective.html":{}}}],["central",{"_index":1171,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["changed",{"_index":806,"title":{},"body":{"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["changedetection",{"_index":72,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["changedetectionstrategy.onpush",{"_index":73,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["changes",{"_index":868,"title":{},"body":{"interfaces/PanelStatusInfo.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["character",{"_index":1687,"title":{},"body":{"license.html":{}}}],["charge",{"_index":685,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"license.html":{}}}],["chat",{"_index":136,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["chatpanelbutton",{"_index":1218,"title":{},"body":{"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{}}}],["chatpanelcomponent",{"_index":135,"title":{"components/ChatPanelComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["chatpaneldirective",{"_index":167,"title":{"directives/ChatPanelDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["chatpanelstatusevent",{"_index":633,"title":{"interfaces/ChatPanelStatusEvent.html":{}},"body":{"interfaces/ChatPanelStatusEvent.html":{},"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["check",{"_index":353,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["child",{"_index":699,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/ToolbarComponent.html":{}}}],["children",{"_index":817,"title":{},"body":{"components/PanelComponent.html":{}}}],["chinese",{"_index":645,"title":{},"body":{"directives/LangDirective.html":{}}}],["choose",{"_index":1703,"title":{},"body":{"license.html":{}}}],["claim",{"_index":1581,"title":{},"body":{"license.html":{}}}],["claims",{"_index":1570,"title":{},"body":{"license.html":{}}}],["class",{"_index":292,"title":{"classes/ParticipantModel.html":{}},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"license.html":{},"overview.html":{}}}],["class=\"item",{"_index":1081,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["classes",{"_index":872,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["clear",{"_index":43,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["click",{"_index":1209,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["clicked",{"_index":88,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["clicks",{"_index":107,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["close",{"_index":126,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/ChatPanelComponent.html":{},"injectables/PanelService.html":{},"components/ParticipantsPanelComponent.html":{}}}],["close_fullscreen",{"_index":1126,"title":{},"body":{"components/StreamComponent.html":{}}}],["closed_caption",{"_index":1260,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["closepanel",{"_index":833,"title":{},"body":{"injectables/PanelService.html":{}}}],["closes",{"_index":841,"title":{},"body":{"injectables/PanelService.html":{}}}],["cluster_apidirectivemodule",{"_index":536,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"overview.html":{}}}],["cluster_apidirectivemodule_declarations",{"_index":537,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"overview.html":{}}}],["cluster_apidirectivemodule_exports",{"_index":538,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"overview.html":{}}}],["cluster_openviducomponentsdirectivemodule",{"_index":784,"title":{},"body":{"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["cluster_openviducomponentsdirectivemodule_declarations",{"_index":785,"title":{},"body":{"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["cluster_openviducomponentsdirectivemodule_exports",{"_index":786,"title":{},"body":{"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["cn",{"_index":646,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["code",{"_index":352,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"injectables/TranslateService.html":{},"license.html":{}}}],["color",{"_index":891,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{},"index.html":{}}}],["colorprofile",{"_index":875,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["combination",{"_index":1576,"title":{},"body":{"license.html":{}}}],["comment",{"_index":1732,"title":{},"body":{"license.html":{}}}],["commercial",{"_index":1697,"title":{},"body":{"license.html":{}}}],["common",{"_index":1457,"title":{},"body":{"license.html":{}}}],["communication",{"_index":1527,"title":{},"body":{"license.html":{}}}],["compiled",{"_index":1491,"title":{},"body":{"license.html":{}}}],["complex",{"_index":710,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["complexity",{"_index":1384,"title":{},"body":{"index.html":{}}}],["compliance",{"_index":1742,"title":{},"body":{"license.html":{}}}],["complies",{"_index":1629,"title":{},"body":{"license.html":{}}}],["comply",{"_index":667,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["component",{"_index":25,"title":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["component_template",{"_index":125,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["components",{"_index":6,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"overview.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["composed",{"_index":1049,"title":{},"body":{"components/ParticipantsPanelComponent.html":{},"miscellaneous/enumerations.html":{}}}],["comprehensive",{"_index":355,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["computer",{"_index":1694,"title":{},"body":{"license.html":{}}}],["conditions",{"_index":1434,"title":{},"body":{"license.html":{}}}],["conference",{"_index":1181,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["conferencing",{"_index":1373,"title":{},"body":{"index.html":{}}}],["config",{"_index":1393,"title":{},"body":{"index.html":{}}}],["configuration",{"_index":1486,"title":{},"body":{"license.html":{}}}],["configure",{"_index":300,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["configured",{"_index":313,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["configureurls",{"_index":312,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["connect",{"_index":344,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["connected",{"_index":800,"title":{},"body":{"injectables/OpenViduService.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"components/ParticipantsPanelComponent.html":{}}}],["connecting",{"_index":773,"title":{},"body":{"directives/LivekitUrlDirective.html":{},"directives/TokenDirective.html":{}}}],["connection",{"_index":971,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["connectroom",{"_index":790,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["connects",{"_index":796,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["consequential",{"_index":1686,"title":{},"body":{"license.html":{}}}],["consistent",{"_index":1710,"title":{},"body":{"license.html":{}}}],["console.error(err",{"_index":1400,"title":{},"body":{"index.html":{}}}],["console.log(`message",{"_index":625,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["conspicuously",{"_index":1540,"title":{},"body":{"license.html":{}}}],["const",{"_index":327,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["constitutes",{"_index":1585,"title":{},"body":{"license.html":{}}}],["constructor",{"_index":48,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{}}}],["constructor(elementref",{"_index":49,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["constructor(private",{"_index":310,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["constructor(props",{"_index":888,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["constructor(storageservice",{"_index":1294,"title":{},"body":{"injectables/TranslateService.html":{}}}],["constructor(template",{"_index":358,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["construed",{"_index":1625,"title":{},"body":{"license.html":{}}}],["contain",{"_index":515,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["contained",{"_index":1612,"title":{},"body":{"license.html":{}}}],["container",{"_index":731,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/StreamDirective.html":{}}}],["contains",{"_index":1202,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}}}],["content",{"_index":736,"title":{},"body":{"directives/LayoutDirective.html":{},"license.html":{}}}],["content_subtitle",{"_index":561,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["contents",{"_index":1621,"title":{},"body":{"license.html":{}}}],["context",{"_index":948,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{}}}],["continuation",{"_index":452,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["contract",{"_index":1467,"title":{},"body":{"license.html":{}}}],["contribution",{"_index":1517,"title":{},"body":{"license.html":{}}}],["contribution(s",{"_index":1574,"title":{},"body":{"license.html":{}}}],["contributions",{"_index":1631,"title":{},"body":{"license.html":{}}}],["contributor",{"_index":1544,"title":{},"body":{"license.html":{}}}],["contributory",{"_index":1586,"title":{},"body":{"license.html":{}}}],["control",{"_index":405,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"license.html":{}}}],["controlled",{"_index":1455,"title":{},"body":{"license.html":{}}}],["controlls",{"_index":1221,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["controls",{"_index":778,"title":{},"body":{"directives/MinimalDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["conversions",{"_index":1493,"title":{},"body":{"license.html":{}}}],["copies",{"_index":1592,"title":{},"body":{"license.html":{}}}],["copy",{"_index":1597,"title":{},"body":{"license.html":{}}}],["copyright",{"_index":1446,"title":{},"body":{"license.html":{}}}],["correct",{"_index":301,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["correctly",{"_index":704,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["counterclaim",{"_index":1582,"title":{},"body":{"license.html":{}}}],["create",{"_index":1318,"title":{},"body":{"components/VideoconferenceComponent.html":{},"index.html":{}}}],["created",{"_index":1328,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["creation",{"_index":612,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["credentials",{"_index":516,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["cross",{"_index":1580,"title":{},"body":{"license.html":{}}}],["current",{"_index":1305,"title":{},"body":{"injectables/TranslateService.html":{}}}],["currently",{"_index":864,"title":{},"body":{"interfaces/PanelStatusInfo.html":{},"injectables/TranslateService.html":{}}}],["cus",{"_index":677,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["cus.json",{"_index":680,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["custom",{"_index":263,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["customary",{"_index":1651,"title":{},"body":{"license.html":{}}}],["customization",{"_index":1134,"title":{},"body":{"directives/StreamDirective.html":{}}}],["customize",{"_index":502,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/StreamDirective.html":{},"index.html":{}}}],["customized",{"_index":701,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["customizing",{"_index":117,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["d",{"_index":1609,"title":{},"body":{"license.html":{}}}],["damages",{"_index":1683,"title":{},"body":{"license.html":{}}}],["dashboard",{"_index":443,"title":{},"body":{"components/AdminDashboardComponent.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["dashboard'},{'name",{"_index":130,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["dashboard.component.html",{"_index":445,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["dashboard.component.scss",{"_index":444,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["dashboard.component.ts",{"_index":442,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["dashboard/admin",{"_index":441,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["dashboard[navbartitle",{"_index":505,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{}}}],["dashboard[navbartitle]'},{'name",{"_index":160,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["dashboard[recordingslist",{"_index":498,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{}}}],["dashboard[recordingslist]'},{'name",{"_index":158,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["data",{"_index":91,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"directives/ChatPanelDirective.html":{},"injectables/ParticipantService.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["data.participantname",{"_index":601,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["datapacket_kind",{"_index":602,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["datapublishoptions",{"_index":603,"title":{},"body":{"directives/ChatPanelDirective.html":{},"injectables/ParticipantService.html":{}}}],["datatopic",{"_index":604,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["datatopic.chat",{"_index":619,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["date",{"_index":479,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingStatusInfo.html":{},"components/ToolbarComponent.html":{},"license.html":{}}}],["dd/mm/yyyy",{"_index":1087,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["ddf2ff",{"_index":399,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/PanelDirective.html":{}}}],["de",{"_index":642,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["declarations",{"_index":532,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["default",{"_index":16,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/variables.html":{}}}],["defend",{"_index":1716,"title":{},"body":{"license.html":{}}}],["define",{"_index":400,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["defined",{"_index":1440,"title":{},"body":{"license.html":{}}}],["defines",{"_index":1029,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}}}],["defining",{"_index":984,"title":{},"body":{"interfaces/ParticipantProperties.html":{}}}],["definition",{"_index":1459,"title":{},"body":{"license.html":{}}}],["definitions",{"_index":1437,"title":{},"body":{"license.html":{}}}],["delete",{"_index":96,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["deleted",{"_index":455,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["deliberate",{"_index":1678,"title":{},"body":{"license.html":{}}}],["demonstrate",{"_index":953,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["dependencies",{"_index":530,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["depending",{"_index":303,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["deployment",{"_index":304,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["derivative",{"_index":1500,"title":{},"body":{"license.html":{}}}],["derived",{"_index":1503,"title":{},"body":{"license.html":{}}}],["describing",{"_index":1652,"title":{},"body":{"license.html":{}}}],["description",{"_index":9,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["designated",{"_index":1542,"title":{},"body":{"license.html":{}}}],["destination",{"_index":1009,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["detailed",{"_index":435,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/StreamDirective.html":{},"index.html":{}}}],["detection",{"_index":1142,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["determining",{"_index":1668,"title":{},"body":{"license.html":{}}}],["deutsch",{"_index":669,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["development",{"_index":295,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["device",{"_index":1018,"title":{},"body":{"injectables/ParticipantService.html":{},"components/VideoconferenceComponent.html":{}}}],["deviceid",{"_index":1020,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["devices",{"_index":1064,"title":{},"body":{"directives/PrejoinDirective.html":{}}}],["dialog",{"_index":1024,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["different",{"_index":1362,"title":{},"body":{"miscellaneous/enumerations.html":{},"license.html":{}}}],["differente",{"_index":855,"title":{},"body":{"injectables/PanelService.html":{}}}],["direct",{"_index":1462,"title":{},"body":{"license.html":{}}}],["direction",{"_index":1465,"title":{},"body":{"license.html":{}}}],["directive",{"_index":0,"title":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["directives",{"_index":2,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["disabled",{"_index":547,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"injectables/ParticipantService.html":{},"components/ToolbarComponent.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["disclaimer",{"_index":1655,"title":{},"body":{"license.html":{}}}],["disconnected",{"_index":968,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["disconnecting",{"_index":964,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["disconnectroom",{"_index":791,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["disconnects",{"_index":797,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["discussing",{"_index":1537,"title":{},"body":{"license.html":{}}}],["display",{"_index":732,"title":{},"body":{"directives/LayoutDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"directives/TokenErrorDirective.html":{},"license.html":{}}}],["displayaudiodetection",{"_index":1120,"title":{},"body":{"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["displayaudiodetectionvalue",{"_index":1144,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["displayed",{"_index":871,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["displaying",{"_index":593,"title":{},"body":{"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{}}}],["displaylogo",{"_index":1241,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{}}}],["displayparticipantname",{"_index":1119,"title":{},"body":{"components/StreamComponent.html":{},"directives/StreamDisplayParticipantNameDirective.html":{}}}],["displayparticipantnamevalue",{"_index":1149,"title":{},"body":{"directives/StreamDisplayParticipantNameDirective.html":{}}}],["displayroomname",{"_index":1240,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{}}}],["distribute",{"_index":1562,"title":{},"body":{"license.html":{}}}],["distributed",{"_index":1614,"title":{},"body":{"license.html":{}}}],["distribution",{"_index":1436,"title":{},"body":{"license.html":{}}}],["document",{"_index":1444,"title":{},"body":{"license.html":{}}}],["documentation",{"_index":1421,"title":{},"body":{"index.html":{},"license.html":{}}}],["doesn't",{"_index":925,"title":{},"body":{"directives/ParticipantNameDirective.html":{}}}],["don't",{"_index":1730,"title":{},"body":{"license.html":{}}}],["download",{"_index":99,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["duration",{"_index":484,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingInfo.html":{}}}],["during",{"_index":1162,"title":{},"body":{"directives/TokenErrorDirective.html":{}}}],["dutch",{"_index":672,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["e.g",{"_index":433,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["e6e6e6",{"_index":1413,"title":{},"body":{"index.html":{}}}],["each",{"_index":716,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"injectables/ParticipantService.html":{},"directives/TokenDirective.html":{},"injectables/TranslateService.html":{},"license.html":{}}}],["ease",{"_index":1322,"title":{},"body":{"components/VideoconferenceComponent.html":{},"index.html":{}}}],["easier",{"_index":1737,"title":{},"body":{"license.html":{}}}],["eb5144",{"_index":1409,"title":{},"body":{"index.html":{}}}],["editorial",{"_index":1504,"title":{},"body":{"license.html":{}}}],["effectively",{"_index":726,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["effects",{"_index":844,"title":{},"body":{"injectables/PanelService.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"miscellaneous/enumerations.html":{}}}],["effortlessly",{"_index":260,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{}}}],["elaborations",{"_index":1507,"title":{},"body":{"license.html":{}}}],["electronic",{"_index":1524,"title":{},"body":{"license.html":{}}}],["element",{"_index":20,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["elementref",{"_index":41,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["elements",{"_index":822,"title":{},"body":{"directives/PanelDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{}}}],["emits",{"_index":1335,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["emitted",{"_index":1227,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["emmited",{"_index":859,"title":{},"body":{"interfaces/PanelStatusEvent.html":{}}}],["employ",{"_index":724,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["empowers",{"_index":259,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["empty",{"_index":298,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{}}}],["en",{"_index":638,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["enabled",{"_index":546,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"components/ToolbarComponent.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["enables",{"_index":372,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["enabling/disabling",{"_index":1268,"title":{},"body":{"directives/ToolbarDirective.html":{}}}],["enclosed",{"_index":1727,"title":{},"body":{"license.html":{}}}],["end",{"_index":1722,"title":{},"body":{"license.html":{}}}],["endedat",{"_index":1091,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["english",{"_index":637,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{}}}],["ensure",{"_index":702,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["entirely",{"_index":824,"title":{},"body":{"directives/PanelDirective.html":{}}}],["entities",{"_index":1454,"title":{},"body":{"license.html":{}}}],["entity",{"_index":1448,"title":{},"body":{"license.html":{}}}],["enum",{"_index":1359,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["enumerations",{"_index":1354,"title":{"miscellaneous/enumerations.html":{}},"body":{"miscellaneous/enumerations.html":{}}}],["environment.production",{"_index":1394,"title":{},"body":{"index.html":{}}}],["error",{"_index":338,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingStatusInfo.html":{},"directives/StreamDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["error.status",{"_index":339,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["error.url",{"_index":346,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["errormessage",{"_index":1352,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["errors",{"_index":432,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["errorvalue",{"_index":524,"title":{},"body":{"directives/AdminLoginErrorDirective.html":{}}}],["es",{"_index":640,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["español",{"_index":668,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["etc",{"_index":865,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["ev.isopened",{"_index":421,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["ev.paneltype",{"_index":422,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["even",{"_index":1699,"title":{},"body":{"license.html":{}}}],["event",{"_index":83,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"directives/ChatPanelDirective.html":{},"components/PanelComponent.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"injectables/ParticipantService.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingEvent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["eventemitter",{"_index":81,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/PanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["events",{"_index":417,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"index.html":{}}}],["example",{"_index":26,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"directives/PanelDirective.html":{},"interfaces/PanelStatusInfo.html":{},"directives/ParticipantNameDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"index.html":{},"license.html":{}}}],["except",{"_index":779,"title":{},"body":{"directives/MinimalDirective.html":{},"license.html":{}}}],["excluding",{"_index":1539,"title":{},"body":{"license.html":{}}}],["exclusive",{"_index":1553,"title":{},"body":{"license.html":{}}}],["exclusively",{"_index":966,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["executed",{"_index":1641,"title":{},"body":{"license.html":{}}}],["exercise",{"_index":1673,"title":{},"body":{"license.html":{}}}],["exercising",{"_index":1476,"title":{},"body":{"license.html":{}}}],["explicitly",{"_index":1633,"title":{},"body":{"license.html":{}}}],["export",{"_index":291,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["exports",{"_index":535,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["express",{"_index":1661,"title":{},"body":{"license.html":{}}}],["extends",{"_index":369,"title":{},"body":{"interfaces/ActivitiesPanelStatusEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"interfaces/ChatPanelStatusEvent.html":{},"interfaces/ParticipantTrackPublication.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"interfaces/SettingsPanelStatusEvent.html":{}}}],["external",{"_index":407,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"injectables/PanelService.html":{}}}],["extra",{"_index":1170,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["extracting",{"_index":708,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["extraction",{"_index":715,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["facilitates",{"_index":714,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["faff7f",{"_index":1054,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["failed",{"_index":1361,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["failure",{"_index":1695,"title":{},"body":{"license.html":{}}}],["false",{"_index":408,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/MinimalDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["feature",{"_index":1195,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["features",{"_index":1223,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["fee",{"_index":1704,"title":{},"body":{"license.html":{}}}],["few",{"_index":350,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["ffae35",{"_index":1411,"title":{},"body":{"index.html":{}}}],["ffddc9",{"_index":830,"title":{},"body":{"directives/PanelDirective.html":{}}}],["ffffff",{"_index":1415,"title":{},"body":{"index.html":{}}}],["field",{"_index":1010,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["fields",{"_index":1726,"title":{},"body":{"license.html":{}}}],["fifty",{"_index":1470,"title":{},"body":{"license.html":{}}}],["file",{"_index":4,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["filed",{"_index":1590,"title":{},"body":{"license.html":{}}}],["filename",{"_index":1092,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["files",{"_index":1487,"title":{},"body":{"license.html":{}}}],["final",{"_index":846,"title":{},"body":{"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{}}}],["find",{"_index":1308,"title":{},"body":{"injectables/TranslateService.html":{}}}],["fire",{"_index":85,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"injectables/ParticipantService.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["fired",{"_index":105,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/PanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["first",{"_index":1306,"title":{},"body":{"injectables/TranslateService.html":{}}}],["fitness",{"_index":1665,"title":{},"body":{"license.html":{}}}],["fixed",{"_index":1045,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["flag",{"_index":969,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["flags",{"_index":404,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["flex",{"_index":733,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["flexibility",{"_index":820,"title":{},"body":{"directives/PanelDirective.html":{}}}],["folder",{"_index":679,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["follow",{"_index":1194,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["following",{"_index":112,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["follows",{"_index":951,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{}}}],["force",{"_index":1028,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["forces",{"_index":1027,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["forcibly",{"_index":1043,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["form",{"_index":1479,"title":{},"body":{"license.html":{}}}],["format",{"_index":1734,"title":{},"body":{"license.html":{}}}],["forwarded",{"_index":1008,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["found",{"_index":347,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{}}}],["fr",{"_index":644,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["français",{"_index":670,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["free",{"_index":1555,"title":{},"body":{"license.html":{}}}],["french",{"_index":643,"title":{},"body":{"directives/LangDirective.html":{}}}],["fullscreen",{"_index":1229,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["fullscreen_exit",{"_index":1254,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["fullscreenbutton",{"_index":1236,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarFullscreenButtonDirective.html":{}}}],["fully",{"_index":116,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["function",{"_index":412,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["functionalities",{"_index":802,"title":{},"body":{"components/PanelComponent.html":{}}}],["functionality",{"_index":1206,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["functions",{"_index":703,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["generated",{"_index":1492,"title":{},"body":{"license.html":{}}}],["german",{"_index":641,"title":{},"body":{"directives/LangDirective.html":{}}}],["getaudiotracks",{"_index":917,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getavailablelanguages",{"_index":1293,"title":{},"body":{"injectables/TranslateService.html":{}}}],["getcameratracks",{"_index":919,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getiscameraenabled",{"_index":905,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getislocal",{"_index":920,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getismicrophoneenabled",{"_index":907,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getisscreenshareenabled",{"_index":908,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getisspeaking",{"_index":911,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getlocalparticipant",{"_index":988,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["getmyname",{"_index":989,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["getname",{"_index":904,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getonlyhasaudiotracks",{"_index":921,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getonlyhasscreentracks",{"_index":922,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getremoteparticipantbysid",{"_index":990,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["getremoteparticipantbysid(sid",{"_index":1004,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["getremoteparticipants",{"_index":991,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["getroom",{"_index":792,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["getroommetadata",{"_index":793,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["getroomname",{"_index":794,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["gets",{"_index":1269,"title":{},"body":{"directives/ToolbarDirective.html":{}}}],["getsid",{"_index":900,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getting",{"_index":1370,"title":{"index.html":{},"license.html":{}},"body":{"index.html":{}}}],["gettoken(roomname",{"_index":332,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["gettracks",{"_index":913,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["getvideotracks",{"_index":915,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["give",{"_index":1595,"title":{},"body":{"license.html":{}}}],["given",{"_index":1005,"title":{},"body":{"injectables/ParticipantService.html":{},"injectables/TranslateService.html":{}}}],["goodwill",{"_index":1692,"title":{},"body":{"license.html":{}}}],["governing",{"_index":1746,"title":{},"body":{"license.html":{}}}],["grant",{"_index":770,"title":{},"body":{"directives/LivekitUrlDirective.html":{},"directives/TokenDirective.html":{},"license.html":{}}}],["granted",{"_index":1478,"title":{},"body":{"license.html":{}}}],["granting",{"_index":1450,"title":{},"body":{"license.html":{}}}],["grants",{"_index":1549,"title":{},"body":{"license.html":{}}}],["grossly",{"_index":1679,"title":{},"body":{"license.html":{}}}],["group",{"_index":1172,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["guide",{"_index":356,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"index.html":{}}}],["h:mm:ss",{"_index":481,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/ToolbarComponent.html":{}}}],["handle",{"_index":431,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"index.html":{}}}],["handler",{"_index":611,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["handling",{"_index":1222,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["harmless",{"_index":1718,"title":{},"body":{"license.html":{}}}],["height",{"_index":282,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["here",{"_index":439,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["hereby",{"_index":1548,"title":{},"body":{"license.html":{}}}],["herein",{"_index":1637,"title":{},"body":{"license.html":{}}}],["hh:mm",{"_index":1086,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["hi",{"_index":648,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["hidden",{"_index":285,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["hiding",{"_index":777,"title":{},"body":{"directives/MinimalDirective.html":{}}}],["hindi",{"_index":647,"title":{},"body":{"directives/LangDirective.html":{}}}],["hold",{"_index":1717,"title":{},"body":{"license.html":{}}}],["hosted",{"_index":683,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{}}}],["html",{"_index":719,"title":{},"body":{"directives/LayoutDirective.html":{},"interfaces/ParticipantTrackPublication.html":{}}}],["http://localhost:6080",{"_index":318,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["http://www.apache.org/licenses",{"_index":1432,"title":{},"body":{"license.html":{}}}],["http://www.apache.org/licenses/license",{"_index":1743,"title":{},"body":{"license.html":{}}}],["httpclient",{"_index":269,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["https",{"_index":319,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["id",{"_index":1019,"title":{},"body":{"injectables/ParticipantService.html":{},"interfaces/RecordingInfo.html":{}}}],["identification",{"_index":1738,"title":{},"body":{"license.html":{}}}],["identifier",{"_index":903,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["identifying",{"_index":1729,"title":{},"body":{"license.html":{}}}],["ii",{"_index":1468,"title":{},"body":{"license.html":{}}}],["iii",{"_index":1474,"title":{},"body":{"license.html":{}}}],["illustrate",{"_index":1132,"title":{},"body":{"directives/StreamDirective.html":{}}}],["implementing",{"_index":764,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{}}}],["implements",{"_index":28,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["implied",{"_index":1662,"title":{},"body":{"license.html":{}}}],["import",{"_index":268,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{},"license.html":{}}}],["importprovidersfrom",{"_index":1396,"title":{},"body":{"index.html":{}}}],["imports",{"_index":290,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["improving",{"_index":1538,"title":{},"body":{"license.html":{}}}],["inability",{"_index":1690,"title":{},"body":{"license.html":{}}}],["incidental",{"_index":1685,"title":{},"body":{"license.html":{}}}],["include",{"_index":1511,"title":{},"body":{"license.html":{}}}],["included",{"_index":1174,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"license.html":{}}}],["includes",{"_index":1610,"title":{},"body":{"license.html":{}}}],["including",{"_index":1483,"title":{},"body":{"license.html":{}}}],["inclusion",{"_index":1521,"title":{},"body":{"license.html":{}}}],["incorporate",{"_index":962,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["incorporated",{"_index":1546,"title":{},"body":{"license.html":{}}}],["incurred",{"_index":1719,"title":{},"body":{"license.html":{}}}],["indemnify",{"_index":1715,"title":{},"body":{"license.html":{}}}],["indemnity",{"_index":1706,"title":{},"body":{"license.html":{}}}],["index",{"_index":37,"title":{"index.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/LangOption.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["indicate",{"_index":970,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["indicated",{"_index":1496,"title":{},"body":{"license.html":{}}}],["indicates",{"_index":863,"title":{},"body":{"interfaces/PanelStatusInfo.html":{},"interfaces/ParticipantTrackPublication.html":{}}}],["indirect",{"_index":1463,"title":{},"body":{"license.html":{}}}],["individual",{"_index":1365,"title":{},"body":{"miscellaneous/enumerations.html":{},"license.html":{}}}],["info",{"_index":3,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["information",{"_index":584,"title":{},"body":{"interfaces/BroadcastingStatusInfo.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"interfaces/RecordingStatusInfo.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["informational",{"_index":1622,"title":{},"body":{"license.html":{}}}],["infringed",{"_index":1573,"title":{},"body":{"license.html":{}}}],["infringement",{"_index":1587,"title":{},"body":{"license.html":{}}}],["initialize",{"_index":402,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["injectable",{"_index":567,"title":{"injectables/BroadcastingService.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"injectables/TranslateService.html":{}},"body":{}}],["injectables",{"_index":569,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"injectables/TranslateService.html":{},"overview.html":{}}}],["inputs",{"_index":45,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["insert",{"_index":821,"title":{},"body":{"directives/PanelDirective.html":{}}}],["inserted",{"_index":1197,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}}}],["inside",{"_index":684,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{}}}],["install",{"_index":1390,"title":{},"body":{"index.html":{}}}],["instance",{"_index":798,"title":{},"body":{"injectables/OpenViduService.html":{},"interfaces/ParticipantProperties.html":{}}}],["institute",{"_index":1577,"title":{},"body":{"license.html":{}}}],["instructions",{"_index":436,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["integral",{"_index":590,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["integrate",{"_index":373,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["intentionally",{"_index":1519,"title":{},"body":{"license.html":{}}}],["interface",{"_index":114,"title":{"interfaces/ActivitiesPanelStatusEvent.html":{},"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"interfaces/ChatPanelStatusEvent.html":{},"interfaces/LangOption.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"interfaces/ParticipantProperties.html":{},"interfaces/ParticipantTrackPublication.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"interfaces/SettingsPanelStatusEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"components/ChatPanelComponent.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"components/ParticipantPanelItemComponent.html":{},"interfaces/ParticipantProperties.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["interfaces",{"_index":367,"title":{},"body":{"interfaces/ActivitiesPanelStatusEvent.html":{},"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"interfaces/ChatPanelStatusEvent.html":{},"interfaces/LangOption.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"interfaces/ParticipantProperties.html":{},"interfaces/ParticipantTrackPublication.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"license.html":{},"overview.html":{}}}],["introduction",{"_index":1375,"title":{},"body":{"index.html":{}}}],["irrevocable",{"_index":1556,"title":{},"body":{"license.html":{}}}],["isactivitiespanelopened",{"_index":834,"title":{},"body":{"injectables/PanelService.html":{}}}],["isaudiotrack",{"_index":1032,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["isbackgroundeffectspanelopened",{"_index":835,"title":{},"body":{"injectables/PanelService.html":{}}}],["iscameraenabled",{"_index":878,"title":{},"body":{"classes/ParticipantModel.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["iscameratrack",{"_index":1033,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["ischatpanelopened",{"_index":836,"title":{},"body":{"injectables/PanelService.html":{}}}],["isexternalpanelopened",{"_index":837,"title":{},"body":{"injectables/PanelService.html":{}}}],["islocal",{"_index":885,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["ismicrophoneenabled",{"_index":879,"title":{},"body":{"classes/ParticipantModel.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["isminimized",{"_index":1034,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["ismutedforcibly",{"_index":1035,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["ismycameraenabled",{"_index":992,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["ismymicrophoneenabled",{"_index":993,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["ismyscreenshareenabled",{"_index":994,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["isopened",{"_index":861,"title":{},"body":{"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{}}}],["isparticipantspanelopened",{"_index":838,"title":{},"body":{"injectables/PanelService.html":{}}}],["ispinned",{"_index":1036,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["isroomconnected",{"_index":795,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["isscreenshareenabled",{"_index":880,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["isscreentrack",{"_index":1037,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["issettingspanelopened",{"_index":839,"title":{},"body":{"injectables/PanelService.html":{}}}],["isspeaking",{"_index":881,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["issue",{"_index":1533,"title":{},"body":{"license.html":{}}}],["issues",{"_index":1161,"title":{},"body":{"directives/TokenErrorDirective.html":{}}}],["italian",{"_index":649,"title":{},"body":{"directives/LangDirective.html":{}}}],["italiano",{"_index":671,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["item",{"_index":739,"title":{},"body":{"directives/LayoutDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{}}}],["item'},{'name",{"_index":142,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["item.component.html",{"_index":936,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["item.component.scss",{"_index":935,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["item.component.ts",{"_index":933,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["item.directive.ts",{"_index":976,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["item/participant",{"_index":932,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["item[mutebutton",{"_index":979,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["item[mutebutton]'},{'name",{"_index":189,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["items",{"_index":960,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{}}}],["ja",{"_index":651,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["january",{"_index":1430,"title":{},"body":{"license.html":{}}}],["japanese",{"_index":650,"title":{},"body":{"directives/LangDirective.html":{}}}],["join",{"_index":544,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["joins",{"_index":414,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{}}}],["json.parse(new",{"_index":620,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["json.stringify",{"_index":629,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["justify",{"_index":735,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["key",{"_index":1302,"title":{},"body":{"injectables/TranslateService.html":{}}}],["keyboard_double_arrow_down",{"_index":492,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["keys",{"_index":1287,"title":{},"body":{"injectables/TranslateService.html":{}}}],["keyword",{"_index":949,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{}}}],["kind",{"_index":814,"title":{},"body":{"components/PanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"license.html":{}}}],["lang",{"_index":634,"title":{},"body":{"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["langdirective",{"_index":169,"title":{"directives/LangDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["langoption",{"_index":657,"title":{"interfaces/LangOption.html":{}},"body":{"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{}}}],["langoptions",{"_index":660,"title":{},"body":{"directives/LangOptionsDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["langoptionsdirective",{"_index":171,"title":{"directives/LangOptionsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["language",{"_index":636,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["languages",{"_index":662,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["lastvaluefrom",{"_index":272,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["law",{"_index":1657,"title":{},"body":{"license.html":{}}}],["lawsuit",{"_index":1583,"title":{},"body":{"license.html":{}}}],["layout",{"_index":687,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{}}}],["layout'},{'name",{"_index":138,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["layout.component.html",{"_index":689,"title":{},"body":{"components/LayoutComponent.html":{}}}],["layout.component.scss",{"_index":688,"title":{},"body":{"components/LayoutComponent.html":{}}}],["layoutcomponent",{"_index":137,"title":{"components/LayoutComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["layoutdirective",{"_index":173,"title":{"directives/LayoutDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["layouts",{"_index":765,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["leaks",{"_index":753,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["learn",{"_index":1207,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["leave",{"_index":296,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"index.html":{}}}],["leavebutton",{"_index":1238,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarLeaveButtonDirective.html":{}}}],["leavesession",{"_index":972,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["legal",{"_index":1451,"title":{},"body":{"license.html":{}}}],["legend",{"_index":531,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["level",{"_index":1383,"title":{},"body":{"index.html":{}}}],["liability",{"_index":1674,"title":{},"body":{"license.html":{}}}],["liable",{"_index":1682,"title":{},"body":{"license.html":{}}}],["library",{"_index":860,"title":{},"body":{"interfaces/PanelStatusEvent.html":{}}}],["libservice",{"_index":50,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["licensable",{"_index":1571,"title":{},"body":{"license.html":{}}}],["license",{"_index":1426,"title":{"license.html":{}},"body":{"license.html":{}}}],["licensed",{"_index":1741,"title":{},"body":{"license.html":{}}}],["licenses",{"_index":1588,"title":{},"body":{"license.html":{}}}],["licensor",{"_index":1445,"title":{},"body":{"license.html":{}}}],["light",{"_index":1412,"title":{},"body":{"index.html":{}}}],["limitation",{"_index":1663,"title":{},"body":{"license.html":{}}}],["limitations",{"_index":1747,"title":{},"body":{"license.html":{}}}],["limited",{"_index":1484,"title":{},"body":{"license.html":{}}}],["lines",{"_index":351,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["link",{"_index":696,"title":{},"body":{"components/LayoutComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"license.html":{}}}],["list",{"_index":804,"title":{},"body":{"components/PanelComponent.html":{},"injectables/TranslateService.html":{}}}],["lists",{"_index":1531,"title":{},"body":{"license.html":{}}}],["literal",{"_index":799,"title":{},"body":{"injectables/OpenViduService.html":{}}}],["litigation",{"_index":1578,"title":{},"body":{"license.html":{}}}],["live",{"_index":1245,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["livekit",{"_index":771,"title":{},"body":{"directives/LivekitUrlDirective.html":{}}}],["livekit_url",{"_index":306,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["livekiturl",{"_index":768,"title":{},"body":{"directives/LivekitUrlDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["livekiturldirective",{"_index":175,"title":{"directives/LivekitUrlDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/LivekitUrlDirective.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["load",{"_index":447,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["local",{"_index":294,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["localhost",{"_index":317,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["localparticipant",{"_index":690,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["localparticipant.name",{"_index":1052,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["localparticipant.tracks",{"_index":730,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["localparticipantsubs",{"_index":745,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["localtrack",{"_index":897,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["located",{"_index":985,"title":{},"body":{"interfaces/ParticipantProperties.html":{}}}],["location",{"_index":1093,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["login",{"_index":511,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["login'},{'name",{"_index":132,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["login.component.html",{"_index":513,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["login.component.scss",{"_index":512,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["login.component.ts",{"_index":510,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["login/admin",{"_index":509,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["login[error",{"_index":523,"title":{},"body":{"directives/AdminLoginErrorDirective.html":{}}}],["login[error]'},{'name",{"_index":162,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["login[navbartitle",{"_index":526,"title":{},"body":{"directives/AdminLoginTitleDirective.html":{}}}],["login[navbartitle]'},{'name",{"_index":164,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["logo",{"_index":1271,"title":{},"body":{"directives/ToolbarDisplayLogoDirective.html":{},"index.html":{}}}],["logout",{"_index":454,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["looks",{"_index":1311,"title":{},"body":{"injectables/TranslateService.html":{}}}],["loss",{"_index":1691,"title":{},"body":{"license.html":{}}}],["losses",{"_index":1698,"title":{},"body":{"license.html":{}}}],["low",{"_index":1382,"title":{},"body":{"index.html":{}}}],["m/d/yy",{"_index":480,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["made",{"_index":1041,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{},"license.html":{}}}],["mailing",{"_index":1530,"title":{},"body":{"license.html":{}}}],["make",{"_index":1566,"title":{},"body":{"license.html":{}}}],["making",{"_index":1481,"title":{},"body":{"license.html":{}}}],["malfunction",{"_index":1696,"title":{},"body":{"license.html":{}}}],["manage",{"_index":1381,"title":{},"body":{"index.html":{}}}],["managed",{"_index":1535,"title":{},"body":{"license.html":{}}}],["management",{"_index":1466,"title":{},"body":{"license.html":{}}}],["managing",{"_index":1285,"title":{},"body":{"injectables/TranslateService.html":{}}}],["margin",{"_index":396,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{}}}],["marked",{"_index":1541,"title":{},"body":{"license.html":{}}}],["markedfordeletion",{"_index":1094,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["marks",{"_index":1647,"title":{},"body":{"license.html":{}}}],["matching",{"_index":63,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"license.html":{},"modules.html":{},"overview.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["material",{"_index":1388,"title":{},"body":{"index.html":{}}}],["maticon",{"_index":380,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["maticonbutton",{"_index":382,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["matmenu",{"_index":955,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{}}}],["matmenuitem",{"_index":956,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{}}}],["matmenutrigger",{"_index":954,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{}}}],["mb",{"_index":489,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["mbs",{"_index":1085,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["mean",{"_index":1439,"title":{},"body":{"license.html":{}}}],["means",{"_index":1460,"title":{},"body":{"license.html":{}}}],["mechanical",{"_index":1489,"title":{},"body":{"license.html":{}}}],["media",{"_index":1063,"title":{},"body":{"directives/PrejoinDirective.html":{},"components/ToolbarComponent.html":{},"license.html":{}}}],["medium",{"_index":1593,"title":{},"body":{"license.html":{}}}],["meet",{"_index":1594,"title":{},"body":{"license.html":{}}}],["memory",{"_index":752,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["merchantability",{"_index":1664,"title":{},"body":{"license.html":{}}}],["merely",{"_index":1514,"title":{},"body":{"license.html":{}}}],["message",{"_index":343,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"directives/StreamDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["messages",{"_index":609,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["metadata",{"_index":31,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["method",{"_index":853,"title":{},"body":{"injectables/PanelService.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"injectables/TranslateService.html":{}}}],["methods",{"_index":42,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"injectables/BroadcastingService.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{}}}],["mic",{"_index":781,"title":{},"body":{"directives/MinimalDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{}}}],["mic_off",{"_index":1247,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["microphone",{"_index":545,"title":{},"body":{"directives/AudioEnabledDirective.html":{},"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["minimal",{"_index":775,"title":{},"body":{"directives/MinimalDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["minimaldirective",{"_index":177,"title":{"directives/MinimalDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["minimized",{"_index":1040,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["miscellaneous",{"_index":1353,"title":{"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}},"body":{"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["modern",{"_index":1319,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["modifications",{"_index":1482,"title":{},"body":{"license.html":{}}}],["modified",{"_index":1599,"title":{},"body":{"license.html":{}}}],["modify",{"_index":113,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["modifying",{"_index":1626,"title":{},"body":{"license.html":{}}}],["module",{"_index":527,"title":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{}},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["modules",{"_index":529,"title":{"modules.html":{}},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"modules.html":{},"overview.html":{}}}],["more",{"_index":448,"title":{},"body":{"components/AdminDashboardComponent.html":{},"directives/LayoutDirective.html":{},"components/ToolbarComponent.html":{},"license.html":{}}}],["more_vert",{"_index":959,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"components/ToolbarComponent.html":{}}}],["msg",{"_index":608,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["multiple",{"_index":1299,"title":{},"body":{"injectables/TranslateService.html":{}}}],["mutebutton",{"_index":940,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["muted",{"_index":977,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantTrackPublication.html":{}}}],["mutevalue",{"_index":980,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["name",{"_index":23,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["names",{"_index":1646,"title":{},"body":{"license.html":{}}}],["native",{"_index":1022,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["navbar",{"_index":503,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["navbartitle",{"_index":501,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["navbartitlevalue",{"_index":506,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["necessarily",{"_index":1572,"title":{},"body":{"license.html":{}}}],["need",{"_index":926,"title":{},"body":{"directives/ParticipantNameDirective.html":{},"index.html":{}}}],["negligence",{"_index":1677,"title":{},"body":{"license.html":{}}}],["negligent",{"_index":1680,"title":{},"body":{"license.html":{}}}],["netherlands",{"_index":652,"title":{},"body":{"directives/LangDirective.html":{}}}],["new",{"_index":387,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LangOptionsDirective.html":{},"components/PanelComponent.html":{},"injectables/ParticipantService.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["ng",{"_index":1387,"title":{},"body":{"index.html":{}}}],["ngclass",{"_index":728,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["ngfor",{"_index":722,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["ngondestroy",{"_index":749,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["ngoninit",{"_index":410,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["nickname",{"_index":1128,"title":{},"body":{"directives/StreamDirective.html":{}}}],["nl",{"_index":653,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["non",{"_index":1552,"title":{},"body":{"license.html":{}}}],["none",{"_index":744,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["normally",{"_index":1619,"title":{},"body":{"license.html":{}}}],["note",{"_index":674,"title":{},"body":{"directives/LangOptionsDirective.html":{},"directives/LayoutDirective.html":{}}}],["nothing",{"_index":1636,"title":{},"body":{"license.html":{}}}],["notice",{"_index":1497,"title":{},"body":{"license.html":{}}}],["notices",{"_index":1602,"title":{},"body":{"license.html":{}}}],["notifications",{"_index":84,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["notwithstanding",{"_index":1634,"title":{},"body":{"license.html":{}}}],["npm",{"_index":1391,"title":{},"body":{"index.html":{}}}],["null",{"_index":507,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["number",{"_index":487,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingInfo.html":{}}}],["object",{"_index":676,"title":{},"body":{"directives/LangOptionsDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"directives/StreamDirective.html":{},"injectables/TranslateService.html":{},"license.html":{}}}],["objects",{"_index":666,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["obligations",{"_index":1707,"title":{},"body":{"license.html":{}}}],["observable",{"_index":580,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/PanelService.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"injectables/TranslateService.html":{}}}],["obtain",{"_index":430,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"license.html":{}}}],["offer",{"_index":1567,"title":{},"body":{"license.html":{}}}],["offers",{"_index":1337,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["official",{"_index":1310,"title":{},"body":{"injectables/TranslateService.html":{}}}],["on/off",{"_index":1186,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["onactivitiespanelstatuschanged",{"_index":805,"title":{},"body":{"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onaudiodevicechanged",{"_index":1325,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onaudioenabledchanged",{"_index":1226,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onbroadcastingstartrequested",{"_index":80,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onbroadcastingstoprequested",{"_index":92,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onbuttonclicked",{"_index":1210,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["onchatpanelstatuschanged",{"_index":808,"title":{},"body":{"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ondestroy",{"_index":30,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["one",{"_index":264,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarDirective.html":{},"license.html":{}}}],["ones",{"_index":815,"title":{},"body":{"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{}}}],["onfullscreenenabledchanged",{"_index":1228,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["oninit",{"_index":71,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onlangchanged",{"_index":1326,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onloadmorerecordingsrequested",{"_index":446,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["onloginrequested",{"_index":514,"title":{},"body":{"components/AdminLoginComponent.html":{}}}],["onlogoutrequested",{"_index":453,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["onlyhasaudiotracks",{"_index":886,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["onlyhasscreentracks",{"_index":887,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["onparticipantcreated",{"_index":1327,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onparticipantspanelstatuschanged",{"_index":809,"title":{},"body":{"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onreadytojoin",{"_index":1329,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onrecordingdeleterequested",{"_index":95,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onrecordingdownloadclicked",{"_index":98,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onrecordingplayclicked",{"_index":101,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onrecordingstartrequested",{"_index":104,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onrecordingstoprequested",{"_index":109,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onrefreshrecordingsrequested",{"_index":456,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["onroomcreated",{"_index":1332,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onroomcreated(room",{"_index":613,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["onroomdisconnected",{"_index":1230,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onscreenshareenabledchanged",{"_index":1231,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["onsettingspanelstatuschanged",{"_index":811,"title":{},"body":{"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ontokenrequested",{"_index":1333,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["ontokenrequested(participantname",{"_index":326,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["onvideodevicechanged",{"_index":1336,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["onvideoenabledchanged",{"_index":1232,"title":{},"body":{"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["open",{"_index":851,"title":{},"body":{"injectables/PanelService.html":{}}}],["open_in_full",{"_index":1125,"title":{},"body":{"components/StreamComponent.html":{}}}],["opened",{"_index":842,"title":{},"body":{"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{}}}],["openvidu",{"_index":275,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["openviducomponentsconfig",{"_index":1392,"title":{},"body":{"index.html":{}}}],["openviducomponentsconfigservice",{"_index":51,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["openviducomponentsdirectivemodule",{"_index":783,"title":{"modules/OpenViduComponentsDirectiveModule.html":{}},"body":{"modules/OpenViduComponentsDirectiveModule.html":{},"directives/StreamDirective.html":{},"modules.html":{},"overview.html":{}}}],["openviducomponentsmodule",{"_index":274,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["openviducomponentsmodule.forroot(config",{"_index":1397,"title":{},"body":{"index.html":{}}}],["openviduservice",{"_index":788,"title":{"injectables/OpenViduService.html":{}},"body":{"injectables/OpenViduService.html":{},"directives/ParticipantPanelItemElementsDirective.html":{}}}],["option",{"_index":870,"title":{},"body":{"interfaces/PanelStatusInfo.html":{},"components/VideoconferenceComponent.html":{}}}],["optional",{"_index":54,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"interfaces/BroadcastingStatusInfo.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{}}}],["options",{"_index":631,"title":{},"body":{"directives/ChatPanelDirective.html":{},"directives/LangOptionsDirective.html":{},"classes/ParticipantModel.html":{},"injectables/TranslateService.html":{}}}],["origin",{"_index":1653,"title":{},"body":{"license.html":{}}}],["original",{"_index":1510,"title":{},"body":{"license.html":{}}}],["otherwise",{"_index":1314,"title":{},"body":{"injectables/TranslateService.html":{},"license.html":{}}}],["out",{"_index":354,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/ChatPanelDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"index.html":{},"license.html":{},"overview.html":{}}}],["outputmode",{"_index":1095,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["outputs",{"_index":79,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/PanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["outstanding",{"_index":1472,"title":{},"body":{"license.html":{}}}],["ov",{"_index":33,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["ovactivitiespanel",{"_index":258,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{}}}],["ovactivitiespanel]'},{'name",{"_index":152,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovadditionalpanels",{"_index":371,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovadditionalpanels]'},{'name",{"_index":156,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovchatpanel",{"_index":597,"title":{},"body":{"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/PanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovchatpanel]'},{'name",{"_index":168,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovcomponents",{"_index":1765,"title":{},"body":{"miscellaneous/variables.html":{}}}],["overflow",{"_index":284,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["override",{"_index":661,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["overview",{"_index":1750,"title":{"overview.html":{}},"body":{"overview.html":{}}}],["ovlayout",{"_index":693,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovlayout]'},{'name",{"_index":174,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovpanel",{"_index":816,"title":{},"body":{"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovpanel]'},{'name",{"_index":180,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantpanelitem",{"_index":937,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantpanelitem=\"let",{"_index":952,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{}}}],["ovparticipantpanelitem]'},{'name",{"_index":184,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantpanelitemelements",{"_index":939,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantpanelitemelements]'},{'name",{"_index":186,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantspanel",{"_index":818,"title":{},"body":{"components/PanelComponent.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovparticipantspanel]'},{'name",{"_index":191,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovstream",{"_index":700,"title":{},"body":{"components/LayoutComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovstream=\"let",{"_index":1130,"title":{},"body":{"directives/StreamDirective.html":{}}}],["ovstream]'},{'name",{"_index":195,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbar",{"_index":1233,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbar]'},{'name",{"_index":228,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbaradditionalbuttons",{"_index":1168,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbaradditionalbuttons]'},{'name",{"_index":213,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbaradditionalbuttonsposition",{"_index":1196,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}}}],["ovtoolbaradditionalbuttonsposition]'},{'name",{"_index":215,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbaradditionalpanelbuttons",{"_index":1203,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["ovtoolbaradditionalpanelbuttons]'},{'name",{"_index":217,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["owner",{"_index":1447,"title":{},"body":{"license.html":{}}}],["ownership",{"_index":1469,"title":{},"body":{"license.html":{}}}],["p",{"_index":759,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["p.name",{"_index":1053,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["package",{"_index":1755,"title":{"properties.html":{}},"body":{}}],["page",{"_index":928,"title":{},"body":{"directives/ParticipantNameDirective.html":{},"directives/PrejoinDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["panel",{"_index":68,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["panel'},{'name",{"_index":127,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["panel.chat.subtitle",{"_index":599,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["panel.chat.title",{"_index":598,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["panel.chat.you",{"_index":600,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["panel.component.html",{"_index":78,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/ChatPanelComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantsPanelComponent.html":{}}}],["panel.component.scss",{"_index":76,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["panel.component.scss,./activities",{"_index":75,"title":{},"body":{"components/ActivitiesPanelComponent.html":{}}}],["panel.component.scss,./chat",{"_index":595,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["panel.component.scss,./participants",{"_index":1050,"title":{},"body":{"components/ParticipantsPanelComponent.html":{}}}],["panel.component.ts",{"_index":66,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/ChatPanelComponent.html":{},"components/ParticipantsPanelComponent.html":{}}}],["panel.directive.ts",{"_index":8,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["panel.participants.title",{"_index":1051,"title":{},"body":{"components/ParticipantsPanelComponent.html":{}}}],["panel.participants.you",{"_index":943,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["panel.recording.accept",{"_index":1080,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.content_subtitle",{"_index":1074,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.content_title",{"_index":1073,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.in_progress",{"_index":1084,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.recordings",{"_index":1082,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.starting",{"_index":1077,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.stopping",{"_index":1078,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.subtitle",{"_index":1071,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.recording.title",{"_index":1070,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel.streaming.required_url",{"_index":562,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["panel.streaming.start",{"_index":1256,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["panel.streaming.stop",{"_index":1257,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["panel.streaming.subtitle",{"_index":556,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["panel.streaming.title",{"_index":555,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["panel/activities",{"_index":65,"title":{},"body":{"components/ActivitiesPanelComponent.html":{}}}],["panel/broadcasting",{"_index":549,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["panel/chat",{"_index":589,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["panel/participant",{"_index":931,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["panel/participants",{"_index":1048,"title":{},"body":{"components/ParticipantsPanelComponent.html":{}}}],["panel/recording",{"_index":1066,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["panel1",{"_index":392,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["panel2",{"_index":393,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["panel[broadcastingactivity",{"_index":36,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{}}}],["panel[broadcastingactivity]'},{'name",{"_index":150,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["panel[recordingactivity",{"_index":361,"title":{},"body":{"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["panel[recordingactivity]'},{'name",{"_index":154,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["panelcomponent",{"_index":139,"title":{"components/PanelComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["paneldirective",{"_index":179,"title":{"directives/PanelDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["panels",{"_index":375,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ToolbarComponent.html":{},"miscellaneous/enumerations.html":{}}}],["panelservice",{"_index":379,"title":{"injectables/PanelService.html":{}},"body":{"directives/AdditionalPanelsDirective.html":{},"injectables/PanelService.html":{}}}],["panelsettingsoptions",{"_index":850,"title":{},"body":{"injectables/PanelService.html":{}}}],["panelstatusevent",{"_index":370,"title":{"interfaces/PanelStatusEvent.html":{}},"body":{"interfaces/ActivitiesPanelStatusEvent.html":{},"interfaces/ChatPanelStatusEvent.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"interfaces/SettingsPanelStatusEvent.html":{}}}],["panelstatusinfo",{"_index":378,"title":{"interfaces/PanelStatusInfo.html":{}},"body":{"directives/AdditionalPanelsDirective.html":{},"interfaces/PanelStatusInfo.html":{}}}],["panelstatusobs",{"_index":832,"title":{},"body":{"injectables/PanelService.html":{}}}],["paneltype",{"_index":848,"title":{},"body":{"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"miscellaneous/enumerations.html":{}}}],["parameter",{"_index":120,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["parameters",{"_index":52,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/PanelService.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{}}}],["parent",{"_index":19,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["part",{"_index":591,"title":{},"body":{"components/ChatPanelComponent.html":{},"license.html":{}}}],["partial",{"_index":1297,"title":{},"body":{"injectables/TranslateService.html":{}}}],["participanspanelcomponent",{"_index":934,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["participant",{"_index":141,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["participant's",{"_index":717,"title":{},"body":{"directives/LayoutDirective.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/StreamDirective.html":{}}}],["participant.islocal",{"_index":967,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["participant.name",{"_index":958,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{}}}],["participant?.name",{"_index":622,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["participantmodel",{"_index":692,"title":{"classes/ParticipantModel.html":{}},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"directives/StreamDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["participantname",{"_index":330,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["participantnamedirective",{"_index":181,"title":{"directives/ParticipantNameDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["participantpanelitem",{"_index":978,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["participantpanelitemcomponent",{"_index":140,"title":{"components/ParticipantPanelItemComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["participantpanelitemdirective",{"_index":183,"title":{"directives/ParticipantPanelItemDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["participantpanelitemelementsdirective",{"_index":185,"title":{"directives/ParticipantPanelItemElementsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["participantpanelitemmutebutton",{"_index":981,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["participantpanelitemmutebuttondirective",{"_index":187,"title":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["participantproperties",{"_index":889,"title":{"interfaces/ParticipantProperties.html":{}},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["participants",{"_index":144,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"components/ParticipantPanelItemComponent.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["participantservice",{"_index":605,"title":{"injectables/ParticipantService.html":{}},"body":{"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["participantspanelbutton",{"_index":1239,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{}}}],["participantspanelcomponent",{"_index":143,"title":{"components/ParticipantsPanelComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["participantspaneldirective",{"_index":190,"title":{"directives/ParticipantsPanelDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["participantspanelstatusevent",{"_index":810,"title":{"interfaces/ParticipantsPanelStatusEvent.html":{}},"body":{"components/PanelComponent.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["participanttrackpublication",{"_index":914,"title":{"interfaces/ParticipantTrackPublication.html":{}},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantTrackPublication.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{}}}],["particular",{"_index":1666,"title":{},"body":{"license.html":{}}}],["party",{"_index":1618,"title":{},"body":{"license.html":{}}}],["patent",{"_index":1563,"title":{},"body":{"license.html":{}}}],["payload",{"_index":90,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"directives/ChatPanelDirective.html":{},"injectables/ParticipantService.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["people",{"_index":1266,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["percent",{"_index":1471,"title":{},"body":{"license.html":{}}}],["perform",{"_index":1560,"title":{},"body":{"license.html":{}}}],["permission",{"_index":1644,"title":{},"body":{"license.html":{}}}],["permissions",{"_index":1477,"title":{},"body":{"license.html":{}}}],["perpetual",{"_index":1550,"title":{},"body":{"license.html":{}}}],["person",{"_index":941,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["pertain",{"_index":1608,"title":{},"body":{"license.html":{}}}],["picture_in_picture",{"_index":1249,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["pinned",{"_index":1044,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["pipe",{"_index":725,"title":{"pipes/RemoteParticipantTracksPipe.html":{}},"body":{"directives/LayoutDirective.html":{},"injectables/TranslateService.html":{},"overview.html":{}}}],["pipes",{"_index":1111,"title":{},"body":{"pipes/RemoteParticipantTracksPipe.html":{}}}],["place",{"_index":1046,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["places",{"_index":1613,"title":{},"body":{"license.html":{}}}],["play",{"_index":102,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["play_arrow",{"_index":471,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["play_circle",{"_index":559,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["please",{"_index":766,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"index.html":{}}}],["portuguese",{"_index":654,"title":{},"body":{"directives/LangDirective.html":{}}}],["português",{"_index":673,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["position",{"_index":1127,"title":{},"body":{"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"miscellaneous/enumerations.html":{}}}],["possibility",{"_index":1701,"title":{},"body":{"license.html":{}}}],["possible",{"_index":1198,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"miscellaneous/enumerations.html":{}}}],["post",{"_index":429,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["power",{"_index":1461,"title":{},"body":{"license.html":{}}}],["powerful",{"_index":1320,"title":{},"body":{"components/VideoconferenceComponent.html":{},"index.html":{}}}],["preferences",{"_index":1338,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["preferred",{"_index":1480,"title":{},"body":{"license.html":{}}}],["prejoin",{"_index":927,"title":{},"body":{"directives/ParticipantNameDirective.html":{},"directives/PrejoinDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["prejoin.preparing",{"_index":1351,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["prejoindirective",{"_index":192,"title":{"directives/PrejoinDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["prepare",{"_index":1558,"title":{},"body":{"license.html":{}}}],["prevent",{"_index":751,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["previous",{"_index":866,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["previouspaneltype",{"_index":862,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["primary",{"_index":1402,"title":{},"body":{"index.html":{}}}],["printed",{"_index":1736,"title":{},"body":{"license.html":{}}}],["private",{"_index":409,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["process",{"_index":712,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["product",{"_index":1648,"title":{},"body":{"license.html":{}}}],["production",{"_index":299,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["profile",{"_index":892,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["project",{"_index":1385,"title":{},"body":{"index.html":{}}}],["projects/.../broadcasting.model.ts",{"_index":1355,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["projects/.../lang.model.ts",{"_index":1761,"title":{},"body":{"miscellaneous/typealiases.html":{}}}],["projects/.../panel.model.ts",{"_index":1356,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["projects/.../recording.model.ts",{"_index":1357,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["projects/.../storage.model.ts",{"_index":1763,"title":{},"body":{"miscellaneous/variables.html":{}}}],["projects/.../toolbar.model.ts",{"_index":1358,"title":{},"body":{"miscellaneous/enumerations.html":{}}}],["projects/openvidu",{"_index":5,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["prominent",{"_index":1601,"title":{},"body":{"license.html":{}}}],["promise",{"_index":333,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["properly",{"_index":857,"title":{},"body":{"injectables/PanelService.html":{}}}],["properties",{"_index":38,"title":{"properties.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/LangOption.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{},"properties.html":{}}}],["propety",{"_index":664,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["props",{"_index":890,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["provide",{"_index":1628,"title":{},"body":{"license.html":{}}}],["provideanimations",{"_index":1398,"title":{},"body":{"index.html":{}}}],["provided",{"_index":663,"title":{},"body":{"directives/LangOptionsDirective.html":{},"directives/StreamDirective.html":{},"license.html":{}}}],["providers",{"_index":534,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"index.html":{},"overview.html":{}}}],["provides",{"_index":82,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["providing",{"_index":694,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["pt",{"_index":655,"title":{},"body":{"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"miscellaneous/typealiases.html":{}}}],["public",{"_index":40,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["publication",{"_index":1030,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["publicly",{"_index":1559,"title":{},"body":{"license.html":{}}}],["publishdata",{"_index":995,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["publishdata(data",{"_index":1006,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["published",{"_index":1047,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["publishes",{"_index":899,"title":{},"body":{"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{}}}],["publishoptions",{"_index":1007,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["publishtrack",{"_index":876,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["publishtrack(track",{"_index":896,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["purpose",{"_index":1536,"title":{},"body":{"license.html":{}}}],["purposes",{"_index":1458,"title":{},"body":{"license.html":{}}}],["push_pin",{"_index":1124,"title":{},"body":{"components/StreamComponent.html":{}}}],["pushes",{"_index":581,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/PanelService.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{}}}],["questions",{"_index":1423,"title":{},"body":{"index.html":{}}}],["radio_button_checked",{"_index":1069,"title":{},"body":{"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["radius",{"_index":1417,"title":{},"body":{"index.html":{}}}],["reach",{"_index":1425,"title":{},"body":{"index.html":{}}}],["reachable",{"_index":434,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["readable",{"_index":1611,"title":{},"body":{"license.html":{}}}],["ready",{"_index":1330,"title":{},"body":{"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["real",{"_index":1377,"title":{},"body":{"index.html":{}}}],["reason",{"_index":1721,"title":{},"body":{"license.html":{}}}],["reasonable",{"_index":1650,"title":{},"body":{"license.html":{}}}],["rec",{"_index":1243,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["received",{"_index":626,"title":{},"body":{"directives/ChatPanelDirective.html":{},"injectables/PanelService.html":{},"components/VideoconferenceComponent.html":{},"license.html":{}}}],["recipients",{"_index":1596,"title":{},"body":{"license.html":{}}}],["recognise",{"_index":698,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/ToolbarComponent.html":{}}}],["recommend",{"_index":1735,"title":{},"body":{"license.html":{}}}],["record",{"_index":1301,"title":{},"body":{"injectables/TranslateService.html":{},"miscellaneous/typealiases.html":{}}}],["recording",{"_index":70,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["recording.duration",{"_index":483,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["recording.endedat",{"_index":482,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["recording.filename",{"_index":473,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["recording.outputmode",{"_index":477,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["recording.roomname",{"_index":475,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["recording.size",{"_index":485,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["recording.startedat",{"_index":478,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["recording.status",{"_index":491,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["recordingactivity",{"_index":122,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["recordingactivitycomponent",{"_index":145,"title":{"components/RecordingActivityComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordingactivityvalue",{"_index":362,"title":{},"body":{"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["recordingbutton",{"_index":1235,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarRecordingButtonDirective.html":{}}}],["recordingdeleterequestedevent",{"_index":97,"title":{"interfaces/RecordingDeleteRequestedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordingdownloadclickedevent",{"_index":100,"title":{"interfaces/RecordingDownloadClickedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordingelapsedtime",{"_index":1109,"title":{},"body":{"interfaces/RecordingStatusInfo.html":{}}}],["recordingerror",{"_index":1079,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["recordingevent",{"_index":1089,"title":{"interfaces/RecordingEvent.html":{}},"body":{"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStopRequestedEvent.html":{}}}],["recordingid",{"_index":1090,"title":{},"body":{"interfaces/RecordingEvent.html":{}}}],["recordinginfo",{"_index":459,"title":{"interfaces/RecordingInfo.html":{}},"body":{"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{}}}],["recordinglist",{"_index":1110,"title":{},"body":{"interfaces/RecordingStatusInfo.html":{}}}],["recordingoutputmode",{"_index":1099,"title":{},"body":{"interfaces/RecordingInfo.html":{},"miscellaneous/enumerations.html":{}}}],["recordingplayclickedevent",{"_index":103,"title":{"interfaces/RecordingPlayClickedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordings",{"_index":449,"title":{},"body":{"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{}}}],["recordingservice",{"_index":1100,"title":{"injectables/RecordingService.html":{}},"body":{"injectables/RecordingService.html":{}}}],["recordingslist",{"_index":458,"title":{},"body":{"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{}}}],["recordingstartrequestedevent",{"_index":108,"title":{"interfaces/RecordingStartRequestedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordingstatus",{"_index":1072,"title":{},"body":{"components/RecordingActivityComponent.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"miscellaneous/enumerations.html":{}}}],["recordingstatusinfo",{"_index":1108,"title":{"interfaces/RecordingStatusInfo.html":{}},"body":{"interfaces/RecordingStatusInfo.html":{}}}],["recordingstatusobs",{"_index":1102,"title":{},"body":{"injectables/RecordingService.html":{}}}],["recordingstoprequestedevent",{"_index":110,"title":{"interfaces/RecordingStopRequestedEvent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["recordingsvalue",{"_index":499,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{}}}],["recordingtime",{"_index":1244,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["redistributing",{"_index":1670,"title":{},"body":{"license.html":{}}}],["redistribution",{"_index":1591,"title":{},"body":{"license.html":{}}}],["refer",{"_index":437,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"index.html":{}}}],["reference",{"_index":121,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["referencing",{"_index":950,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{}}}],["refresh",{"_index":457,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["regarding",{"_index":1642,"title":{},"body":{"license.html":{}}}],["registered",{"_index":1312,"title":{},"body":{"injectables/TranslateService.html":{}}}],["related",{"_index":585,"title":{},"body":{"interfaces/BroadcastingStatusInfo.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingStatusInfo.html":{}}}],["remain",{"_index":1512,"title":{},"body":{"license.html":{}}}],["remote",{"_index":709,"title":{},"body":{"directives/LayoutDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{}}}],["remoteparticipant",{"_index":606,"title":{},"body":{"directives/ChatPanelDirective.html":{},"interfaces/ParticipantProperties.html":{}}}],["remoteparticipants",{"_index":691,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["remoteparticipantssubs",{"_index":746,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["remoteparticipanttrackspipe",{"_index":713,"title":{"pipes/RemoteParticipantTracksPipe.html":{}},"body":{"directives/LayoutDirective.html":{},"pipes/RemoteParticipantTracksPipe.html":{}}}],["replace",{"_index":267,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{}}}],["replaced",{"_index":1267,"title":{},"body":{"directives/ToolbarDirective.html":{},"license.html":{}}}],["replacing",{"_index":1129,"title":{},"body":{"directives/StreamDirective.html":{}}}],["represent",{"_index":1508,"title":{},"body":{"license.html":{}}}],["representation",{"_index":895,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["representatives",{"_index":1529,"title":{},"body":{"license.html":{}}}],["represented",{"_index":807,"title":{},"body":{"components/PanelComponent.html":{}}}],["representing",{"_index":566,"title":{},"body":{"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{},"miscellaneous/enumerations.html":{}}}],["represents",{"_index":874,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["reproduce",{"_index":1557,"title":{},"body":{"license.html":{}}}],["reproducing",{"_index":1654,"title":{},"body":{"license.html":{}}}],["reproduction",{"_index":1435,"title":{},"body":{"license.html":{}}}],["request",{"_index":413,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["requested",{"_index":1184,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{}}}],["requests",{"_index":1060,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["required",{"_index":1649,"title":{},"body":{"license.html":{}}}],["reset",{"_index":540,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}],["respective",{"_index":829,"title":{},"body":{"directives/PanelDirective.html":{}}}],["responsibility",{"_index":1713,"title":{},"body":{"license.html":{}}}],["responsible",{"_index":1284,"title":{},"body":{"injectables/TranslateService.html":{},"license.html":{}}}],["rest",{"_index":451,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["result",{"_index":1689,"title":{},"body":{"license.html":{}}}],["resulting",{"_index":1488,"title":{},"body":{"license.html":{}}}],["results",{"_index":62,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/ActivitiesPanelStatusEvent.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"modules/ApiDirectiveModule.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/ChatPanelStatusEvent.html":{},"directives/LangDirective.html":{},"interfaces/LangOption.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/ParticipantsPanelStatusEvent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingDeleteRequestedEvent.html":{},"interfaces/RecordingDownloadClickedEvent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingPlayClickedEvent.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStartRequestedEvent.html":{},"interfaces/RecordingStatusInfo.html":{},"interfaces/RecordingStopRequestedEvent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"license.html":{},"modules.html":{},"overview.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["retain",{"_index":1605,"title":{},"body":{"license.html":{}}}],["retrieves",{"_index":1193,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"injectables/TranslateService.html":{}}}],["return",{"_index":335,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["returns",{"_index":56,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"injectables/BroadcastingService.html":{},"injectables/OpenViduService.html":{},"injectables/PanelService.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{}}}],["revisions",{"_index":1505,"title":{},"body":{"license.html":{}}}],["rights",{"_index":1709,"title":{},"body":{"license.html":{}}}],["risks",{"_index":1672,"title":{},"body":{"license.html":{}}}],["room",{"_index":401,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/AudioEnabledDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"injectables/OpenViduService.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["room.name",{"_index":1242,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["room.on",{"_index":614,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["roomevent",{"_index":607,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["roomevent.datareceived",{"_index":615,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["roomid",{"_index":1096,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["roomname",{"_index":307,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"interfaces/BroadcastingEvent.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["root",{"_index":278,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{}}}],["royalty",{"_index":1554,"title":{},"body":{"license.html":{}}}],["run",{"_index":1212,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["rxjs",{"_index":273,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["same",{"_index":854,"title":{},"body":{"injectables/PanelService.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"license.html":{}}}],["saved",{"_index":497,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{}}}],["screen",{"_index":909,"title":{},"body":{"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["screen_share",{"_index":1248,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["screenshare",{"_index":1278,"title":{},"body":{"directives/ToolbarScreenshareButtonDirective.html":{}}}],["screensharebutton",{"_index":1234,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarScreenshareButtonDirective.html":{}}}],["seamlessly",{"_index":819,"title":{},"body":{"directives/PanelDirective.html":{}}}],["search",{"_index":463,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["secondary",{"_index":1404,"title":{},"body":{"index.html":{}}}],["section",{"_index":1565,"title":{},"body":{"license.html":{}}}],["sections",{"_index":1441,"title":{},"body":{"license.html":{}}}],["see",{"_index":1744,"title":{},"body":{"license.html":{}}}],["select",{"_index":1025,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["selected",{"_index":1288,"title":{},"body":{"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{}}}],["selectedlanguageoption",{"_index":1291,"title":{},"body":{"injectables/TranslateService.html":{}}}],["selecting",{"_index":1062,"title":{},"body":{"directives/PrejoinDirective.html":{}}}],["selector",{"_index":32,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["sell",{"_index":1568,"title":{},"body":{"license.html":{}}}],["send",{"_index":428,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"components/ChatPanelComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["send(message",{"_index":627,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["sends",{"_index":1061,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["sensors",{"_index":554,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["sent",{"_index":1528,"title":{},"body":{"license.html":{}}}],["separable",{"_index":1513,"title":{},"body":{"license.html":{}}}],["separate",{"_index":1639,"title":{},"body":{"license.html":{}}}],["server",{"_index":427,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["serves",{"_index":592,"title":{},"body":{"components/ChatPanelComponent.html":{}}}],["service",{"_index":1283,"title":{},"body":{"injectables/TranslateService.html":{},"license.html":{}}}],["session",{"_index":594,"title":{},"body":{"components/ChatPanelComponent.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"components/ParticipantsPanelComponent.html":{}}}],["set",{"_index":574,"title":{},"body":{"injectables/BroadcastingService.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"injectables/RecordingService.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["setactivitiespanelbroadcastingactivity(value",{"_index":60,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{}}}],["setactivitiespanelrecordingactivity(value",{"_index":364,"title":{},"body":{"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["setbroadcastingactivity(value",{"_index":61,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{}}}],["setbroadcastingstarting",{"_index":572,"title":{},"body":{"injectables/BroadcastingService.html":{}}}],["setbroadcastingstopping",{"_index":573,"title":{},"body":{"injectables/BroadcastingService.html":{}}}],["setcameraenabled",{"_index":996,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setcameraenabled(enabled",{"_index":1011,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setdisplayaudiodetection(value",{"_index":1147,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["setdisplayparticipantname(value",{"_index":1152,"title":{},"body":{"directives/StreamDisplayParticipantNameDirective.html":{}}}],["seterror(value",{"_index":525,"title":{},"body":{"directives/AdminLoginErrorDirective.html":{}}}],["setmicrophoneenabled",{"_index":997,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setmicrophoneenabled(enabled",{"_index":1012,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setmutebutton(value",{"_index":983,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["setnavbartitle(value",{"_index":508,"title":{},"body":{"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginTitleDirective.html":{}}}],["setparticipantpanelitemmutebutton(value",{"_index":982,"title":{},"body":{"directives/ParticipantPanelItemMuteButtonDirective.html":{}}}],["setrecordingactivity(value",{"_index":365,"title":{},"body":{"directives/ActivitiesPanelRecordingActivityDirective.html":{}}}],["setrecordingslist(value",{"_index":500,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{}}}],["setrecordingstarting",{"_index":1103,"title":{},"body":{"injectables/RecordingService.html":{}}}],["setrecordingstopping",{"_index":1104,"title":{},"body":{"injectables/RecordingService.html":{}}}],["sets",{"_index":769,"title":{},"body":{"directives/LivekitUrlDirective.html":{},"directives/ParticipantNameDirective.html":{},"injectables/ParticipantService.html":{},"directives/TokenDirective.html":{}}}],["setscreenshareenabled",{"_index":998,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setscreenshareenabled(enabled",{"_index":1013,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["setstreamdisplayaudiodetection(value",{"_index":1146,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["setstreamdisplayparticipantname(value",{"_index":1151,"title":{},"body":{"directives/StreamDisplayParticipantNameDirective.html":{}}}],["setstreamvideocontrols(value",{"_index":1156,"title":{},"body":{"directives/StreamVideoControlsDirective.html":{}}}],["settings",{"_index":812,"title":{},"body":{"components/PanelComponent.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["settingsbutton",{"_index":1237,"title":{},"body":{"components/ToolbarComponent.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["settingspanelstatusevent",{"_index":813,"title":{"interfaces/SettingsPanelStatusEvent.html":{}},"body":{"components/PanelComponent.html":{},"interfaces/SettingsPanelStatusEvent.html":{},"components/VideoconferenceComponent.html":{}}}],["settrack(track",{"_index":1118,"title":{},"body":{"components/StreamComponent.html":{}}}],["setvideocontrols(value",{"_index":1157,"title":{},"body":{"directives/StreamVideoControlsDirective.html":{}}}],["shall",{"_index":1438,"title":{},"body":{"license.html":{}}}],["share",{"_index":910,"title":{},"body":{"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["shares",{"_index":1473,"title":{},"body":{"license.html":{}}}],["sharing",{"_index":1038,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["show",{"_index":496,"title":{},"body":{"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminLoginErrorDirective.html":{}}}],["show/hide",{"_index":12,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/PrejoinDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["showcase",{"_index":266,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/PanelDirective.html":{}}}],["showexternalpanel",{"_index":386,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["showexternalpanel2",{"_index":389,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["showing",{"_index":67,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"injectables/ParticipantService.html":{},"components/RecordingActivityComponent.html":{}}}],["shown",{"_index":1331,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["shows",{"_index":69,"title":{},"body":{"components/ActivitiesPanelComponent.html":{}}}],["sid",{"_index":877,"title":{},"body":{"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{}}}],["simple",{"_index":963,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["simplest",{"_index":1376,"title":{},"body":{"index.html":{}}}],["simplifies",{"_index":711,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["size",{"_index":1097,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["smaller",{"_index":1042,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["software",{"_index":1485,"title":{},"body":{"license.html":{}}}],["sole",{"_index":1712,"title":{},"body":{"license.html":{}}}],["solely",{"_index":1667,"title":{},"body":{"license.html":{}}}],["solid",{"_index":1139,"title":{},"body":{"directives/StreamDirective.html":{}}}],["sortbylegend",{"_index":464,"title":{},"body":{"components/AdminDashboardComponent.html":{}}}],["source",{"_index":1039,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{},"license.html":{}}}],["space",{"_index":737,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["spanish",{"_index":639,"title":{},"body":{"directives/LangDirective.html":{}}}],["speaking",{"_index":912,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["special",{"_index":1684,"title":{},"body":{"license.html":{}}}],["specific",{"_index":1745,"title":{},"body":{"license.html":{}}}],["specifies",{"_index":893,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["specifying",{"_index":22,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"interfaces/PanelStatusInfo.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{}}}],["standalone",{"_index":289,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["star",{"_index":385,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["start",{"_index":86,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["start/stop",{"_index":1216,"title":{},"body":{"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{}}}],["started",{"_index":576,"title":{"index.html":{},"license.html":{}},"body":{"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{},"miscellaneous/enumerations.html":{},"index.html":{}}}],["startedat",{"_index":1098,"title":{},"body":{"interfaces/RecordingInfo.html":{}}}],["starting",{"_index":575,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{},"miscellaneous/enumerations.html":{}}}],["stastus",{"_index":1105,"title":{},"body":{"injectables/RecordingService.html":{}}}],["state",{"_index":1107,"title":{},"body":{"injectables/RecordingService.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["stated",{"_index":1564,"title":{},"body":{"license.html":{}}}],["statement",{"_index":1627,"title":{},"body":{"license.html":{}}}],["statements",{"_index":723,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["stating",{"_index":1603,"title":{},"body":{"license.html":{}}}],["status",{"_index":342,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStatusInfo.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/enumerations.html":{}}}],["statuses",{"_index":1179,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["step",{"_index":348,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["stop",{"_index":93,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["stop_circle",{"_index":560,"title":{},"body":{"components/BroadcastingActivityComponent.html":{}}}],["stop_screen_share",{"_index":1251,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["stoppage",{"_index":1693,"title":{},"body":{"license.html":{}}}],["stopped",{"_index":579,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{},"miscellaneous/enumerations.html":{}}}],["stopping",{"_index":578,"title":{},"body":{"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{},"miscellaneous/enumerations.html":{}}}],["storage",{"_index":1300,"title":{},"body":{"injectables/TranslateService.html":{}}}],["storage_prefix",{"_index":1762,"title":{},"body":{"miscellaneous/variables.html":{}}}],["storageservice",{"_index":1295,"title":{},"body":{"injectables/TranslateService.html":{}}}],["strdata",{"_index":628,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["stream",{"_index":697,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["stream'},{'name",{"_index":147,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["stream.component.html",{"_index":1117,"title":{},"body":{"components/StreamComponent.html":{}}}],["stream.component.scss",{"_index":1116,"title":{},"body":{"components/StreamComponent.html":{}}}],["stream.replace_screen",{"_index":1250,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["stream[displayaudiodetection",{"_index":1143,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{}}}],["stream[displayaudiodetection]'},{'name",{"_index":198,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["stream[displayparticipantname",{"_index":1148,"title":{},"body":{"directives/StreamDisplayParticipantNameDirective.html":{}}}],["stream[displayparticipantname]'},{'name",{"_index":201,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["stream[videocontrols",{"_index":1153,"title":{},"body":{"directives/StreamVideoControlsDirective.html":{}}}],["stream[videocontrols]'},{'name",{"_index":204,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["streamcomponent",{"_index":146,"title":{"components/StreamComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["streamdirective",{"_index":194,"title":{"directives/StreamDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["streamdisplayaudiodetection",{"_index":1145,"title":{},"body":{"directives/StreamDisplayAudioDetectionDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["streamdisplayaudiodetectiondirective",{"_index":196,"title":{"directives/StreamDisplayAudioDetectionDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["streamdisplayparticipantname",{"_index":1150,"title":{},"body":{"directives/StreamDisplayParticipantNameDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["streamdisplayparticipantnamedirective",{"_index":199,"title":{"directives/StreamDisplayParticipantNameDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["streams",{"_index":686,"title":{},"body":{"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{}}}],["streamvideocontrols",{"_index":1155,"title":{},"body":{"directives/StreamVideoControlsDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["streamvideocontrolsdirective",{"_index":202,"title":{"directives/StreamVideoControlsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["string",{"_index":309,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"interfaces/BroadcastingEvent.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/LangOption.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"directives/PanelDirective.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"interfaces/RecordingStatusInfo.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/variables.html":{}}}],["structural",{"_index":596,"title":{},"body":{"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["structure",{"_index":721,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["styles",{"_index":279,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"index.html":{}}}],["styles.scss",{"_index":1401,"title":{},"body":{"index.html":{}}}],["styleurls",{"_index":74,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["sub",{"_index":869,"title":{},"body":{"interfaces/PanelStatusInfo.html":{}}}],["subject",{"_index":1547,"title":{},"body":{"license.html":{}}}],["sublicense",{"_index":1561,"title":{},"body":{"license.html":{}}}],["submission",{"_index":1630,"title":{},"body":{"license.html":{}}}],["submit",{"_index":1522,"title":{},"body":{"license.html":{}}}],["submitted",{"_index":1520,"title":{},"body":{"license.html":{}}}],["suboptiontype",{"_index":849,"title":{},"body":{"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{}}}],["subscribe",{"_index":415,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/LayoutDirective.html":{}}}],["subscribes",{"_index":1057,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["subscribetopaneltoggling",{"_index":418,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["subscribetoparticipants",{"_index":756,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["subscription",{"_index":727,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["subsequently",{"_index":1545,"title":{},"body":{"license.html":{}}}],["substitute",{"_index":261,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["such",{"_index":803,"title":{},"body":{"components/PanelComponent.html":{},"license.html":{}}}],["supersede",{"_index":1638,"title":{},"body":{"license.html":{}}}],["support",{"_index":1422,"title":{},"body":{"index.html":{},"license.html":{},"modules.html":{}}}],["svg",{"_index":1748,"title":{},"body":{"modules.html":{}}}],["switch",{"_index":856,"title":{},"body":{"injectables/PanelService.html":{}}}],["switchcamera",{"_index":999,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["switchcamera(deviceid",{"_index":1015,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["switches",{"_index":1016,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["switchmicrophone",{"_index":1000,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["switchmicrophone(deviceid",{"_index":1021,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["switchscreenshare",{"_index":1001,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["syntax",{"_index":1733,"title":{},"body":{"license.html":{}}}],["systems",{"_index":1532,"title":{},"body":{"license.html":{}}}],["tagged",{"_index":823,"title":{},"body":{"directives/PanelDirective.html":{}}}],["tailor",{"_index":826,"title":{},"body":{"directives/PanelDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["take",{"_index":718,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["template",{"_index":262,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["template's",{"_index":720,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["templateref",{"_index":359,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["templates",{"_index":1290,"title":{},"body":{"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{}}}],["templateurl",{"_index":77,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["terminate",{"_index":1589,"title":{},"body":{"license.html":{}}}],["terms",{"_index":1433,"title":{},"body":{"license.html":{}}}],["tertiary",{"_index":1406,"title":{},"body":{"index.html":{}}}],["text",{"_index":286,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/PanelDirective.html":{},"index.html":{},"license.html":{}}}],["textdecoder().decode(payload",{"_index":621,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["textencoder().encode(strdata",{"_index":630,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["theory",{"_index":1675,"title":{},"body":{"license.html":{}}}],["there's",{"_index":1380,"title":{},"body":{"index.html":{}}}],["thereof",{"_index":1516,"title":{},"body":{"license.html":{}}}],["third",{"_index":1617,"title":{},"body":{"license.html":{}}}],["this.application_server_url",{"_index":315,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.configureurls",{"_index":311,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.connected",{"_index":974,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["this.gettoken(this.roomname",{"_index":329,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.httpclient.post(this.application_server_url",{"_index":336,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.livekit_url",{"_index":321,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.localparticipant",{"_index":760,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.localparticipantsubs",{"_index":757,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.localparticipantsubs.unsubscribe",{"_index":754,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.messages.push(message",{"_index":624,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["this.openviduservice.disconnectroom",{"_index":973,"title":{},"body":{"directives/ParticipantPanelItemElementsDirective.html":{}}}],["this.panelservice.panelstatusobs.subscribe((ev",{"_index":419,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["this.panelservice.togglepanel(type",{"_index":426,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["this.participantservice.ismycameraenabled",{"_index":1188,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.participantservice.ismymicrophoneenabled",{"_index":1191,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.participantservice.localparticipant$.subscribe((p",{"_index":758,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.participantservice.publishdata(data",{"_index":632,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["this.participantservice.remoteparticipants$.subscribe",{"_index":762,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.participantservice.setcameraenabled(!iscameraenabled",{"_index":1189,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.participantservice.setmicrophoneenabled(!ismicrophoneenabled",{"_index":1192,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["this.remoteparticipants",{"_index":763,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.remoteparticipantssubs",{"_index":761,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.remoteparticipantssubs.unsubscribe",{"_index":755,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.showexternalpanel",{"_index":420,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["this.showexternalpanel2",{"_index":423,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["this.subscribetopaneltoggling",{"_index":411,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["this.subscribetoparticipants",{"_index":748,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["this.token",{"_index":331,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["those",{"_index":1175,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"license.html":{}}}],["through",{"_index":1442,"title":{},"body":{"license.html":{}}}],["throw",{"_index":341,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["time",{"_index":1378,"title":{},"body":{"index.html":{}}}],["title",{"_index":460,"title":{},"body":{"components/AdminDashboardComponent.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginTitleDirective.html":{},"license.html":{}}}],["toggle",{"_index":424,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["toggleaudio",{"_index":1190,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["togglemypanel(type",{"_index":425,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["togglepanel",{"_index":840,"title":{},"body":{"injectables/PanelService.html":{}}}],["togglepanel(paneltype",{"_index":847,"title":{},"body":{"injectables/PanelService.html":{}}}],["toggles",{"_index":1185,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["togglevideo",{"_index":1187,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["toggling",{"_index":416,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["token",{"_index":308,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["tokendirective",{"_index":205,"title":{"directives/TokenDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/TokenDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["tokenerror",{"_index":1159,"title":{},"body":{"directives/TokenErrorDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["tokenerrordirective",{"_index":207,"title":{"directives/TokenErrorDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/TokenErrorDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbar",{"_index":1166,"title":{},"body":{"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"miscellaneous/enumerations.html":{}}}],["toolbar'},{'name",{"_index":149,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar.background",{"_index":1259,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.component.html",{"_index":1225,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.component.scss",{"_index":1224,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.disable_captions",{"_index":1261,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.disable_screen",{"_index":1252,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.enable_captions",{"_index":1262,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.exit_fullscreen",{"_index":1255,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.fullscreen",{"_index":1253,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.settings",{"_index":1263,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["toolbar.start_recording",{"_index":1076,"title":{},"body":{"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["toolbar.stop_recording",{"_index":1075,"title":{},"body":{"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{}}}],["toolbar[activitiespanelbutton",{"_index":1167,"title":{},"body":{"directives/ToolbarActivitiesPanelButtonDirective.html":{}}}],["toolbar[activitiespanelbutton]'},{'name",{"_index":211,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[backgroundeffectsbutton",{"_index":1214,"title":{},"body":{"directives/ToolbarBackgroundEffectsButtonDirective.html":{}}}],["toolbar[backgroundeffectsbutton]'},{'name",{"_index":220,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[broadcastingbutton",{"_index":1217,"title":{},"body":{"directives/ToolbarBroadcastingButtonDirective.html":{}}}],["toolbar[broadcastingbutton]'},{'name",{"_index":223,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[chatpanelbutton",{"_index":1219,"title":{},"body":{"directives/ToolbarChatPanelButtonDirective.html":{}}}],["toolbar[chatpanelbutton]'},{'name",{"_index":226,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[displaylogo",{"_index":1272,"title":{},"body":{"directives/ToolbarDisplayLogoDirective.html":{}}}],["toolbar[displaylogo]'},{'name",{"_index":231,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[displayroomname",{"_index":1273,"title":{},"body":{"directives/ToolbarDisplayRoomNameDirective.html":{}}}],["toolbar[displayroomname]'},{'name",{"_index":234,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[fullscreenbutton",{"_index":1274,"title":{},"body":{"directives/ToolbarFullscreenButtonDirective.html":{}}}],["toolbar[fullscreenbutton]'},{'name",{"_index":237,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[leavebutton",{"_index":1275,"title":{},"body":{"directives/ToolbarLeaveButtonDirective.html":{}}}],["toolbar[leavebutton]'},{'name",{"_index":240,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[participantspanelbutton",{"_index":1276,"title":{},"body":{"directives/ToolbarParticipantsPanelButtonDirective.html":{}}}],["toolbar[participantspanelbutton]'},{'name",{"_index":243,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[recordingbutton",{"_index":1277,"title":{},"body":{"directives/ToolbarRecordingButtonDirective.html":{}}}],["toolbar[recordingbutton]'},{'name",{"_index":246,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[screensharebutton",{"_index":1279,"title":{},"body":{"directives/ToolbarScreenshareButtonDirective.html":{}}}],["toolbar[screensharebutton]'},{'name",{"_index":249,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbar[settingsbutton",{"_index":1280,"title":{},"body":{"directives/ToolbarSettingsButtonDirective.html":{}}}],["toolbar[settingsbutton]'},{'name",{"_index":252,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbaractivitiespanelbutton",{"_index":1348,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbaractivitiespanelbuttondirective",{"_index":209,"title":{"directives/ToolbarActivitiesPanelButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbaradditionalbuttonsdirective",{"_index":212,"title":{"directives/ToolbarAdditionalButtonsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbaradditionalbuttonsposition",{"_index":1200,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"miscellaneous/enumerations.html":{}}}],["toolbaradditionalbuttonspossitiondirective",{"_index":214,"title":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbaradditionalpanelbuttonsdirective",{"_index":216,"title":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarbackgroundeffectsbutton",{"_index":1343,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarbackgroundeffectsbuttondirective",{"_index":218,"title":{"directives/ToolbarBackgroundEffectsButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarbroadcastingbutton",{"_index":1341,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarbroadcastingbuttondirective",{"_index":221,"title":{"directives/ToolbarBroadcastingButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarchatpanelbutton",{"_index":1347,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarchatpanelbuttondirective",{"_index":224,"title":{"directives/ToolbarChatPanelButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarcomponent",{"_index":148,"title":{"components/ToolbarComponent.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["toolbardirective",{"_index":227,"title":{"directives/ToolbarDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbardisplaylogo",{"_index":1350,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbardisplaylogodirective",{"_index":229,"title":{"directives/ToolbarDisplayLogoDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbardisplayroomname",{"_index":1349,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbardisplayroomnamedirective",{"_index":232,"title":{"directives/ToolbarDisplayRoomNameDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarfullscreenbutton",{"_index":1342,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarfullscreenbuttondirective",{"_index":235,"title":{"directives/ToolbarFullscreenButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarleavebutton",{"_index":1345,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarleavebuttondirective",{"_index":238,"title":{"directives/ToolbarLeaveButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarparticipantspanelbutton",{"_index":1346,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarparticipantspanelbuttondirective",{"_index":241,"title":{"directives/ToolbarParticipantsPanelButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarrecordingbutton",{"_index":1340,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarrecordingbuttondirective",{"_index":244,"title":{"directives/ToolbarRecordingButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarscreensharebutton",{"_index":1339,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarscreensharebuttondirective",{"_index":247,"title":{"directives/ToolbarScreenshareButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["toolbarsettingsbutton",{"_index":1344,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["toolbarsettingsbuttondirective",{"_index":250,"title":{"directives/ToolbarSettingsButtonDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["topic",{"_index":618,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["tort",{"_index":1676,"title":{},"body":{"license.html":{}}}],["track",{"_index":610,"title":{},"body":{"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{}}}],["track.participant",{"_index":1131,"title":{},"body":{"directives/StreamDirective.html":{}}}],["track.participant.name",{"_index":1135,"title":{},"body":{"directives/StreamDirective.html":{}}}],["tracking",{"_index":1534,"title":{},"body":{"license.html":{}}}],["trackpublication",{"_index":1031,"title":{},"body":{"interfaces/ParticipantTrackPublication.html":{}}}],["trackpublishoptions",{"_index":898,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["tracks",{"_index":705,"title":{},"body":{"directives/LayoutDirective.html":{},"classes/ParticipantModel.html":{},"pipes/RemoteParticipantTracksPipe.html":{}}}],["trackspublishedtypes",{"_index":945,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{}}}],["trade",{"_index":1645,"title":{},"body":{"license.html":{}}}],["trademark",{"_index":1606,"title":{},"body":{"license.html":{}}}],["trademarks",{"_index":1643,"title":{},"body":{"license.html":{}}}],["transfer",{"_index":1569,"title":{},"body":{"license.html":{}}}],["transform",{"_index":1113,"title":{},"body":{"pipes/RemoteParticipantTracksPipe.html":{}}}],["transform(participants",{"_index":1114,"title":{},"body":{"pipes/RemoteParticipantTracksPipe.html":{}}}],["transformation",{"_index":1490,"title":{},"body":{"license.html":{}}}],["translate",{"_index":462,"title":{},"body":{"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{}}}],["translate(key",{"_index":1303,"title":{},"body":{"injectables/TranslateService.html":{}}}],["translated",{"_index":1313,"title":{},"body":{"injectables/TranslateService.html":{}}}],["translatepipe",{"_index":1289,"title":{},"body":{"injectables/TranslateService.html":{}}}],["translates",{"_index":1304,"title":{},"body":{"injectables/TranslateService.html":{}}}],["translateservice",{"_index":1281,"title":{"injectables/TranslateService.html":{}},"body":{"injectables/TranslateService.html":{}}}],["translation",{"_index":1309,"title":{},"body":{"injectables/TranslateService.html":{},"license.html":{}}}],["translations",{"_index":1286,"title":{},"body":{"injectables/TranslateService.html":{}}}],["true",{"_index":17,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AudioEnabledDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/PrejoinDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["try",{"_index":334,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["tutorial",{"_index":349,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["type",{"_index":53,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"components/BroadcastingActivityComponent.html":{},"interfaces/BroadcastingEvent.html":{},"injectables/BroadcastingService.html":{},"interfaces/BroadcastingStartRequestedEvent.html":{},"interfaces/BroadcastingStatusInfo.html":{},"interfaces/BroadcastingStopRequestedEvent.html":{},"directives/ChatPanelDirective.html":{},"interfaces/LangOption.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"injectables/OpenViduService.html":{},"components/PanelComponent.html":{},"injectables/PanelService.html":{},"interfaces/PanelStatusEvent.html":{},"interfaces/PanelStatusInfo.html":{},"classes/ParticipantModel.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"interfaces/ParticipantProperties.html":{},"injectables/ParticipantService.html":{},"interfaces/ParticipantTrackPublication.html":{},"directives/ParticipantsPanelDirective.html":{},"components/RecordingActivityComponent.html":{},"interfaces/RecordingEvent.html":{},"interfaces/RecordingInfo.html":{},"injectables/RecordingService.html":{},"interfaces/RecordingStatusInfo.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"injectables/TranslateService.html":{},"components/VideoconferenceComponent.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["typealiases",{"_index":1758,"title":{"miscellaneous/typealiases.html":{}},"body":{}}],["types",{"_index":1363,"title":{},"body":{"miscellaneous/enumerations.html":{},"license.html":{}}}],["ui",{"_index":635,"title":{},"body":{"directives/LangDirective.html":{},"directives/MinimalDirective.html":{}}}],["uint8array",{"_index":616,"title":{},"body":{"directives/ChatPanelDirective.html":{},"injectables/ParticipantService.html":{}}}],["undefined",{"_index":587,"title":{},"body":{"interfaces/BroadcastingStatusInfo.html":{},"components/LayoutComponent.html":{},"classes/ParticipantModel.html":{},"injectables/ParticipantService.html":{},"directives/TokenErrorDirective.html":{}}}],["under",{"_index":1456,"title":{},"body":{"license.html":{}}}],["union",{"_index":1452,"title":{},"body":{"license.html":{}}}],["unique",{"_index":902,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["unknown",{"_index":623,"title":{},"body":{"directives/ChatPanelDirective.html":{}}}],["unless",{"_index":1632,"title":{},"body":{"license.html":{}}}],["unshare",{"_index":1014,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["unsubscribe",{"_index":750,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["unsubscribes",{"_index":1058,"title":{},"body":{"directives/ParticipantsPanelDirective.html":{}}}],["update",{"_index":44,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"injectables/BroadcastingService.html":{},"injectables/PanelService.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["update(value",{"_index":58,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["updated",{"_index":450,"title":{},"body":{"components/AdminDashboardComponent.html":{},"injectables/BroadcastingService.html":{},"injectables/RecordingService.html":{}}}],["updatelocalparticipant",{"_index":1002,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["updateremoteparticipants",{"_index":1003,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["updates",{"_index":747,"title":{},"body":{"directives/LayoutDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["uppercase",{"_index":558,"title":{},"body":{"components/BroadcastingActivityComponent.html":{},"components/RecordingActivityComponent.html":{}}}],["url",{"_index":772,"title":{},"body":{"directives/LivekitUrlDirective.html":{}}}],["urls",{"_index":302,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["usage",{"_index":1420,"title":{},"body":{"index.html":{}}}],["use",{"_index":314,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/LivekitUrlDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/TokenDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"index.html":{},"license.html":{}}}],["used",{"_index":18,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"directives/ToolbarDirective.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"injectables/TranslateService.html":{}}}],["useful",{"_index":923,"title":{},"body":{"directives/ParticipantNameDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["user",{"_index":106,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"injectables/PanelService.html":{},"classes/ParticipantModel.html":{},"components/ParticipantPanelItemComponent.html":{},"interfaces/ParticipantProperties.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["using",{"_index":377,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"components/AdminDashboardComponent.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{},"license.html":{}}}],["utilize",{"_index":1177,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{}}}],["value",{"_index":59,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"components/AdminLoginComponent.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"directives/ChatPanelDirective.html":{},"components/LayoutComponent.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"injectables/TranslateService.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/variables.html":{}}}],["values",{"_index":1199,"title":{},"body":{"directives/ToolbarAdditionalButtonsPossitionDirective.html":{}}}],["var",{"_index":124,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["variable",{"_index":403,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{}}}],["variables",{"_index":297,"title":{"miscellaneous/variables.html":{}},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{},"miscellaneous/variables.html":{}}}],["verbal",{"_index":1525,"title":{},"body":{"license.html":{}}}],["version",{"_index":1428,"title":{},"body":{"license.html":{},"properties.html":{}}}],["videconference",{"_index":1334,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["video",{"_index":916,"title":{},"body":{"classes/ParticipantModel.html":{},"components/StreamComponent.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{},"index.html":{}}}],["video_camera_front",{"_index":1068,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["video_file",{"_index":1083,"title":{},"body":{"components/RecordingActivityComponent.html":{}}}],["videocam",{"_index":1180,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"components/ToolbarComponent.html":{}}}],["videocam_off",{"_index":1246,"title":{},"body":{"components/ToolbarComponent.html":{}}}],["videoconference",{"_index":118,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"pipes/RemoteParticipantTracksPipe.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference.component.html",{"_index":1324,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["videoconference.component.scss",{"_index":1323,"title":{},"body":{"components/VideoconferenceComponent.html":{}}}],["videoconference[activitiespanelbroadcastingactivity",{"_index":34,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[activitiespanelrecordingactivity",{"_index":153,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[audioenabled",{"_index":548,"title":{},"body":{"directives/AudioEnabledDirective.html":{}}}],["videoconference[audioenabled]'},{'name",{"_index":166,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[lang",{"_index":656,"title":{},"body":{"directives/LangDirective.html":{}}}],["videoconference[lang]'},{'name",{"_index":170,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[langoptions",{"_index":681,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["videoconference[langoptions]'},{'name",{"_index":172,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[livekiturl",{"_index":774,"title":{},"body":{"directives/LivekitUrlDirective.html":{}}}],["videoconference[livekiturl]'},{'name",{"_index":176,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[minimal",{"_index":782,"title":{},"body":{"directives/MinimalDirective.html":{}}}],["videoconference[minimal]'},{'name",{"_index":178,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[participantname",{"_index":929,"title":{},"body":{"directives/ParticipantNameDirective.html":{}}}],["videoconference[participantname]'},{'name",{"_index":182,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[participantpanelitemmutebutton",{"_index":188,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[prejoin",{"_index":1065,"title":{},"body":{"directives/PrejoinDirective.html":{}}}],["videoconference[prejoin]'},{'name",{"_index":193,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[streamdisplayaudiodetection",{"_index":197,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[streamdisplayparticipantname",{"_index":200,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[streamvideocontrols",{"_index":203,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamVideoControlsDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[token",{"_index":1158,"title":{},"body":{"directives/TokenDirective.html":{}}}],["videoconference[token]'},{'name",{"_index":206,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[tokenerror",{"_index":1163,"title":{},"body":{"directives/TokenErrorDirective.html":{}}}],["videoconference[tokenerror]'},{'name",{"_index":208,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbaractivitiespanelbutton",{"_index":210,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarbackgroundeffectsbutton",{"_index":219,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarbroadcastingbutton",{"_index":222,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarchatpanelbutton",{"_index":225,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbardisplaylogo",{"_index":230,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbardisplayroomname",{"_index":233,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarfullscreenbutton",{"_index":236,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarleavebutton",{"_index":239,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarparticipantspanelbutton",{"_index":242,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarrecordingbutton",{"_index":245,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarscreensharebutton",{"_index":248,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[toolbarsettingsbutton",{"_index":251,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconference[videoenabled",{"_index":254,"title":{},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconferencecomponent",{"_index":21,"title":{"components/VideoconferenceComponent.html":{}},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"components/ActivitiesPanelComponent.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"directives/AudioEnabledDirective.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"directives/LangDirective.html":{},"directives/LangOptionsDirective.html":{},"components/LayoutComponent.html":{},"directives/LivekitUrlDirective.html":{},"directives/MinimalDirective.html":{},"components/PanelComponent.html":{},"directives/ParticipantNameDirective.html":{},"components/ParticipantPanelItemComponent.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"components/ParticipantsPanelComponent.html":{},"directives/PrejoinDirective.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"directives/TokenDirective.html":{},"directives/TokenErrorDirective.html":{},"directives/ToolbarActivitiesPanelButtonDirective.html":{},"directives/ToolbarBackgroundEffectsButtonDirective.html":{},"directives/ToolbarBroadcastingButtonDirective.html":{},"directives/ToolbarChatPanelButtonDirective.html":{},"components/ToolbarComponent.html":{},"directives/ToolbarDisplayLogoDirective.html":{},"directives/ToolbarDisplayRoomNameDirective.html":{},"directives/ToolbarFullscreenButtonDirective.html":{},"directives/ToolbarLeaveButtonDirective.html":{},"directives/ToolbarParticipantsPanelButtonDirective.html":{},"directives/ToolbarRecordingButtonDirective.html":{},"directives/ToolbarScreenshareButtonDirective.html":{},"directives/ToolbarSettingsButtonDirective.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoconferencing",{"_index":1379,"title":{},"body":{"index.html":{}}}],["videocontrols",{"_index":1121,"title":{},"body":{"components/StreamComponent.html":{},"directives/StreamVideoControlsDirective.html":{}}}],["videocontrolsvalue",{"_index":1154,"title":{},"body":{"directives/StreamVideoControlsDirective.html":{}}}],["videoenabled",{"_index":1315,"title":{},"body":{"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{}}}],["videoenableddirective",{"_index":253,"title":{"directives/VideoEnabledDirective.html":{}},"body":{"components/ActivitiesPanelComponent.html":{},"components/AdminDashboardComponent.html":{},"components/AdminLoginComponent.html":{},"modules/ApiDirectiveModule.html":{},"components/BroadcastingActivityComponent.html":{},"components/ChatPanelComponent.html":{},"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/RecordingActivityComponent.html":{},"components/StreamComponent.html":{},"components/ToolbarComponent.html":{},"directives/VideoEnabledDirective.html":{},"components/VideoconferenceComponent.html":{},"overview.html":{}}}],["videotracks",{"_index":882,"title":{},"body":{"classes/ParticipantModel.html":{}}}],["viewcontainer",{"_index":357,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{}}}],["viewcontainerref",{"_index":360,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{}}}],["visibility",{"_index":406,"title":{},"body":{"directives/AdditionalPanelsDirective.html":{}}}],["visit",{"_index":961,"title":{},"body":{"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"index.html":{}}}],["visual",{"_index":894,"title":{},"body":{"classes/ParticipantModel.html":{},"interfaces/ParticipantProperties.html":{}}}],["void",{"_index":57,"title":{},"body":{"directives/ActivitiesPanelBroadcastingActivityDirective.html":{},"directives/ActivitiesPanelRecordingActivityDirective.html":{},"directives/AdminDashboardRecordingsListDirective.html":{},"directives/AdminDashboardTitleDirective.html":{},"directives/AdminLoginErrorDirective.html":{},"directives/AdminLoginTitleDirective.html":{},"injectables/BroadcastingService.html":{},"injectables/PanelService.html":{},"directives/ParticipantPanelItemMuteButtonDirective.html":{},"injectables/ParticipantService.html":{},"injectables/RecordingService.html":{},"components/StreamComponent.html":{},"directives/StreamDisplayAudioDetectionDirective.html":{},"directives/StreamDisplayParticipantNameDirective.html":{},"directives/StreamVideoControlsDirective.html":{},"injectables/TranslateService.html":{}}}],["volume_off",{"_index":947,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"components/StreamComponent.html":{}}}],["volume_up",{"_index":946,"title":{},"body":{"components/ParticipantPanelItemComponent.html":{},"components/StreamComponent.html":{}}}],["want",{"_index":675,"title":{},"body":{"directives/LangOptionsDirective.html":{}}}],["warn",{"_index":1408,"title":{},"body":{"index.html":{}}}],["warranties",{"_index":1660,"title":{},"body":{"license.html":{}}}],["warranty",{"_index":1656,"title":{},"body":{"license.html":{}}}],["way",{"_index":695,"title":{},"body":{"components/LayoutComponent.html":{},"components/PanelComponent.html":{},"components/ParticipantPanelItemComponent.html":{},"components/ParticipantsPanelComponent.html":{},"components/ToolbarComponent.html":{},"index.html":{}}}],["we've",{"_index":1173,"title":{},"body":{"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["welcome",{"_index":1371,"title":{},"body":{"index.html":{}}}],["wherever",{"_index":1616,"title":{},"body":{"license.html":{}}}],["whether",{"_index":843,"title":{},"body":{"injectables/PanelService.html":{},"interfaces/PanelStatusInfo.html":{},"interfaces/ParticipantTrackPublication.html":{},"license.html":{}}}],["whole",{"_index":1509,"title":{},"body":{"license.html":{}}}],["window",{"_index":1026,"title":{},"body":{"injectables/ParticipantService.html":{}}}],["window.location.hostname",{"_index":316,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["within",{"_index":825,"title":{},"body":{"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"license.html":{}}}],["without",{"_index":1205,"title":{},"body":{"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"license.html":{}}}],["work",{"_index":1494,"title":{},"body":{"license.html":{}}}],["works",{"_index":1501,"title":{},"body":{"license.html":{}}}],["worldwide",{"_index":1551,"title":{},"body":{"license.html":{}}}],["wrap",{"_index":734,"title":{},"body":{"directives/LayoutDirective.html":{}}}],["writing",{"_index":1543,"title":{},"body":{"license.html":{}}}],["written",{"_index":1526,"title":{},"body":{"license.html":{}}}],["ws://localhost:7880",{"_index":322,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["wss",{"_index":323,"title":{},"body":{"directives/ActivitiesPanelDirective.html":{},"directives/AdditionalPanelsDirective.html":{},"directives/ChatPanelDirective.html":{},"directives/LayoutDirective.html":{},"directives/PanelDirective.html":{},"directives/ParticipantPanelItemDirective.html":{},"directives/ParticipantPanelItemElementsDirective.html":{},"directives/ParticipantsPanelDirective.html":{},"directives/StreamDirective.html":{},"directives/ToolbarAdditionalButtonsDirective.html":{},"directives/ToolbarAdditionalPanelButtonsDirective.html":{},"directives/ToolbarDirective.html":{}}}],["yes",{"_index":858,"title":{},"body":{"injectables/PanelService.html":{},"classes/ParticipantModel.html":{}}}],["yyyy",{"_index":1740,"title":{},"body":{"license.html":{}}}],["zoom",{"_index":539,"title":{},"body":{"modules/ApiDirectiveModule.html":{},"modules/OpenViduComponentsDirectiveModule.html":{},"overview.html":{}}}]],"pipeline":["stemmer"]}, - "store": {"directives/ActivitiesPanelBroadcastingActivityDirective.html":{"url":"directives/ActivitiesPanelBroadcastingActivityDirective.html","title":"directive - ActivitiesPanelBroadcastingActivityDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ActivitiesPanelBroadcastingActivityDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/activities-panel.directive.ts\n \n\n\n \n Description\n \n \n The broadcastingActivity directive allows show/hide the broadcasting activity in ActivitiesPanelComponent.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the activitiesPanel component:\nExample :And it also can be used in the ActivitiesPanelComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n broadcastingActivityValue\n \n \n Public\n elementRef\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n activitiesPanelBroadcastingActivity\n \n \n broadcastingActivity\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n activitiesPanelBroadcastingActivity\n \n \n broadcastingActivity\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n activitiesPanelBroadcastingActivity\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n broadcastingActivity\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n broadcastingActivityValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n \n \n Default value : true\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n activitiesPanelBroadcastingActivity\n \n \n\n\n \n \n setactivitiesPanelBroadcastingActivity(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n broadcastingActivity\n \n \n\n\n \n \n setbroadcastingActivity(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/ActivitiesPanelComponent.html":{"url":"components/ActivitiesPanelComponent.html","title":"component - ActivitiesPanelComponent","body":"\n \n\n\n\n\n\n Components\n \n ActivitiesPanelComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/activities-panel/activities-panel.component.ts\n\n\n\n \n Description\n \n \n The ActivitiesPanelComponent is the component that allows showing the activities panel.\nThis panel shows the recording and broadcasting activities.\n\n \n\n\n \n Implements\n \n \n OnInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-activities-panel\n \n\n\n\n \n styleUrls\n ../panel.component.scss,./activities-panel.component.scss\n \n\n\n\n \n templateUrl\n ./activities-panel.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onBroadcastingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when start broadcasting button is clicked.\nIt provides the BroadcastingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onBroadcastingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop broadcasting button is clicked.\nIt provides the BroadcastingStopRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingDeleteRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when delete recording button has been clicked.\nIt provides the RecordingDeleteRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingDownloadClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when download recording button has been clicked.\nIt provides the RecordingDownloadClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingPlayClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when play recording button has been clicked.\nIt provides the RecordingPlayClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the user clicks on the start recording button.\nIt provides the RecordingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop recording button has been clicked.\nIt provides the RecordingStopRequestedEvent payload as event data.\n\n \n \n \n \n\n\n\n\n\n\n\n \n API Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nrecordingActivity\nboolean\nActivitiesPanelRecordingActivityDirective\n\n\nbroadcastingActivity\nboolean\nActivitiesPanelBroadcastingActivityDirective\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\tActivities\t\t\t\t\tclose\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'ActivitiesPanelComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ActivitiesPanelDirective.html":{"url":"directives/ActivitiesPanelDirective.html","title":"directive - ActivitiesPanelDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ActivitiesPanelDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovActivitiesPanel directive empowers you to effortlessly substitute the default activities panel template with a custom one.\nIn the example below, we showcase how to replace the activities template with a custom one.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n ACTIVITIES\n CUSTOM ACTIVITIES\n \n \n `,\n styles: `\n #my-panel {\n background: #aafffc;\n height: 100%;\n overflow: hidden;\n text-align: center;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n roomName = 'custom-activities-panel';\n token!: string;\n\n constructor(private httpClient: HttpClient) {\n this.configureUrls();\n }\n\n configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n getToken(roomName: string, participantName: string): Promise {\n try {\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n if (error.status === 404) {\n throw {\n status: error.status,\n message: 'Cannot connect with backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor a step-by-step tutorial on how to replace the activities template with just a few lines of code,\ncheck out our comprehensive guide: Customizing the Activities Panel.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovActivitiesPanel]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n template\n \n \n Public\n viewContainer\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, viewContainer: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n viewContainer\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n viewContainer\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ActivitiesPanelRecordingActivityDirective.html":{"url":"directives/ActivitiesPanelRecordingActivityDirective.html","title":"directive - ActivitiesPanelRecordingActivityDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ActivitiesPanelRecordingActivityDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/activities-panel.directive.ts\n \n\n\n \n Description\n \n \n The recordingActivity directive allows show/hide the recording activity in ActivitiesPanelComponent.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the activitiesPanel component:\nExample :And it also can be used in the ActivitiesPanelComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n recordingActivityValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n activitiesPanelRecordingActivity\n \n \n recordingActivity\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n activitiesPanelRecordingActivity\n \n \n recordingActivity\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n activitiesPanelRecordingActivity\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n recordingActivity\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n recordingActivityValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n \n \n Default value : true\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n activitiesPanelRecordingActivity\n \n \n\n\n \n \n setactivitiesPanelRecordingActivity(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n recordingActivity\n \n \n\n\n \n \n setrecordingActivity(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/ActivitiesPanelStatusEvent.html":{"url":"interfaces/ActivitiesPanelStatusEvent.html","title":"interface - ActivitiesPanelStatusEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n ActivitiesPanelStatusEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n\n \n Extends\n \n \n PanelStatusEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AdditionalPanelsDirective.html":{"url":"directives/AdditionalPanelsDirective.html","title":"directive - AdditionalPanelsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AdditionalPanelsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovAdditionalPanels directive enables you to effortlessly integrate additional panels with the PanelComponent.\nIn the example below, we showcase how to add a custom panel to the PanelComponent using the ovAdditionalPanels directive.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n PanelStatusInfo,\n PanelService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\n\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n \n 360\n \n \n star\n \n \n\n \n \n @if (showExternalPanel) {\n \n NEW PANEL 1\n This is my new additional panel\n \n } @if (showExternalPanel2) {\n \n NEW PANEL 2\n This is another new panel\n \n }\n \n \n `,\n styles: `\n #my-panels {\n height: 100%;\n overflow: hidden;\n }\n #my-panel1,\n #my-panel2 {\n text-align: center;\n height: calc(100% - 40px);\n margin: 20px;\n }\n #my-panel1 {\n background: #c9ffb2;\n }\n #my-panel2 {\n background: #ddf2ff;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'additional-panels';\n token!: string;\n\n // Flags to control the visibility of external panels\n showExternalPanel: boolean = false;\n showExternalPanel2: boolean = false;\n\n constructor(\n private httpClient: HttpClient,\n private panelService: PanelService\n ) {\n this.configureUrls();\n }\n\n ngOnInit() {\n this.subscribeToPanelToggling();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: any) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Subscribe to panel toggling events\n subscribeToPanelToggling() {\n this.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => {\n this.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';\n this.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';\n });\n }\n\n // Toggle the visibility of external panels\n toggleMyPanel(type: string) {\n this.panelService.togglePanel(type);\n }\n\n // Function to get a token from the server\n async getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor detailed instructions, refer to the tutorial available here.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovAdditionalPanels]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/AdminDashboardComponent.html":{"url":"components/AdminDashboardComponent.html","title":"component - AdminDashboardComponent","body":"\n \n\n\n\n\n\n Components\n \n AdminDashboardComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/admin/admin-dashboard/admin-dashboard.component.ts\n\n\n\n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n \n\n\n\n Metadata\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-admin-dashboard\n \n\n\n\n \n styleUrls\n ./admin-dashboard.component.scss\n \n\n\n\n \n templateUrl\n ./admin-dashboard.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onLoadMoreRecordingsRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when load more button has been clicked.\nThe recordings should be updated using the REST API with the continuation token.\n\n \n \n \n \n \n \n \n \n \n onLogoutRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when logout button has been clicked.\n\n \n \n \n \n \n \n \n \n \n onRecordingDeleteRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when delete recording button has been clicked.\nThe recording should be deleted using the REST API.\n\n \n \n \n \n \n \n \n \n \n onRefreshRecordingsRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when refresh recordings button has been clicked.\nThe recordings should be updated using the REST API.\n\n \n \n \n \n\n\n\n\n\n\n\n \n API Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nrecordingsList\nRecordingInfo\nAdminDashboardRecordingsListDirective\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t{{ title || (\\'ADMIN.DASHBOARD_TITLE\\' | translate) }}\t\t\t\t\t\t\tlogout\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclose\t\t\t\t\t\t\t\t\t\t\t\t\tsearch\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ sortByLegend }}\t\t\t\tarrow_drop_down\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DATE_START\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DATE_END\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DURATION\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.SIZE\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trefresh\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.EMPTY\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplay_arrow\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdownload\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdelete\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.NAME\\' | translate }}{{ recording.filename }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.ROOM\\' | translate }}{{ recording.roomName }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.OUTPUT\\' | translate }}{{ recording.outputMode }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DATE_START\\' | translate }}{{ recording.startedAt | date: \\'M/d/yy, H:mm:ss\\' }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DATE_END\\' | translate }}{{ recording.endedAt | date: \\'M/d/yy, H:mm:ss\\' }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.DURATION\\' | translate }}{{ recording.duration | duration }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.SIZE\\' | translate }}{{ recording.size / 1024 / 1024 | number: \\'1.1-2\\' }} MB\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.RECORDINGS.STATUS\\' | translate }}\t\t\t\t\t\t\t\t\t{{ recording.status }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkeyboard_double_arrow_down\t\t\t\t{{ \\'ADMIN.LOAD_MORE\\' | translate }}\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.POWERED_BY\\' | translate }}\t\tOpenVidu\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'AdminDashboardComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AdminDashboardRecordingsListDirective.html":{"url":"directives/AdminDashboardRecordingsListDirective.html","title":"directive - AdminDashboardRecordingsListDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AdminDashboardRecordingsListDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts\n \n\n\n \n Description\n \n \n The recordingsList directive allows show all recordings saved in your OpenVidu deployment in AdminDashboardComponent.\nDefault: []\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-admin-dashboard[recordingsList]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n recordingsValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n recordingsList\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n recordingsList\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n recordingsList\n \n \n \n \n Type : RecordingInfo[]\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: RecordingInfo[])\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n RecordingInfo[]\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n recordingsValue\n \n \n \n \n \n \n Type : RecordingInfo[]\n\n \n \n \n \n Default value : []\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n recordingsList\n \n \n\n\n \n \n setrecordingsList(value: RecordingInfo[])\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n RecordingInfo[]\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AdminDashboardTitleDirective.html":{"url":"directives/AdminDashboardTitleDirective.html","title":"directive - AdminDashboardTitleDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AdminDashboardTitleDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts\n \n\n\n \n Description\n \n \n The navbarTitle directive allows customize the title of the navbar in AdminLoginComponent.\nDefault: 'OpenVidu Call Dashboard'\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-admin-dashboard[navbarTitle]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n navbarTitleValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n navbarTitle\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n navbarTitle\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n navbarTitle\n \n \n \n \n Type : any\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: any)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n any\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n navbarTitleValue\n \n \n \n \n \n \n Type : any\n\n \n \n \n \n Default value : null\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n navbarTitle\n \n \n\n\n \n \n setnavbarTitle(value: any)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n any\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/AdminLoginComponent.html":{"url":"components/AdminLoginComponent.html","title":"component - AdminLoginComponent","body":"\n \n\n\n\n\n\n Components\n \n AdminLoginComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/admin/admin-login/admin-login.component.ts\n\n\n\n\n\n \n Implements\n \n \n OnInit\n \n\n\n\n Metadata\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-admin-login\n \n\n\n\n \n styleUrls\n ./admin-login.component.scss\n \n\n\n\n \n templateUrl\n ./admin-login.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onLoginRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when login button has been clicked.\nThe event will contain the credentials value.\n\n \n \n \n \n\n\n\n\n\n\n\n \n API Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nerror\nany\nAdminLoginErrorDirective\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = ' {{ title || (\\'ADMIN.DASHBOARD_TITLE\\' | translate) }} \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.USERNAME\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.USERNAME_REQUIRED\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.PASSWORD\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.PASSWORD_REQUIRED\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'ADMIN.LOGIN\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'AdminLoginComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AdminLoginErrorDirective.html":{"url":"directives/AdminLoginErrorDirective.html","title":"directive - AdminLoginErrorDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AdminLoginErrorDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts\n \n\n\n \n Description\n \n \n The error directive allows show the authentication error in AdminLoginComponent.\nDefault: null\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-admin-login[error]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n errorValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n error\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n error\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n error\n \n \n \n \n Type : any\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: any)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n any\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n errorValue\n \n \n \n \n \n \n Type : any\n\n \n \n \n \n Default value : null\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n error\n \n \n\n\n \n \n seterror(value: any)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n any\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AdminLoginTitleDirective.html":{"url":"directives/AdminLoginTitleDirective.html","title":"directive - AdminLoginTitleDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AdminLoginTitleDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/admin.directive.ts\n \n\n\n \n Description\n \n \n The navbarTitle directive allows customize the title of the navbar in AdminLoginComponent.\nDefault: 'OpenVidu Call Dashboard'\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-admin-login[navbarTitle]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n navbarTitleValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n navbarTitle\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n navbarTitle\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n navbarTitle\n \n \n \n \n Type : any\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: any)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n any\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n navbarTitleValue\n \n \n \n \n \n \n Type : any\n\n \n \n \n \n Default value : null\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n navbarTitle\n \n \n\n\n \n \n setnavbarTitle(value: any)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n any\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"modules/ApiDirectiveModule.html":{"url":"modules/ApiDirectiveModule.html","title":"module - ApiDirectiveModule","body":"\n \n\n\n\n\n Modules\n ApiDirectiveModule\n\n\n\n \n \n\n\n\n\n\ndependencies\n\nLegend\n\n  Declarations\n\n  Module\n\n  Bootstrap\n\n  Providers\n\n  Exports\n\ncluster_ApiDirectiveModule\n\n\n\ncluster_ApiDirectiveModule_declarations\n\n\n\ncluster_ApiDirectiveModule_exports\n\n\n\n\nActivitiesPanelBroadcastingActivityDirective\n\nActivitiesPanelBroadcastingActivityDirective\n\n\n\nApiDirectiveModule\n\nApiDirectiveModule\n\nApiDirectiveModule -->\n\nActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule\n\n\n\n\n\nActivitiesPanelRecordingActivityDirective\n\nActivitiesPanelRecordingActivityDirective\n\nApiDirectiveModule -->\n\nActivitiesPanelRecordingActivityDirective->ApiDirectiveModule\n\n\n\n\n\nAdminDashboardRecordingsListDirective\n\nAdminDashboardRecordingsListDirective\n\nApiDirectiveModule -->\n\nAdminDashboardRecordingsListDirective->ApiDirectiveModule\n\n\n\n\n\nAdminDashboardTitleDirective\n\nAdminDashboardTitleDirective\n\nApiDirectiveModule -->\n\nAdminDashboardTitleDirective->ApiDirectiveModule\n\n\n\n\n\nAdminLoginErrorDirective\n\nAdminLoginErrorDirective\n\nApiDirectiveModule -->\n\nAdminLoginErrorDirective->ApiDirectiveModule\n\n\n\n\n\nAdminLoginTitleDirective\n\nAdminLoginTitleDirective\n\nApiDirectiveModule -->\n\nAdminLoginTitleDirective->ApiDirectiveModule\n\n\n\n\n\nAudioEnabledDirective\n\nAudioEnabledDirective\n\nApiDirectiveModule -->\n\nAudioEnabledDirective->ApiDirectiveModule\n\n\n\n\n\nLangDirective\n\nLangDirective\n\nApiDirectiveModule -->\n\nLangDirective->ApiDirectiveModule\n\n\n\n\n\nLangOptionsDirective\n\nLangOptionsDirective\n\nApiDirectiveModule -->\n\nLangOptionsDirective->ApiDirectiveModule\n\n\n\n\n\nLivekitUrlDirective\n\nLivekitUrlDirective\n\nApiDirectiveModule -->\n\nLivekitUrlDirective->ApiDirectiveModule\n\n\n\n\n\nMinimalDirective\n\nMinimalDirective\n\nApiDirectiveModule -->\n\nMinimalDirective->ApiDirectiveModule\n\n\n\n\n\nParticipantNameDirective\n\nParticipantNameDirective\n\nApiDirectiveModule -->\n\nParticipantNameDirective->ApiDirectiveModule\n\n\n\n\n\nParticipantPanelItemMuteButtonDirective\n\nParticipantPanelItemMuteButtonDirective\n\nApiDirectiveModule -->\n\nParticipantPanelItemMuteButtonDirective->ApiDirectiveModule\n\n\n\n\n\nPrejoinDirective\n\nPrejoinDirective\n\nApiDirectiveModule -->\n\nPrejoinDirective->ApiDirectiveModule\n\n\n\n\n\nStreamDisplayAudioDetectionDirective\n\nStreamDisplayAudioDetectionDirective\n\nApiDirectiveModule -->\n\nStreamDisplayAudioDetectionDirective->ApiDirectiveModule\n\n\n\n\n\nStreamDisplayParticipantNameDirective\n\nStreamDisplayParticipantNameDirective\n\nApiDirectiveModule -->\n\nStreamDisplayParticipantNameDirective->ApiDirectiveModule\n\n\n\n\n\nStreamVideoControlsDirective\n\nStreamVideoControlsDirective\n\nApiDirectiveModule -->\n\nStreamVideoControlsDirective->ApiDirectiveModule\n\n\n\n\n\nTokenDirective\n\nTokenDirective\n\nApiDirectiveModule -->\n\nTokenDirective->ApiDirectiveModule\n\n\n\n\n\nTokenErrorDirective\n\nTokenErrorDirective\n\nApiDirectiveModule -->\n\nTokenErrorDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarActivitiesPanelButtonDirective\n\nToolbarActivitiesPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarActivitiesPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarAdditionalButtonsPossitionDirective\n\nToolbarAdditionalButtonsPossitionDirective\n\nApiDirectiveModule -->\n\nToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarBackgroundEffectsButtonDirective\n\nToolbarBackgroundEffectsButtonDirective\n\nApiDirectiveModule -->\n\nToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarBroadcastingButtonDirective\n\nToolbarBroadcastingButtonDirective\n\nApiDirectiveModule -->\n\nToolbarBroadcastingButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarChatPanelButtonDirective\n\nToolbarChatPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarChatPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarDisplayLogoDirective\n\nToolbarDisplayLogoDirective\n\nApiDirectiveModule -->\n\nToolbarDisplayLogoDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarDisplayRoomNameDirective\n\nToolbarDisplayRoomNameDirective\n\nApiDirectiveModule -->\n\nToolbarDisplayRoomNameDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarFullscreenButtonDirective\n\nToolbarFullscreenButtonDirective\n\nApiDirectiveModule -->\n\nToolbarFullscreenButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarLeaveButtonDirective\n\nToolbarLeaveButtonDirective\n\nApiDirectiveModule -->\n\nToolbarLeaveButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarParticipantsPanelButtonDirective\n\nToolbarParticipantsPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarParticipantsPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarRecordingButtonDirective\n\nToolbarRecordingButtonDirective\n\nApiDirectiveModule -->\n\nToolbarRecordingButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarScreenshareButtonDirective\n\nToolbarScreenshareButtonDirective\n\nApiDirectiveModule -->\n\nToolbarScreenshareButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarSettingsButtonDirective\n\nToolbarSettingsButtonDirective\n\nApiDirectiveModule -->\n\nToolbarSettingsButtonDirective->ApiDirectiveModule\n\n\n\n\n\nVideoEnabledDirective\n\nVideoEnabledDirective\n\nApiDirectiveModule -->\n\nVideoEnabledDirective->ApiDirectiveModule\n\n\n\n\n\nActivitiesPanelBroadcastingActivityDirective \n\nActivitiesPanelBroadcastingActivityDirective \n\nActivitiesPanelBroadcastingActivityDirective -->\n\nApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective \n\n\n\n\n\nActivitiesPanelRecordingActivityDirective \n\nActivitiesPanelRecordingActivityDirective \n\nActivitiesPanelRecordingActivityDirective -->\n\nApiDirectiveModule->ActivitiesPanelRecordingActivityDirective \n\n\n\n\n\nAdminDashboardRecordingsListDirective \n\nAdminDashboardRecordingsListDirective \n\nAdminDashboardRecordingsListDirective -->\n\nApiDirectiveModule->AdminDashboardRecordingsListDirective \n\n\n\n\n\nAdminDashboardTitleDirective \n\nAdminDashboardTitleDirective \n\nAdminDashboardTitleDirective -->\n\nApiDirectiveModule->AdminDashboardTitleDirective \n\n\n\n\n\nAdminLoginErrorDirective \n\nAdminLoginErrorDirective \n\nAdminLoginErrorDirective -->\n\nApiDirectiveModule->AdminLoginErrorDirective \n\n\n\n\n\nAdminLoginTitleDirective \n\nAdminLoginTitleDirective \n\nAdminLoginTitleDirective -->\n\nApiDirectiveModule->AdminLoginTitleDirective \n\n\n\n\n\nAudioEnabledDirective \n\nAudioEnabledDirective \n\nAudioEnabledDirective -->\n\nApiDirectiveModule->AudioEnabledDirective \n\n\n\n\n\nLangDirective \n\nLangDirective \n\nLangDirective -->\n\nApiDirectiveModule->LangDirective \n\n\n\n\n\nLangOptionsDirective \n\nLangOptionsDirective \n\nLangOptionsDirective -->\n\nApiDirectiveModule->LangOptionsDirective \n\n\n\n\n\nLivekitUrlDirective \n\nLivekitUrlDirective \n\nLivekitUrlDirective -->\n\nApiDirectiveModule->LivekitUrlDirective \n\n\n\n\n\nMinimalDirective \n\nMinimalDirective \n\nMinimalDirective -->\n\nApiDirectiveModule->MinimalDirective \n\n\n\n\n\nParticipantNameDirective \n\nParticipantNameDirective \n\nParticipantNameDirective -->\n\nApiDirectiveModule->ParticipantNameDirective \n\n\n\n\n\nParticipantPanelItemMuteButtonDirective \n\nParticipantPanelItemMuteButtonDirective \n\nParticipantPanelItemMuteButtonDirective -->\n\nApiDirectiveModule->ParticipantPanelItemMuteButtonDirective \n\n\n\n\n\nPrejoinDirective \n\nPrejoinDirective \n\nPrejoinDirective -->\n\nApiDirectiveModule->PrejoinDirective \n\n\n\n\n\nStreamDisplayAudioDetectionDirective \n\nStreamDisplayAudioDetectionDirective \n\nStreamDisplayAudioDetectionDirective -->\n\nApiDirectiveModule->StreamDisplayAudioDetectionDirective \n\n\n\n\n\nStreamDisplayParticipantNameDirective \n\nStreamDisplayParticipantNameDirective \n\nStreamDisplayParticipantNameDirective -->\n\nApiDirectiveModule->StreamDisplayParticipantNameDirective \n\n\n\n\n\nStreamVideoControlsDirective \n\nStreamVideoControlsDirective \n\nStreamVideoControlsDirective -->\n\nApiDirectiveModule->StreamVideoControlsDirective \n\n\n\n\n\nTokenDirective \n\nTokenDirective \n\nTokenDirective -->\n\nApiDirectiveModule->TokenDirective \n\n\n\n\n\nTokenErrorDirective \n\nTokenErrorDirective \n\nTokenErrorDirective -->\n\nApiDirectiveModule->TokenErrorDirective \n\n\n\n\n\nToolbarActivitiesPanelButtonDirective \n\nToolbarActivitiesPanelButtonDirective \n\nToolbarActivitiesPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarActivitiesPanelButtonDirective \n\n\n\n\n\nToolbarAdditionalButtonsPossitionDirective \n\nToolbarAdditionalButtonsPossitionDirective \n\nToolbarAdditionalButtonsPossitionDirective -->\n\nApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective \n\n\n\n\n\nToolbarBackgroundEffectsButtonDirective \n\nToolbarBackgroundEffectsButtonDirective \n\nToolbarBackgroundEffectsButtonDirective -->\n\nApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective \n\n\n\n\n\nToolbarBroadcastingButtonDirective \n\nToolbarBroadcastingButtonDirective \n\nToolbarBroadcastingButtonDirective -->\n\nApiDirectiveModule->ToolbarBroadcastingButtonDirective \n\n\n\n\n\nToolbarChatPanelButtonDirective \n\nToolbarChatPanelButtonDirective \n\nToolbarChatPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarChatPanelButtonDirective \n\n\n\n\n\nToolbarDisplayLogoDirective \n\nToolbarDisplayLogoDirective \n\nToolbarDisplayLogoDirective -->\n\nApiDirectiveModule->ToolbarDisplayLogoDirective \n\n\n\n\n\nToolbarDisplayRoomNameDirective \n\nToolbarDisplayRoomNameDirective \n\nToolbarDisplayRoomNameDirective -->\n\nApiDirectiveModule->ToolbarDisplayRoomNameDirective \n\n\n\n\n\nToolbarFullscreenButtonDirective \n\nToolbarFullscreenButtonDirective \n\nToolbarFullscreenButtonDirective -->\n\nApiDirectiveModule->ToolbarFullscreenButtonDirective \n\n\n\n\n\nToolbarLeaveButtonDirective \n\nToolbarLeaveButtonDirective \n\nToolbarLeaveButtonDirective -->\n\nApiDirectiveModule->ToolbarLeaveButtonDirective \n\n\n\n\n\nToolbarParticipantsPanelButtonDirective \n\nToolbarParticipantsPanelButtonDirective \n\nToolbarParticipantsPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarParticipantsPanelButtonDirective \n\n\n\n\n\nToolbarRecordingButtonDirective \n\nToolbarRecordingButtonDirective \n\nToolbarRecordingButtonDirective -->\n\nApiDirectiveModule->ToolbarRecordingButtonDirective \n\n\n\n\n\nToolbarScreenshareButtonDirective \n\nToolbarScreenshareButtonDirective \n\nToolbarScreenshareButtonDirective -->\n\nApiDirectiveModule->ToolbarScreenshareButtonDirective \n\n\n\n\n\nToolbarSettingsButtonDirective \n\nToolbarSettingsButtonDirective \n\nToolbarSettingsButtonDirective -->\n\nApiDirectiveModule->ToolbarSettingsButtonDirective \n\n\n\n\n\nVideoEnabledDirective \n\nVideoEnabledDirective \n\nVideoEnabledDirective -->\n\nApiDirectiveModule->VideoEnabledDirective \n\n\n\n\n\n\n \n \n \n Zoom in\n Reset\n Zoom out\n \n\n\n\n\n\n \n Info\n \n\n\n\n \n\n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/api.directive.module.ts\n \n\n\n\n\n\n \n \n \n Declarations\n \n \n ActivitiesPanelBroadcastingActivityDirective\n \n \n ActivitiesPanelRecordingActivityDirective\n \n \n AdminDashboardRecordingsListDirective\n \n \n AdminDashboardTitleDirective\n \n \n AdminLoginErrorDirective\n \n \n AdminLoginTitleDirective\n \n \n AudioEnabledDirective\n \n \n LangDirective\n \n \n LangOptionsDirective\n \n \n LivekitUrlDirective\n \n \n MinimalDirective\n \n \n ParticipantNameDirective\n \n \n ParticipantPanelItemMuteButtonDirective\n \n \n PrejoinDirective\n \n \n StreamDisplayAudioDetectionDirective\n \n \n StreamDisplayParticipantNameDirective\n \n \n StreamVideoControlsDirective\n \n \n TokenDirective\n \n \n TokenErrorDirective\n \n \n ToolbarActivitiesPanelButtonDirective\n \n \n ToolbarAdditionalButtonsPossitionDirective\n \n \n ToolbarBackgroundEffectsButtonDirective\n \n \n ToolbarBroadcastingButtonDirective\n \n \n ToolbarChatPanelButtonDirective\n \n \n ToolbarDisplayLogoDirective\n \n \n ToolbarDisplayRoomNameDirective\n \n \n ToolbarFullscreenButtonDirective\n \n \n ToolbarLeaveButtonDirective\n \n \n ToolbarParticipantsPanelButtonDirective\n \n \n ToolbarRecordingButtonDirective\n \n \n ToolbarScreenshareButtonDirective\n \n \n ToolbarSettingsButtonDirective\n \n \n VideoEnabledDirective\n \n \n \n \n Exports\n \n \n ActivitiesPanelBroadcastingActivityDirective\n \n \n ActivitiesPanelRecordingActivityDirective\n \n \n AdminDashboardRecordingsListDirective\n \n \n AdminDashboardTitleDirective\n \n \n AdminLoginErrorDirective\n \n \n AdminLoginTitleDirective\n \n \n AudioEnabledDirective\n \n \n LangDirective\n \n \n LangOptionsDirective\n \n \n LivekitUrlDirective\n \n \n MinimalDirective\n \n \n ParticipantNameDirective\n \n \n ParticipantPanelItemMuteButtonDirective\n \n \n PrejoinDirective\n \n \n StreamDisplayAudioDetectionDirective\n \n \n StreamDisplayParticipantNameDirective\n \n \n StreamVideoControlsDirective\n \n \n TokenDirective\n \n \n TokenErrorDirective\n \n \n ToolbarActivitiesPanelButtonDirective\n \n \n ToolbarAdditionalButtonsPossitionDirective\n \n \n ToolbarBackgroundEffectsButtonDirective\n \n \n ToolbarBroadcastingButtonDirective\n \n \n ToolbarChatPanelButtonDirective\n \n \n ToolbarDisplayLogoDirective\n \n \n ToolbarDisplayRoomNameDirective\n \n \n ToolbarFullscreenButtonDirective\n \n \n ToolbarLeaveButtonDirective\n \n \n ToolbarParticipantsPanelButtonDirective\n \n \n ToolbarRecordingButtonDirective\n \n \n ToolbarScreenshareButtonDirective\n \n \n ToolbarSettingsButtonDirective\n \n \n VideoEnabledDirective\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/AudioEnabledDirective.html":{"url":"directives/AudioEnabledDirective.html","title":"directive - AudioEnabledDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n AudioEnabledDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The audioEnabled directive allows to join the room with microphone enabled or disabled.\nIt is only available for VideoconferenceComponent.\nDefault: true\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[audioEnabled]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/BroadcastingActivityComponent.html":{"url":"components/BroadcastingActivityComponent.html","title":"component - BroadcastingActivityComponent","body":"\n \n\n\n\n\n\n Components\n \n BroadcastingActivityComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component.ts\n\n\n\n \n Description\n \n \n The BroadcastingActivityComponent is the component that allows showing the broadcasting activity.\n\n \n\n\n \n Implements\n \n \n OnInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-broadcasting-activity\n \n\n\n\n \n styleUrls\n ./broadcasting-activity.component.scss,../activities-panel.component.scss\n \n\n\n\n \n templateUrl\n ./broadcasting-activity.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onBroadcastingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when start broadcasting button is clicked.\nIt provides the BroadcastingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onBroadcastingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop broadcasting button is clicked.\nIt provides the BroadcastingStopRequestedEvent payload as event data.\n\n \n \n \n \n\n\n\n\n\n\n\n \n API Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component. \n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsensors\t\t\t\t\t\t\t\t\t\terror\t\t\t\t\tsensors\t\t\t\t\t\t\t\t{{ \\'PANEL.STREAMING.TITLE\\' | translate }}\t\t\t\t{{ \\'PANEL.STREAMING.SUBTITLE\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ broadcastingStatus | uppercase }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplay_circle\t\t\t\t\t\t\t\t\t\t\t\t\tstop_circle\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'CONTENT_SUBTITLE\\' | translate }}\t\t\t\t{{ \\'PANEL.STREAMING.REQUIRED_URL\\' | translate }}\t\t\t\t{{ broadcastingError }}\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'BroadcastingActivityComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/BroadcastingEvent.html":{"url":"interfaces/BroadcastingEvent.html","title":"interface - BroadcastingEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n BroadcastingEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts\n \n\n\n \n Description\n \n \n Interface representing a broadcasting event\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n roomName\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n roomName\n \n \n \n \n \n \n \n \n roomName: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/BroadcastingService.html":{"url":"injectables/BroadcastingService.html","title":"injectable - BroadcastingService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n BroadcastingService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/broadcasting/broadcasting.service.ts\n \n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n broadcastingStatusObs\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n setBroadcastingStarting\n \n \n setBroadcastingStopping\n \n \n \n \n\n\n\n\n\n \n \n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n setBroadcastingStarting\n \n \n \n \n \n \nsetBroadcastingStarting()\n \n \n\n\n\n\n \n \n Set the broadcasting BroadcastingStatus to starting.\nThe started status will be updated automatically when the broadcasting is started.\n\n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n setBroadcastingStopping\n \n \n \n \n \n \nsetBroadcastingStopping()\n \n \n\n\n\n\n \n \n Set the broadcasting BroadcastingStatus to stopping.\nThe stopped status will be updated automatically when the broadcasting is stopped.\n\n\n \n Returns : void\n\n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n broadcastingStatusObs\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n \n \n Broadcasting status Observable which pushes the BroadcastingStatusInfo in every update.\n\n \n \n\n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/BroadcastingStartRequestedEvent.html":{"url":"interfaces/BroadcastingStartRequestedEvent.html","title":"interface - BroadcastingStartRequestedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n BroadcastingStartRequestedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts\n \n\n\n\n \n Extends\n \n \n BroadcastingEvent\n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n broadcastUrl\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n broadcastUrl\n \n \n \n \n \n \n \n \n broadcastUrl: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/BroadcastingStatusInfo.html":{"url":"interfaces/BroadcastingStatusInfo.html","title":"interface - BroadcastingStatusInfo","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n BroadcastingStatusInfo\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts\n \n\n\n \n Description\n \n \n Interface representing information related to the broadcasting status\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n broadcastingId\n \n \n \n Optional\n \n error\n \n \n \n \n status\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n broadcastingId\n \n \n \n \n \n \n \n \n broadcastingId: string | undefined\n\n \n \n\n\n \n \n Type : string | undefined\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n error\n \n \n \n \n \n \n \n \n error: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n status\n \n \n \n \n \n \n \n \n status: BroadcastingStatus\n\n \n \n\n\n \n \n Type : BroadcastingStatus\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/BroadcastingStopRequestedEvent.html":{"url":"interfaces/BroadcastingStopRequestedEvent.html","title":"interface - BroadcastingStopRequestedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n BroadcastingStopRequestedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts\n \n\n\n\n \n Extends\n \n \n BroadcastingEvent\n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n broadcastingId\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n broadcastingId\n \n \n \n \n \n \n \n \n broadcastingId: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/ChatPanelComponent.html":{"url":"components/ChatPanelComponent.html","title":"component - ChatPanelComponent","body":"\n \n\n\n\n\n\n Components\n \n ChatPanelComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/chat-panel/chat-panel.component.ts\n\n\n\n \n Description\n \n \n The ChatPanelComponent is an integral part of the PanelComponent and serves as the interface for displaying the session chat.\n\n \n\n\n \n Implements\n \n \n OnInit\n AfterViewInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-chat-panel\n \n\n\n\n \n styleUrls\n ../panel.component.scss,./chat-panel.component.scss\n \n\n\n\n \n templateUrl\n ./chat-panel.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n \n\n\nStructural Directives\n\n\n\nDirective\nReference\n\n\n\n\n*ovChatPanel\nChatPanelDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component. \n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t{{ \\'PANEL.CHAT.TITLE\\' | translate }}\t\t\t\t\tclose\t\t\t\t\t\t{{ \\'PANEL.CHAT.SUBTITLE\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'PANEL.CHAT.YOU\\' | translate }}\t\t\t\t\t{{ data.participantName }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsend\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'ChatPanelComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ChatPanelDirective.html":{"url":"directives/ChatPanelDirective.html","title":"directive - ChatPanelDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ChatPanelDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovChatPanel directive empowers you to effortlessly substitute the default chat panel template with a custom one.\nIn the example below, we showcase how to replace the chat template with a custom one.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n DataPacket_Kind,\n DataPublishOptions,\n DataTopic,\n ParticipantService,\n RemoteParticipant,\n Room,\n RoomEvent,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n Chat\n \n \n @for (msg of messages; track msg) {\n {{ msg }}\n }\n \n \n \n Send\n \n \n `,\n styles: `\n #my-panel {\n background: #aafffc;\n height: 100%;\n overflow: hidden;\n text-align: center;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'chat-panel-directive-example';\n token!: string;\n messages: string[] = [];\n\n constructor(\n private httpClient: HttpClient,\n private participantService: ParticipantService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Event handler for room creation\n onRoomCreated(room: Room) {\n room.on(\n RoomEvent.DataReceived,\n (\n payload: Uint8Array,\n participant?: RemoteParticipant,\n _?: DataPacket_Kind,\n topic?: string\n ) => {\n if (topic === DataTopic.CHAT) {\n const { message } = JSON.parse(new TextDecoder().decode(payload));\n const participantName = participant?.name || 'Unknown';\n this.messages.push(message);\n console.log(`Message received from ${participantName}:`, message);\n }\n }\n );\n }\n\n // Function to send a chat message\n async send(message: string): Promise {\n const strData = JSON.stringify({ message });\n const data: Uint8Array = new TextEncoder().encode(strData);\n const options: DataPublishOptions = { topic: DataTopic.CHAT };\n await this.participantService.publishData(data, options);\n this.messages.push(message);\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\n\nFor a step-by-step tutorial on how to replace the chat template with just a few lines of code,\ncheck out our comprehensive guide: Customizing the Chat Panel.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovChatPanel]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n template\n \n \n Public\n viewContainer\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, viewContainer: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n viewContainer\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n viewContainer\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/ChatPanelStatusEvent.html":{"url":"interfaces/ChatPanelStatusEvent.html","title":"interface - ChatPanelStatusEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n ChatPanelStatusEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n\n \n Extends\n \n \n PanelStatusEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/LangDirective.html":{"url":"directives/LangDirective.html","title":"directive - LangDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n LangDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The lang directive allows set the UI language to a default language.\nIt is only available for VideoconferenceComponent.\nDefault: English en\nAvailable:\n\nEnglish: en\nSpanish: es\nGerman: de\nFrench: fr\nChinese: cn\nHindi: hi\nItalian: it\nJapanese: ja\nNetherlands: nl\nPortuguese: pt\n\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[lang]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/LangOption.html":{"url":"interfaces/LangOption.html","title":"interface - LangOption","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n LangOption\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/lang.model.ts\n \n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n lang\n \n \n \n \n name\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n lang\n \n \n \n \n \n \n \n \n lang: AvailableLangs\n\n \n \n\n\n \n \n Type : AvailableLangs\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n name\n \n \n \n \n \n \n \n \n name: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/LangOptionsDirective.html":{"url":"directives/LangOptionsDirective.html","title":"directive - LangOptionsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n LangOptionsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The langOptions directive allows to set the application language options.\nIt will override the application languages provided by default.\nThis propety is an array of objects which must comply with the LangOption interface.\nIt is only available for VideoconferenceComponent.\nDefault: [ { name: 'English', lang: 'en' }, { name: 'Español', lang: 'es' }, { name: 'Deutsch', lang: 'de' }, { name: 'Français', lang: 'fr' }, { name: '中国', lang: 'cn' }, { name: 'हिन्दी', lang: 'hi' }, { name: 'Italiano', lang: 'it' }, { name: 'やまと', lang: 'ja' }, { name: 'Dutch', lang: 'nl' }, { name: 'Português', lang: 'pt' } ]\nNote: If you want to add a new language, you must add a new object with the name and the language code (e.g. { name: 'Custom', lang: 'cus' })\nand then add the language file in the assets/lang folder with the name cus.json.\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[langOptions]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/LayoutComponent.html":{"url":"components/LayoutComponent.html","title":"component - LayoutComponent","body":"\n \n\n\n\n\n\n Components\n \n LayoutComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/layout/layout.component.ts\n\n\n\n \n Description\n \n \n The LayoutComponent is hosted inside of the VideoconferenceComponent.\nIt is in charge of displaying the participants streams layout.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n AfterViewInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-layout\n \n\n\n\n \n styleUrls\n ./layout.component.scss\n \n\n\n\n \n templateUrl\n ./layout.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n localParticipant\n \n \n remoteParticipants\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n localParticipant\n \n \n \n \n \n \n Type : ParticipantModel | undefined\n\n \n \n\n\n \n \n \n \n \n \n \n \n remoteParticipants\n \n \n \n \n \n \n Type : ParticipantModel[]\n\n \n \n \n \n Default value : []\n \n \n\n\n \n \n\n\n\n\n \n \n\n\nStructural Directives\n\n\n\nDirective\nReference\n\n\n\n\n*ovLayout\nLayoutDirective\n\n\n\nIt is also providing us a way to replace the {@link StreamComponent Stream Component} (which is hosted inside of it) with a custom one.\nIt will recognise the following directive in a child element.\n\n\n\nDirective\nReference\n\n\n\n\n*ovStream\nStreamDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component.\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t -->'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'LayoutComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/LayoutDirective.html":{"url":"directives/LayoutDirective.html","title":"directive - LayoutDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n LayoutDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovLayout directive empowers you to replace the default room layout with a customized one.\nTo ensure that the default StreamComponent functions correctly with participant tracks, you can access all local tracks using the tracks accessor.\nExtracting streams from remote participants can be more complex, but openvidu-angular simplifies the process with the RemoteParticipantTracksPipe, which facilitates the extraction of each participant's stream.\nIn the example below, take note of the HTML template's structure. The *ngFor statements employ the | tracks pipe to handle tracks effectively.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { lastValueFrom, Subscription } from 'rxjs';\nimport {\n ParticipantModel,\n ParticipantService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n \n \n @for (track of localParticipant.tracks; track track) {\n \n \n \n }\n\n \n @for (track of remoteParticipants | tracks; track track) {\n \n \n \n }\n \n \n \n `,\n styles: `\n .container {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n }\n .item {\n flex: 0 50%;\n height: 250px;\n margin-bottom: 2%;\n }\n .hidden {\n display: none;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule, NgClass],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'custom-layout';\n token!: string;\n\n // Participant-related properties\n localParticipant!: ParticipantModel;\n remoteParticipants!: ParticipantModel[];\n localParticipantSubs!: Subscription;\n remoteParticipantsSubs!: Subscription;\n\n constructor(\n private httpClient: HttpClient,\n private participantService: ParticipantService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n ngOnInit() {\n // Subscribe to participants' updates\n this.subscribeToParticipants();\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n ngOnDestroy() {\n // Unsubscribe from participant updates to prevent memory leaks\n this.localParticipantSubs.unsubscribe();\n this.remoteParticipantsSubs.unsubscribe();\n }\n\n // Subscribe to updates for local and remote participants\n subscribeToParticipants() {\n this.localParticipantSubs =\n this.participantService.localParticipant$.subscribe((p) => {\n if (p) this.localParticipant = p;\n });\n\n this.remoteParticipantsSubs =\n this.participantService.remoteParticipants$.subscribe(\n (participants) => {\n this.remoteParticipants = participants;\n }\n );\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\n\nFor a comprehensive guide on implementing custom layouts, please refer to the associated tutorial here.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovLayout]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n container\n \n \n Public\n template\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, container: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n container\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n container\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/LivekitUrlDirective.html":{"url":"directives/LivekitUrlDirective.html","title":"directive - LivekitUrlDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n LivekitUrlDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The livekitUrl directive sets the livekitUrl to grant a participant access to a Room.\nThis Livekit Url will be use by each participant when connecting to a Room.\nIt is only available for VideoconferenceComponent.\n Default: \"\"\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[livekitUrl]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/MinimalDirective.html":{"url":"directives/MinimalDirective.html","title":"directive - MinimalDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n MinimalDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The minimal directive applies a minimal UI hiding all controls except for cam and mic.\nIt is only available for VideoconferenceComponent.\nDefault: false\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[minimal]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"modules/OpenViduComponentsDirectiveModule.html":{"url":"modules/OpenViduComponentsDirectiveModule.html","title":"module - OpenViduComponentsDirectiveModule","body":"\n \n\n\n\n\n Modules\n OpenViduComponentsDirectiveModule\n\n\n\n \n \n\n\n\n\n\ndependencies\n\nLegend\n\n  Declarations\n\n  Module\n\n  Bootstrap\n\n  Providers\n\n  Exports\n\ncluster_OpenViduComponentsDirectiveModule\n\n\n\ncluster_OpenViduComponentsDirectiveModule_declarations\n\n\n\ncluster_OpenViduComponentsDirectiveModule_exports\n\n\n\n\nActivitiesPanelDirective\n\nActivitiesPanelDirective\n\n\n\nOpenViduComponentsDirectiveModule\n\nOpenViduComponentsDirectiveModule\n\nOpenViduComponentsDirectiveModule -->\n\nActivitiesPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nAdditionalPanelsDirective\n\nAdditionalPanelsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nAdditionalPanelsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nChatPanelDirective\n\nChatPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nChatPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nLayoutDirective\n\nLayoutDirective\n\nOpenViduComponentsDirectiveModule -->\n\nLayoutDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nPanelDirective\n\nPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantPanelItemDirective\n\nParticipantPanelItemDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantPanelItemDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantPanelItemElementsDirective\n\nParticipantPanelItemElementsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantsPanelDirective\n\nParticipantsPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantsPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nStreamDirective\n\nStreamDirective\n\nOpenViduComponentsDirectiveModule -->\n\nStreamDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarAdditionalButtonsDirective\n\nToolbarAdditionalButtonsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarAdditionalPanelButtonsDirective\n\nToolbarAdditionalPanelButtonsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarDirective\n\nToolbarDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nActivitiesPanelDirective \n\nActivitiesPanelDirective \n\nActivitiesPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ActivitiesPanelDirective \n\n\n\n\n\nAdditionalPanelsDirective \n\nAdditionalPanelsDirective \n\nAdditionalPanelsDirective -->\n\nOpenViduComponentsDirectiveModule->AdditionalPanelsDirective \n\n\n\n\n\nChatPanelDirective \n\nChatPanelDirective \n\nChatPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ChatPanelDirective \n\n\n\n\n\nLayoutDirective \n\nLayoutDirective \n\nLayoutDirective -->\n\nOpenViduComponentsDirectiveModule->LayoutDirective \n\n\n\n\n\nPanelDirective \n\nPanelDirective \n\nPanelDirective -->\n\nOpenViduComponentsDirectiveModule->PanelDirective \n\n\n\n\n\nParticipantPanelItemDirective \n\nParticipantPanelItemDirective \n\nParticipantPanelItemDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantPanelItemDirective \n\n\n\n\n\nParticipantPanelItemElementsDirective \n\nParticipantPanelItemElementsDirective \n\nParticipantPanelItemElementsDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective \n\n\n\n\n\nParticipantsPanelDirective \n\nParticipantsPanelDirective \n\nParticipantsPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantsPanelDirective \n\n\n\n\n\nStreamDirective \n\nStreamDirective \n\nStreamDirective -->\n\nOpenViduComponentsDirectiveModule->StreamDirective \n\n\n\n\n\nToolbarAdditionalButtonsDirective \n\nToolbarAdditionalButtonsDirective \n\nToolbarAdditionalButtonsDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective \n\n\n\n\n\nToolbarAdditionalPanelButtonsDirective \n\nToolbarAdditionalPanelButtonsDirective \n\nToolbarAdditionalPanelButtonsDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective \n\n\n\n\n\nToolbarDirective \n\nToolbarDirective \n\nToolbarDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarDirective \n\n\n\n\n\n\n \n \n \n Zoom in\n Reset\n Zoom out\n \n\n\n\n\n\n \n Info\n \n\n\n\n \n\n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.module.ts\n \n\n\n\n\n\n \n \n \n Declarations\n \n \n ActivitiesPanelDirective\n \n \n AdditionalPanelsDirective\n \n \n ChatPanelDirective\n \n \n LayoutDirective\n \n \n PanelDirective\n \n \n ParticipantPanelItemDirective\n \n \n ParticipantPanelItemElementsDirective\n \n \n ParticipantsPanelDirective\n \n \n StreamDirective\n \n \n ToolbarAdditionalButtonsDirective\n \n \n ToolbarAdditionalPanelButtonsDirective\n \n \n ToolbarDirective\n \n \n \n \n Exports\n \n \n ActivitiesPanelDirective\n \n \n AdditionalPanelsDirective\n \n \n ChatPanelDirective\n \n \n LayoutDirective\n \n \n PanelDirective\n \n \n ParticipantPanelItemDirective\n \n \n ParticipantPanelItemElementsDirective\n \n \n ParticipantsPanelDirective\n \n \n StreamDirective\n \n \n ToolbarAdditionalButtonsDirective\n \n \n ToolbarAdditionalPanelButtonsDirective\n \n \n ToolbarDirective\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/OpenViduService.html":{"url":"injectables/OpenViduService.html","title":"injectable - OpenViduService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n OpenViduService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts\n \n\n\n\n\n\n \n Index\n \n \n\n \n \n Methods\n \n \n \n \n \n \n Async\n connectRoom\n \n \n Async\n disconnectRoom\n \n \n getRoom\n \n \n getRoomMetadata\n \n \n getRoomName\n \n \n isRoomConnected\n \n \n \n \n\n\n\n\n\n \n \n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n Async\n connectRoom\n \n \n \n \n \n \n \n connectRoom()\n \n \n\n\n\n\n \n \n Connects to the Room\n\n\n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n Async\n disconnectRoom\n \n \n \n \n \n \n \n disconnectRoom()\n \n \n\n\n\n\n \n \n Disconnects the room\n\n\n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n getRoom\n \n \n \n \n \n \ngetRoom()\n \n \n\n\n\n\n \n \n\n \n Returns : Room\n\n \n \n Room instance\n\n \n \n \n \n \n \n \n \n \n \n \n getRoomMetadata\n \n \n \n \n \n \ngetRoomMetadata()\n \n \n\n\n\n\n \n \n Returns the room metadata from the token\n\n\n \n Returns : literal type\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n getRoomName\n \n \n \n \n \n \ngetRoomName()\n \n \n\n\n\n\n \n \n Returns the room name\n\n\n \n Returns : string\n\n \n \n \n \n \n \n \n \n \n \n \n isRoomConnected\n \n \n \n \n \n \nisRoomConnected()\n \n \n\n\n\n\n \n \n Returns if the room is connected or not\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/PanelComponent.html":{"url":"components/PanelComponent.html","title":"component - PanelComponent","body":"\n \n\n\n\n\n\n Components\n \n PanelComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/panel.component.ts\n\n\n\n \n Description\n \n \n The PanelComponent is hosted inside of the VideoconferenceComponent.\nIt is in charge of displaying the videoconference panels providing functionalities to the videoconference app\nsuch as the chat (ChatPanelComponent) and list of participants (ParticipantsPanelComponent)\n\n \n\n\n \n Implements\n \n \n OnInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-panel\n \n\n\n\n \n styleUrls\n ./panel.component.scss\n \n\n\n\n \n templateUrl\n ./panel.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onActivitiesPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the activities panel status has been changed.\nIt provides the new status of the activities panel represented by the ActivitiesPanelStatusEvent object.\n\n \n \n \n \n \n \n \n \n \n onChatPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the chat panel status has been changed.\nIt provides the new status of the chat panel represented by the ChatPanelStatusEvent object.\n\n \n \n \n \n \n \n \n \n \n onParticipantsPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the participants panel status has been changed.\nIt provides the new status of the participants panel represented by the ParticipantsPanelStatusEvent object.\n\n \n \n \n \n \n \n \n \n \n onSettingsPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the settings panel status has been changed.\nIt provides the new status of the settings panel represented by the SettingsPanelStatusEvent object.\n\n \n \n \n \n\n\n\n\n\n\n\n \n \n\n\nStructural Directives\nWith these kind of directives you can replace the default PanelComponent with your own component. You can also add your own components to the default ones.\n\n\n\nDirective\nReference\n\n\n\n\n*ovPanel\nPanelDirective\n\n\n\nIt is also providing us a way to replace the children panels to the default panel.\nIt will recognise the following directive in a child element.\n\n\n\nDirective\nReference\n\n\n\n\n*ovChatPanel\nChatPanelDirective\n\n\n*ovParticipantsPanel\nParticipantsPanelDirective\n\n\n*ovAdditionalPanels\nAdditionalPanelsDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component. \n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'PanelComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/PanelDirective.html":{"url":"directives/PanelDirective.html","title":"directive - PanelDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n PanelDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovPanel directive empowers you to seamlessly replace default panels with custom ones.\nIt also provides the flexibility to insert elements tagged with the ChatPanelDirective, ParticipantsPanelDirective, and AdditionalPanelsDirective.\nIn the example below, we showcase how to entirely replace the PanelComponent using the ChatPanelDirective.\nWithin it, you can tailor the appearance and behavior of the ParticipantsPanelComponent and ChatPanelComponent using their respective directives.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n \n This is my custom chat panel\n\n \n \n This is my custom participants panel\n \n\n \n \n This is my custom activities panel\n \n \n \n `,\n styles: `\n #my-chat-panel,\n #my-participants-panel,\n #my-activities-panel {\n text-align: center;\n height: calc(100% - 40px);\n margin: 20px;\n }\n\n #my-chat-panel {\n background: #c9ffb2;\n }\n\n #my-participants-panel {\n background: #ddf2ff;\n }\n\n #my-activities-panel {\n background: #ffddc9;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'custom-panels';\n token!: string;\n\n constructor(private httpClient: HttpClient) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\n\nFor a comprehensive tutorial on implementing custom panels, please refer to the associated guide here.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovPanel]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/PanelService.html":{"url":"injectables/PanelService.html","title":"injectable - PanelService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n PanelService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/panel/panel.service.ts\n \n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n panelStatusObs\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n closePanel\n \n \n isActivitiesPanelOpened\n \n \n isBackgroundEffectsPanelOpened\n \n \n isChatPanelOpened\n \n \n isExternalPanelOpened\n \n \n isParticipantsPanelOpened\n \n \n isSettingsPanelOpened\n \n \n togglePanel\n \n \n \n \n\n\n\n\n\n \n \n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n closePanel\n \n \n \n \n \n \nclosePanel()\n \n \n\n\n\n\n \n \n Closes the panel if it is opened.\n\n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n isActivitiesPanelOpened\n \n \n \n \n \n \nisActivitiesPanelOpened()\n \n \n\n\n\n\n \n \n Whether the activities panel is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isBackgroundEffectsPanelOpened\n \n \n \n \n \n \nisBackgroundEffectsPanelOpened()\n \n \n\n\n\n\n \n \n Whether the background effects panel is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isChatPanelOpened\n \n \n \n \n \n \nisChatPanelOpened()\n \n \n\n\n\n\n \n \n Whether the chat panel is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isExternalPanelOpened\n \n \n \n \n \n \nisExternalPanelOpened()\n \n \n\n\n\n\n \n \n Returns whether the external panel (a panel adding by the final user) is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isParticipantsPanelOpened\n \n \n \n \n \n \nisParticipantsPanelOpened()\n \n \n\n\n\n\n \n \n Whether the participants panel is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isSettingsPanelOpened\n \n \n \n \n \n \nisSettingsPanelOpened()\n \n \n\n\n\n\n \n \n Whether the settings panel is opened or not.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n togglePanel\n \n \n \n \n \n \ntogglePanel(panelType: PanelType | string, subOptionType?: PanelSettingsOptions | string)\n \n \n\n\n\n\n \n \n Open or close the panel type received. Calling this method with the panel opened and the same type panel, will close the panel.\nIf the type is differente, it will switch to the properly panel.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n panelType\n \n PanelType | string\n \n\n \n No\n \n\n\n \n \n subOptionType\n \n PanelSettingsOptions | string\n \n\n \n Yes\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n panelStatusObs\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n \n \n Panel Observable which pushes the panel status in every update.\n\n \n \n\n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/PanelStatusEvent.html":{"url":"interfaces/PanelStatusEvent.html","title":"interface - PanelStatusEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n PanelStatusEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n \n Description\n \n \n Interface representing a panel status event emmited by the library to the final app\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n isOpened\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n isOpened\n \n \n \n \n \n \n \n \n isOpened: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/PanelStatusInfo.html":{"url":"interfaces/PanelStatusInfo.html","title":"interface - PanelStatusInfo","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n PanelStatusInfo\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n \n Description\n \n \n Interface representing a panel event\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n isOpened\n \n \n \n Optional\n \n panelType\n \n \n \n Optional\n \n previousPanelType\n \n \n \n Optional\n \n subOptionType\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n isOpened\n \n \n \n \n \n \n \n \n isOpened: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the panel is currently opened.\n\n \n \n \n \n \n \n \n \n \n panelType\n \n \n \n \n \n \n \n \n panelType: PanelType | string\n\n \n \n\n\n \n \n Type : PanelType | string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n The type of the panel. For example: 'chat', 'participants', 'settings', 'activities', etc.\n\n \n \n \n \n \n \n \n \n \n previousPanelType\n \n \n \n \n \n \n \n \n previousPanelType: PanelType | string\n\n \n \n\n\n \n \n Type : PanelType | string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n The previous type of the panel before any changes.\n\n \n \n \n \n \n \n \n \n \n subOptionType\n \n \n \n \n \n \n \n \n subOptionType: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n Additional information for the 'activities' and 'settings' panel, specifying the sub-option to be displayed.\n\n \n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"classes/ParticipantModel.html":{"url":"classes/ParticipantModel.html","title":"class - ParticipantModel","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n Classes\n ParticipantModel\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/participant.model.ts\n \n\n\n \n Description\n \n \n Class that represents a participant in the room.\n\n \n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n colorProfile\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n publishTrack\n \n \n \n \n\n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n sid\n \n \n name\n \n \n isCameraEnabled\n \n \n isMicrophoneEnabled\n \n \n isScreenShareEnabled\n \n \n isSpeaking\n \n \n tracks\n \n \n videoTracks\n \n \n audioTracks\n \n \n cameraTracks\n \n \n isLocal\n \n \n onlyHasAudioTracks\n \n \n onlyHasScreenTracks\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(props: ParticipantProperties)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n props\n \n \n ParticipantProperties\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n colorProfile\n \n \n \n \n \n \n Type : string\n\n \n \n\n \n \n The color profile associated with the participant.\nIt specifies the visual representation of the participant in the user interface.\n\n \n \n\n \n \n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n publishTrack\n \n \n \n \n \n \npublishTrack(track: LocalTrack, options?: TrackPublishOptions)\n \n \n\n\n\n\n \n \n Publishes a track to the room\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n track\n \n LocalTrack\n \n\n \n No\n \n\n\n \n \n options\n \n TrackPublishOptions\n \n\n \n Yes\n \n\n\n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n\n\n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n sid\n \n \n\n \n \n getsid()\n \n \n \n \n Returns the server assigned unique identifier for the participant.\n\n\n \n \n \n Returns : string\n\n \n \n \n\n \n \n \n \n \n \n \n name\n \n \n\n \n \n getname()\n \n \n \n \n Returns the participant name.\n\n\n \n \n \n Returns : string | undefined\n\n \n \n \n\n \n \n \n \n \n \n \n isCameraEnabled\n \n \n\n \n \n getisCameraEnabled()\n \n \n \n \n Returns if the participant has enabled its camera.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n isMicrophoneEnabled\n \n \n\n \n \n getisMicrophoneEnabled()\n \n \n \n \n Returns if the participant has enabled its microphone.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n isScreenShareEnabled\n \n \n\n \n \n getisScreenShareEnabled()\n \n \n \n \n Returns if the participant has enabled its screen share.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n isSpeaking\n \n \n\n \n \n getisSpeaking()\n \n \n \n \n Returns if the participant is speaking.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n tracks\n \n \n\n \n \n gettracks()\n \n \n \n \n Returns all the participant tracks.\n\n\n \n \n \n Returns : ParticipantTrackPublication[]\n\n \n \n \n\n \n \n \n \n \n \n \n videoTracks\n \n \n\n \n \n getvideoTracks()\n \n \n \n \n Returns all the participant video tracks.\n\n\n \n \n \n Returns : ParticipantTrackPublication[]\n\n \n \n \n\n \n \n \n \n \n \n \n audioTracks\n \n \n\n \n \n getaudioTracks()\n \n \n \n \n Returns all the participant audio tracks.\n\n\n \n \n \n Returns : ParticipantTrackPublication[]\n\n \n \n \n\n \n \n \n \n \n \n \n cameraTracks\n \n \n\n \n \n getcameraTracks()\n \n \n \n \n Returns all the participant camera tracks.\n\n\n \n \n \n Returns : ParticipantTrackPublication[]\n\n \n \n \n\n \n \n \n \n \n \n \n isLocal\n \n \n\n \n \n getisLocal()\n \n \n \n \n Returns if the participant is local.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n onlyHasAudioTracks\n \n \n\n \n \n getonlyHasAudioTracks()\n \n \n \n \n Returns if the participant has only audio tracks.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n \n \n \n \n \n onlyHasScreenTracks\n \n \n\n \n \n getonlyHasScreenTracks()\n \n \n \n \n Returns if the participant has only screen tracks.\n\n\n \n Returns : boolean\n\n \n \n \n\n \n \n\n \n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ParticipantNameDirective.html":{"url":"directives/ParticipantNameDirective.html","title":"directive - ParticipantNameDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ParticipantNameDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The participantName directive sets the participant name. It can be useful for aplications which doesn't need the prejoin page.\nIt is only available for VideoconferenceComponent.\nExample :\n \n\n\n \n Implements\n \n \n OnInit\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[participantName]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/ParticipantPanelItemComponent.html":{"url":"components/ParticipantPanelItemComponent.html","title":"component - ParticipantPanelItemComponent","body":"\n \n\n\n\n\n\n Components\n \n ParticipantPanelItemComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/participants-panel/participant-panel-item/participant-panel-item.component.ts\n\n\n\n \n Description\n \n \n The ParticipantPanelItemComponent is hosted inside of the ParticipantsPanelComponent.\nIt is in charge of displaying the participants information inside of the ParticipansPanelComponent.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-participant-panel-item\n \n\n\n\n \n styleUrls\n ./participant-panel-item.component.scss\n \n\n\n\n \n templateUrl\n ./participant-panel-item.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n \n\n\nStructural Directives\n\n\n\nDirective\nReference\n\n\n\n\n*ovParticipantPanelItem\nParticipantPanelItemDirective\n\n\n\nIt is also providing us a way to add additional buttons to the default participant panel item.\nIt will recognise the following directive in a child element.\n\n\n\nDirective\nReference\n\n\n\n\n*ovParticipantPanelItemElements\nParticipantPanelItemElementsDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nmuteButton\nboolean\nParticipantPanelItemMuteButtonDirective\n\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\tperson\t\t\t\t{{ _participant.name }}\t\t\t ({{ \\'PANEL.PARTICIPANTS.YOU\\' | translate }})\t\t\t\t{{ _participant | tracksPublishedTypes }}\t\t\t\t\t\t\t -->\t\t\t\t\t\t\t\t\tvolume_up\t\t\t\tvolume_off\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'ParticipantPanelItemComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ParticipantPanelItemDirective.html":{"url":"directives/ParticipantPanelItemDirective.html","title":"directive - ParticipantPanelItemDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ParticipantPanelItemDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovParticipantPanelItem directive allows you to customize the default participant panel item template within the ParticipantsPanelComponent.\nWith the ovParticipantPanelItem directive, you can access the participant object from its context using the let keyword and referencing the participant\nvariable as follows: *ovParticipantPanelItem=\"let participant\". This allows you to access the ParticipantModel object.\nIn the example below, we demonstrate how to replace the participant panel item template with just a few lines of code.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\nimport { MatIconButton } from '@angular/material/button';\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n {{ participant.name }}\n\n \n \n more_vert\n \n\n \n \n Button 1\n Button 2\n \n \n \n `,\n styles: [],\n standalone: true,\n imports: [\n OpenViduComponentsModule,\n MatIconButton,\n MatMenuTrigger,\n MatIcon,\n MatMenu,\n MatMenuItem,\n ],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'participant-panel-item';\n token!: string;\n\n constructor(private httpClient: HttpClient) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor a detailed tutorial on customizing participant panel items, please visit this link.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovParticipantPanelItem]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n template\n \n \n Public\n viewContainer\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, viewContainer: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n viewContainer\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n viewContainer\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ParticipantPanelItemElementsDirective.html":{"url":"directives/ParticipantPanelItemElementsDirective.html","title":"directive - ParticipantPanelItemElementsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ParticipantPanelItemElementsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovParticipantPanelItemElements directive allows you to incorporate additional elements into the ParticipantPanelItemComponent.\nIn the example below, we demonstrate how to add a simple button for disconnecting from the session.\nWith the *ovParticipantPanelItemElements directive, you can access the participant object within its context using the let keyword and referencing the participant variable as follows: *ovParticipantPanelItem=\"let participant\".\nThis enables you to access the ParticipantModel object and activate the button exclusively for the local participant.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n OpenViduService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n @if (connected) {\n \n \n \n \n @if (participant.isLocal) {\n Leave\n }\n \n \n }\n\n \n @if (!connected) {\n Session disconnected\n }\n `,\n styles: [],\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'participant-panel-item-elements';\n token!: string;\n\n // Flag to indicate session connection status\n connected = true;\n\n constructor(\n private httpClient: HttpClient,\n private openviduService: OpenViduService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Function to leave the session\n async leaveSession() {\n await this.openviduService.disconnectRoom();\n this.connected = false;\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor a comprehensive tutorial on adding elements to participant panel items, please visit this link.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovParticipantPanelItemElements]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n template\n \n \n Public\n viewContainer\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, viewContainer: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n viewContainer\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n viewContainer\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ParticipantPanelItemMuteButtonDirective.html":{"url":"directives/ParticipantPanelItemMuteButtonDirective.html","title":"directive - ParticipantPanelItemMuteButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ParticipantPanelItemMuteButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/participant-panel-item.directive.ts\n \n\n\n \n Description\n \n \n The muteButton directive allows show/hide the muted button in participant panel item component.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the participantPanelItem component:\nExample :And it also can be used in the ParticipantPanelItemComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n muteValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n muteButton\n \n \n participantPanelItemMuteButton\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n participantPanelItemMuteButton\n \n \n muteButton\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n muteButton\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n participantPanelItemMuteButton\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n muteValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n \n \n Default value : true\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n participantPanelItemMuteButton\n \n \n\n\n \n \n setparticipantPanelItemMuteButton(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n muteButton\n \n \n\n\n \n \n setmuteButton(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/ParticipantProperties.html":{"url":"interfaces/ParticipantProperties.html","title":"interface - ParticipantProperties","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n ParticipantProperties\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/participant.model.ts\n \n\n\n \n Description\n \n \n Interface defining properties of a participant.\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Optional\n \n colorProfile\n \n \n \n \n participant\n \n \n \n Optional\n \n room\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n colorProfile\n \n \n \n \n \n \n \n \n colorProfile: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n The color profile associated with the participant.\nIt specifies the visual representation of the participant in the user interface.\n\n \n \n \n \n \n \n \n \n \n participant\n \n \n \n \n \n \n \n \n participant: LocalParticipant | RemoteParticipant\n\n \n \n\n\n \n \n Type : LocalParticipant | RemoteParticipant\n\n \n \n\n\n\n\n\n \n \n The participant instance, which can be either a local participant or a remote participant.\n\n \n \n \n \n \n \n \n \n \n room\n \n \n \n \n \n \n \n \n room: Room\n\n \n \n\n\n \n \n Type : Room\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n The room in which the participant is located, applicable only for local participants.\n\n \n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/ParticipantService.html":{"url":"injectables/ParticipantService.html","title":"injectable - ParticipantService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n ParticipantService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/participant/participant.service.ts\n \n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n localParticipant$\n \n \n remoteParticipants$\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n getLocalParticipant\n \n \n getMyName\n \n \n getRemoteParticipantBySid\n \n \n getRemoteParticipants\n \n \n isMyCameraEnabled\n \n \n isMyMicrophoneEnabled\n \n \n isMyScreenShareEnabled\n \n \n publishData\n \n \n Async\n setCameraEnabled\n \n \n Async\n setMicrophoneEnabled\n \n \n Async\n setScreenShareEnabled\n \n \n Async\n switchCamera\n \n \n Async\n switchMicrophone\n \n \n Async\n switchScreenShare\n \n \n updateLocalParticipant\n \n \n updateRemoteParticipants\n \n \n \n \n\n\n\n\n\n \n \n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n getLocalParticipant\n \n \n \n \n \n \ngetLocalParticipant()\n \n \n\n\n\n\n \n \n Returns the local participant object.\n\n\n \n Returns : ParticipantModel | undefined\n\n \n \n \n \n \n \n \n \n \n \n \n getMyName\n \n \n \n \n \n \ngetMyName()\n \n \n\n\n\n\n \n \n Returns the local participant name.\n\n\n \n Returns : string | undefined\n\n \n \n \n \n \n \n \n \n \n \n \n getRemoteParticipantBySid\n \n \n \n \n \n \ngetRemoteParticipantBySid(sid: string)\n \n \n\n\n\n\n \n \n Returns the remote participant with the given sid.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n sid\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : ParticipantModel | undefined\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n getRemoteParticipants\n \n \n \n \n \n \ngetRemoteParticipants()\n \n \n\n\n\n\n \n \n Returns all remote participants in the room.\n\n\n \n Returns : ParticipantModel[]\n\n \n \n \n \n \n \n \n \n \n \n \n isMyCameraEnabled\n \n \n \n \n \n \nisMyCameraEnabled()\n \n \n\n\n\n\n \n \n Returns if the local participant camera is enabled.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isMyMicrophoneEnabled\n \n \n \n \n \n \nisMyMicrophoneEnabled()\n \n \n\n\n\n\n \n \n Returns if the local participant microphone is enabled.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n isMyScreenShareEnabled\n \n \n \n \n \n \nisMyScreenShareEnabled()\n \n \n\n\n\n\n \n \n Returns if the local participant screen is enabled.\n\n\n \n Returns : boolean\n\n \n \n \n \n \n \n \n \n \n \n \n publishData\n \n \n \n \n \n \npublishData(data: Uint8Array, publishOptions: DataPublishOptions)\n \n \n\n\n\n\n \n \n Publishes a new data payload to the room. Data will be forwarded to each participant in the room if the destination field in publishOptions is empty.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n Description\n \n \n \n \n data\n \n Uint8Array\n \n\n \n No\n \n\n\n \n \n \n \n publishOptions\n \n DataPublishOptions\n \n\n \n No\n \n\n\n \n DataPublishOptions\n\n \n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n setCameraEnabled\n \n \n \n \n \n \n \n setCameraEnabled(enabled: boolean)\n \n \n\n\n\n\n \n \n Sets the local participant camera enabled or disabled.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n enabled\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n setMicrophoneEnabled\n \n \n \n \n \n \n \n setMicrophoneEnabled(enabled: boolean)\n \n \n\n\n\n\n \n \n Sets the local participant microphone enabled or disabled.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n enabled\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n setScreenShareEnabled\n \n \n \n \n \n \n \n setScreenShareEnabled(enabled: boolean)\n \n \n\n\n\n\n \n \n Share or unshare the local participant screen.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n Description\n \n \n \n \n enabled\n \n boolean\n \n\n \n No\n \n\n\n \n : true to share the screen, false to unshare it\n\n \n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n switchCamera\n \n \n \n \n \n \n \n switchCamera(deviceId: string)\n \n \n\n\n\n\n \n \n Switches the active camera track used in this room to the given device id.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n deviceId\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n switchMicrophone\n \n \n \n \n \n \n \n switchMicrophone(deviceId: string)\n \n \n\n\n\n\n \n \n Switches the active microphone track used in this room to the given device id.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n deviceId\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Async\n switchScreenShare\n \n \n \n \n \n \n \n switchScreenShare()\n \n \n\n\n\n\n \n \n Switches the active screen share track showing a native browser dialog to select a screen or window.\n\n\n \n Returns : Promise\n\n \n \n \n \n \n \n \n \n \n \n \n updateLocalParticipant\n \n \n \n \n \n \nupdateLocalParticipant()\n \n \n\n\n\n\n \n \n Forces to update the local participant object and fire a new localParticipant$ Observable event.\n\n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n updateRemoteParticipants\n \n \n \n \n \n \nupdateRemoteParticipants()\n \n \n\n\n\n\n \n \n Force to update the remote participants object and fire a new remoteParticipants$ Observable event.\n\n\n \n Returns : void\n\n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n localParticipant$\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n \n \n Local participant Observable which pushes the local participant object in every update.\n\n \n \n\n \n \n \n \n \n \n \n \n remoteParticipants$\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n \n \n Remote participants Observable which pushes the remote participants array in every update.\n\n \n \n\n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/ParticipantTrackPublication.html":{"url":"interfaces/ParticipantTrackPublication.html","title":"interface - ParticipantTrackPublication","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n ParticipantTrackPublication\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/participant.model.ts\n \n\n\n \n Description\n \n \n Interface that defines the properties of the participant track publication.\n\n \n\n \n Extends\n \n \n TrackPublication\n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n isAudioTrack\n \n \n \n \n isCameraTrack\n \n \n \n \n isMinimized\n \n \n \n Optional\n \n isMutedForcibly\n \n \n \n \n isPinned\n \n \n \n \n isScreenTrack\n \n \n \n \n participant\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n isAudioTrack\n \n \n \n \n \n \n \n \n isAudioTrack: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the track is from an audio sharing source or not.\n\n \n \n \n \n \n \n \n \n \n isCameraTrack\n \n \n \n \n \n \n \n \n isCameraTrack: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the track is from a camera source or not.\n\n \n \n \n \n \n \n \n \n \n isMinimized\n \n \n \n \n \n \n \n \n isMinimized: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the HTML element associated with the track is minimized (made smaller) or not.\n\n \n \n \n \n \n \n \n \n \n isMutedForcibly\n \n \n \n \n \n \n \n \n isMutedForcibly: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n Indicates whether the participant's audio is forcibly muted or not.\n\n \n \n \n \n \n \n \n \n \n isPinned\n \n \n \n \n \n \n \n \n isPinned: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the HTML element associated with the track is pinned (fixed in place) or not.\n\n \n \n \n \n \n \n \n \n \n isScreenTrack\n \n \n \n \n \n \n \n \n isScreenTrack: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n\n\n\n\n \n \n Indicates whether the track is from a screen sharing source or not.\n\n \n \n \n \n \n \n \n \n \n participant\n \n \n \n \n \n \n \n \n participant: ParticipantModel\n\n \n \n\n\n \n \n Type : ParticipantModel\n\n \n \n\n\n\n\n\n \n \n The participant who published the track.\n\n \n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/ParticipantsPanelComponent.html":{"url":"components/ParticipantsPanelComponent.html","title":"component - ParticipantsPanelComponent","body":"\n \n\n\n\n\n\n Components\n \n ParticipantsPanelComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/participants-panel/participants-panel/participants-panel.component.ts\n\n\n\n \n Description\n \n \n The ParticipantsPanelComponent is hosted inside of the PanelComponent.\nIt is in charge of displaying the participants connected to the session.\nThis component is composed by the ParticipantPanelItemComponent.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n AfterViewInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-participants-panel\n \n\n\n\n \n styleUrls\n ../../panel.component.scss,./participants-panel.component.scss\n \n\n\n\n \n templateUrl\n ./participants-panel.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n \n\n\nStructural Directives\n\n\n\nDirective\nReference\n\n\n\n\n*ovParticipantsPanel\nParticipantsPanelDirective\n\n\n\nAs the ParticipantsPanelComponent is composed by ParticipantPanelItemComponent, it is also providing us a way to replace the participant item with a custom one.\nIt will recognise the following directive in a child element.\n\n\n\nDirective\nReference\n\n\n\n\n*ovParticipantPanelItem\nParticipantPanelItemDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component. \n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t{{ \\'PANEL.PARTICIPANTS.TITLE\\' | translate }}\t\t\t\t\tclose\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t 0\">\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'ParticipantsPanelComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ParticipantsPanelDirective.html":{"url":"directives/ParticipantsPanelDirective.html","title":"directive - ParticipantsPanelDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ParticipantsPanelDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovParticipantsPanel directive empowers you to substitute the default participants panel template with a customized one.\nIn the following example, we demonstrate how to replace the participants template with just a few lines of code.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { lastValueFrom, Subscription } from 'rxjs';\n\nimport {\n ParticipantModel,\n ParticipantService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n \n {{ localParticipant.name }}\n \n \n @for (p of remoteParticipants; track p) {\n {{ p.name }}\n }\n \n \n \n `,\n styles: `\n #my-panel {\n background: #faff7f;\n height: 100%;\n overflow: hidden;\n }\n #my-panel > #local {\n background: #a184ff;\n }\n #my-panel > #remote {\n background: #7fb8ff;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'custom-participants-panel';\n token!: string;\n\n // Participant-related properties\n localParticipant!: ParticipantModel;\n remoteParticipants!: ParticipantModel[];\n localParticipantSubs!: Subscription;\n remoteParticipantsSubs!: Subscription;\n\n constructor(\n private httpClient: HttpClient,\n private participantService: ParticipantService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Subscribes to updates for local and remote participants.\n ngOnInit() {\n this.subscribeToParticipants();\n }\n\n // Unsubscribes from updates for local and remote participants to prevent memory leaks.\n ngOnDestroy() {\n this.localParticipantSubs.unsubscribe();\n this.remoteParticipantsSubs.unsubscribe();\n }\n\n // Function called when a participant requests a token to join the room.\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Subscribes to updates for local and remote participants.\n subscribeToParticipants() {\n this.localParticipantSubs =\n this.participantService.localParticipant$.subscribe((p) => {\n if (p) this.localParticipant = p;\n });\n\n this.remoteParticipantsSubs =\n this.participantService.remoteParticipants$.subscribe(\n (participants) => {\n this.remoteParticipants = participants;\n }\n );\n }\n\n // Sends a request to the server to obtain a token for a participant.\n async getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor a comprehensive tutorial on customizing the participants panel, please visit this link.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovParticipantsPanel]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n template\n \n \n Public\n viewContainer\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, viewContainer: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n viewContainer\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n viewContainer\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/ParticipantsPanelStatusEvent.html":{"url":"interfaces/ParticipantsPanelStatusEvent.html","title":"interface - ParticipantsPanelStatusEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n ParticipantsPanelStatusEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n\n \n Extends\n \n \n PanelStatusEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/PrejoinDirective.html":{"url":"directives/PrejoinDirective.html","title":"directive - PrejoinDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n PrejoinDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The prejoin directive allows show/hide the prejoin page for selecting media devices.\nIt is only available for VideoconferenceComponent.\nDefault: true\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[prejoin]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/RecordingActivityComponent.html":{"url":"components/RecordingActivityComponent.html","title":"component - RecordingActivityComponent","body":"\n \n\n\n\n\n\n Components\n \n RecordingActivityComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/panel/activities-panel/recording-activity/recording-activity.component.ts\n\n\n\n \n Description\n \n \n The RecordingActivityComponent is the component that allows showing the recording activity.\n\n \n\n\n \n Implements\n \n \n OnInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-recording-activity\n \n\n\n\n \n styleUrls\n ./recording-activity.component.scss,../activities-panel.component.scss\n \n\n\n\n \n templateUrl\n ./recording-activity.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onRecordingDeleteRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when delete recording button has been clicked.\nIt provides the RecordingDeleteRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingDownloadClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when download recording button has been clicked.\nIt provides the RecordingDownloadClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingPlayClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when play recording button has been clicked.\nIt provides the RecordingPlayClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the user clicks on the start recording button.\nIt provides the RecordingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop recording button has been clicked.\nIt provides the RecordingStopRequestedEvent payload as event data.\n\n \n \n \n \n\n\n\n\n\n\n\n \n API Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\nNo API directives available for this component. \n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvideo_camera_front\t\t\t\t\t\t\t\t\t\terror\t\t\t\t\tradio_button_checked\t\t\t\t\t\t\t\t{{ \\'PANEL.RECORDING.TITLE\\' | translate }}\t\t\t\t{{ \\'PANEL.RECORDING.SUBTITLE\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ recordingStatus | uppercase }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'PANEL.RECORDING.CONTENT_TITLE\\' | translate }}\t\t\t{{ \\'PANEL.RECORDING.CONTENT_SUBTITLE\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'TOOLBAR.STOP_RECORDING\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'TOOLBAR.START_RECORDING\\' | translate }}\t\t\t\t\t\t\t\t{{ \\'PANEL.RECORDING.STARTING\\' | translate }} \t\t\t\t{{ \\'PANEL.RECORDING.STOPPING\\' | translate }} \t\t\t\tMessage: \t\t\t\t{{ recordingError }} \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'PANEL.RECORDING.ACCEPT\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t 0\">\t\t\t\t 0\" class=\"item\">\t\t\t{{ \\'PANEL.RECORDING.RECORDINGS\\' | translate }} -->\t\t\t\t\t\t\t\t\t\t\t\tvideo_file\t\t\t\t\t\t\t\t\t\t\t{{ recording.filename }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t {{ \\'PANEL.RECORDING.IN_PROGRESS\\' | translate }} \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t {{ recording.duration | duration }} \t\t\t\t\t\t | {{ recording.size / 1024 / 1024 | number: \\'1.1-2\\' }} MBs\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ recording.startedAt | date: \\'HH:mm - dd/MM/yyyy\\' }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplay_arrow\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdownload\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdelete\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'RecordingActivityComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingDeleteRequestedEvent.html":{"url":"interfaces/RecordingDeleteRequestedEvent.html","title":"interface - RecordingDeleteRequestedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingDeleteRequestedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n\n \n Extends\n \n \n RecordingEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingDownloadClickedEvent.html":{"url":"interfaces/RecordingDownloadClickedEvent.html","title":"interface - RecordingDownloadClickedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingDownloadClickedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n\n \n Extends\n \n \n RecordingEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingEvent.html":{"url":"interfaces/RecordingEvent.html","title":"interface - RecordingEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n \n Description\n \n \n Interface representing a recording event\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Optional\n \n recordingId\n \n \n \n \n roomName\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n recordingId\n \n \n \n \n \n \n \n \n recordingId: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n roomName\n \n \n \n \n \n \n \n \n roomName: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingInfo.html":{"url":"interfaces/RecordingInfo.html","title":"interface - RecordingInfo","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingInfo\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n \n Description\n \n \n Interface representing a recording\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Optional\n \n duration\n \n \n \n Optional\n \n endedAt\n \n \n \n Optional\n \n filename\n \n \n \n \n id\n \n \n \n Optional\n \n location\n \n \n \n Optional\n \n markedForDeletion\n \n \n \n \n outputMode\n \n \n \n \n roomId\n \n \n \n \n roomName\n \n \n \n Optional\n \n size\n \n \n \n Optional\n \n startedAt\n \n \n \n \n status\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n duration\n \n \n \n \n \n \n \n \n duration: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n endedAt\n \n \n \n \n \n \n \n \n endedAt: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n filename\n \n \n \n \n \n \n \n \n filename: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n id\n \n \n \n \n \n \n \n \n id: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n location\n \n \n \n \n \n \n \n \n location: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n markedForDeletion\n \n \n \n \n \n \n \n \n markedForDeletion: boolean\n\n \n \n\n\n \n \n Type : boolean\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n outputMode\n \n \n \n \n \n \n \n \n outputMode: RecordingOutputMode\n\n \n \n\n\n \n \n Type : RecordingOutputMode\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n roomId\n \n \n \n \n \n \n \n \n roomId: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n roomName\n \n \n \n \n \n \n \n \n roomName: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n size\n \n \n \n \n \n \n \n \n size: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n startedAt\n \n \n \n \n \n \n \n \n startedAt: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n status\n \n \n \n \n \n \n \n \n status: RecordingStatus\n\n \n \n\n\n \n \n Type : RecordingStatus\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingPlayClickedEvent.html":{"url":"interfaces/RecordingPlayClickedEvent.html","title":"interface - RecordingPlayClickedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingPlayClickedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n\n \n Extends\n \n \n RecordingEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/RecordingService.html":{"url":"injectables/RecordingService.html","title":"injectable - RecordingService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n RecordingService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/recording/recording.service.ts\n \n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n recordingStatusObs\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n setRecordingStarting\n \n \n setRecordingStopping\n \n \n \n \n\n\n\n\n\n \n \n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n setRecordingStarting\n \n \n \n \n \n \nsetRecordingStarting()\n \n \n\n\n\n\n \n \n Set the RecordingStatus to starting.\nThe started stastus will be updated automatically when the recording is actually started.\n\n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n setRecordingStopping\n \n \n \n \n \n \nsetRecordingStopping()\n \n \n\n\n\n\n \n \n Set the RecordingStatus to stopping.\nThe stopped stastus will be updated automatically when the recording is actually stopped.\n\n\n \n Returns : void\n\n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n recordingStatusObs\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n \n \n Recording status Observable which pushes the recording state in every update.\n\n \n \n\n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingStartRequestedEvent.html":{"url":"interfaces/RecordingStartRequestedEvent.html","title":"interface - RecordingStartRequestedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingStartRequestedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n\n \n Extends\n \n \n RecordingEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingStatusInfo.html":{"url":"interfaces/RecordingStatusInfo.html","title":"interface - RecordingStatusInfo","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingStatusInfo\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n \n Description\n \n \n Interface representing information related to the recording status\n\n \n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Optional\n \n error\n \n \n \n Optional\n \n recordingElapsedTime\n \n \n \n \n recordingList\n \n \n \n \n status\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n error\n \n \n \n \n \n \n \n \n error: string\n\n \n \n\n\n \n \n Type : string\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n recordingElapsedTime\n \n \n \n \n \n \n \n \n recordingElapsedTime: Date\n\n \n \n\n\n \n \n Type : Date\n\n \n \n\n \n \n Optional\n \n \n\n\n\n\n \n \n \n \n \n \n \n recordingList\n \n \n \n \n \n \n \n \n recordingList: RecordingInfo[]\n\n \n \n\n\n \n \n Type : RecordingInfo[]\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n status\n \n \n \n \n \n \n \n \n status: RecordingStatus\n\n \n \n\n\n \n \n Type : RecordingStatus\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/RecordingStopRequestedEvent.html":{"url":"interfaces/RecordingStopRequestedEvent.html","title":"interface - RecordingStopRequestedEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n RecordingStopRequestedEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n\n\n\n \n Extends\n \n \n RecordingEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"pipes/RemoteParticipantTracksPipe.html":{"url":"pipes/RemoteParticipantTracksPipe.html","title":"pipe - RemoteParticipantTracksPipe","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n Pipes\n RemoteParticipantTracksPipe\n\n\n\n \n Info\n \n\n\n\n \n\n \n File\n \n \n projects/openvidu-components-angular/src/lib/pipes/participant.pipe.ts\n \n\n\n \n Description\n \n \n The RemoteParticipantTracksPipe allows us to get all the tracks from all remote participants.\nThis is used to display the tracks in the videoconference layout.\n\n \n\n\n \n Metadata\n \n \n \n Name\n tracks\n \n \n \n \n\n \n \n \n Methods\n \n \n \n \n \n \n \n transform\n \n \n \n \n \n \ntransform(participants: ParticipantModel[])\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n participants\n \n ParticipantModel[]\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : ParticipantTrackPublication[]\n\n \n \n \n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"interfaces/SettingsPanelStatusEvent.html":{"url":"interfaces/SettingsPanelStatusEvent.html","title":"interface - SettingsPanelStatusEvent","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n SettingsPanelStatusEvent\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n\n\n\n \n Extends\n \n \n PanelStatusEvent\n \n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/StreamComponent.html":{"url":"components/StreamComponent.html","title":"component - StreamComponent","body":"\n \n\n\n\n\n\n Components\n \n StreamComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/stream/stream.component.ts\n\n\n\n \n Description\n \n \n The StreamComponent is hosted inside of the LayoutComponent.\nIt is in charge of displaying the participant video stream in the videoconference layout.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n \n\n\n\n Metadata\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-stream\n \n\n\n\n \n styleUrls\n ./stream.component.scss\n \n\n\n\n \n templateUrl\n ./stream.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n \n Index\n \n \n\n\n \n \n Inputs\n \n \n \n \n \n \n track\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n track\n \n \n \n \n \n \n\n\n\n \n Inputs\n \n \n \n \n \n track\n \n \n \n \n Type : ParticipantTrackPublication\n\n \n \n \n \n\n\n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n track\n \n \n\n\n \n \n settrack(track: ParticipantTrackPublication)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n track\n \n \n ParticipantTrackPublication\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n\n \n \n\n\nStructural Directives\nWith these kind of directives you can replace the default StreamComponent with your own component. You can also add your own components to the default ones.\n\n\n\nDirective\nReference\n\n\n\n\n*ovStream\nStreamDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\ndisplayParticipantName\nboolean\nStreamDisplayParticipantNameDirective\n\n\ndisplayAudioDetection\nboolean\nStreamDisplayAudioDetectionDirective\n\n\nvideoControls\nboolean\nStreamVideoControlsDirective\n\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t{{ _track.participant.name }}\t\t\t_SCREEN\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpush_pin\t\t\t\t\t\t\t\t\t\tvolume_off\t\t\t\tvolume_up\t\t\t\t\t\t\t\t\t\topen_in_full\t\t\t\tclose_fullscreen\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'StreamComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/StreamDirective.html":{"url":"directives/StreamDirective.html","title":"directive - StreamDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n StreamDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovStream directive empowers you to substitute the default StreamComponent template with a custom one.\nIn the example below, we demonstrate how to customize the position and styles of a participant's nickname by replacing the default stream component.\nWith the ovStream directive, you can access the track object within its context using the let keyword and referencing the track variable as follows: *ovStream=\"let track\". This allows you to access the ParticipantModel object using track.participant.\nIn the example provided below, we illustrate how to achieve this customization with just a few lines of code.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n OpenViduComponentsModule,\n ApiDirectiveModule,\n OpenViduComponentsDirectiveModule,\n} from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n \n \n \n\n \n {{ track.participant.name }}\n \n \n `,\n styles: `\n p {\n position: absolute;\n bottom: 0;\n border: 2px solid;\n background: #000000;\n }\n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Define the name of the room and initialize the token variable\n roomName = 'custom-stream';\n token!: string;\n\n constructor(private httpClient: HttpClient) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Function to request a token when a participant joins the room\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Function to get a token from the server\n getToken(roomName: string, participantName: string): Promise {\n try {\n // Send a POST request to the server to obtain a token\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n // Handle errors, e.g., if the server is not reachable\n if (error.status === 404) {\n throw {\n status: error.status,\n message:\n 'Cannot connect with the backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nFor a detailed tutorial on customizing the stream component, please visit this link.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovStream]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n container\n \n \n Public\n template\n \n \n \n \n\n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(template: TemplateRef, container: ViewContainerRef)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n template\n \n \n TemplateRef\n \n \n \n No\n \n \n \n \n container\n \n \n ViewContainerRef\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n container\n \n \n \n \n \n \n Type : ViewContainerRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n template\n \n \n \n \n \n \n Type : TemplateRef\n\n \n \n\n\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/StreamDisplayAudioDetectionDirective.html":{"url":"directives/StreamDisplayAudioDetectionDirective.html","title":"directive - StreamDisplayAudioDetectionDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n StreamDisplayAudioDetectionDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts\n \n\n\n \n Description\n \n \n The displayAudioDetection directive allows show/hide the participants audio detection in stream component.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the stream component:\nExample :And it also can be used in the StreamComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n displayAudioDetectionValue\n \n \n Public\n elementRef\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n displayAudioDetection\n \n \n streamDisplayAudioDetection\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n streamDisplayAudioDetection\n \n \n displayAudioDetection\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n displayAudioDetection\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n streamDisplayAudioDetection\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n displayAudioDetectionValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n streamDisplayAudioDetection\n \n \n\n\n \n \n setstreamDisplayAudioDetection(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n displayAudioDetection\n \n \n\n\n \n \n setdisplayAudioDetection(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/StreamDisplayParticipantNameDirective.html":{"url":"directives/StreamDisplayParticipantNameDirective.html","title":"directive - StreamDisplayParticipantNameDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n StreamDisplayParticipantNameDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts\n \n\n\n \n Description\n \n \n The displayParticipantName directive allows show/hide the participants name in stream component.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the stream component:\nExample :And it also can be used in the StreamComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n displayParticipantNameValue\n \n \n Public\n elementRef\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n displayParticipantName\n \n \n streamDisplayParticipantName\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n streamDisplayParticipantName\n \n \n displayParticipantName\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n displayParticipantName\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n streamDisplayParticipantName\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n displayParticipantNameValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n\n\n \n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n streamDisplayParticipantName\n \n \n\n\n \n \n setstreamDisplayParticipantName(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n displayParticipantName\n \n \n\n\n \n \n setdisplayParticipantName(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/StreamVideoControlsDirective.html":{"url":"directives/StreamVideoControlsDirective.html","title":"directive - StreamVideoControlsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n StreamVideoControlsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/stream.directive.ts\n \n\n\n \n Description\n \n \n The videoControls directive allows show/hide the participants video controls in stream component.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the stream component:\nExample :And it also can be used in the StreamComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[streamVideoControls], ov-stream[videoControls]\n \n\n\n\n\n \n \n \n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n Public\n elementRef\n \n \n videoControlsValue\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n clear\n \n \n update\n \n \n \n \n\n \n \n Inputs\n \n \n \n \n \n \n streamVideoControls\n \n \n videoControls\n \n \n \n \n\n\n\n\n \n \n Accessors\n \n \n \n \n \n \n streamVideoControls\n \n \n videoControls\n \n \n \n \n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(elementRef: ElementRef, libService: OpenViduComponentsConfigService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n elementRef\n \n \n ElementRef\n \n \n \n No\n \n \n \n \n libService\n \n \n OpenViduComponentsConfigService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n Inputs\n \n \n \n \n \n streamVideoControls\n \n \n \n \n Type : boolean\n\n \n \n \n \n \n \n \n \n \n videoControls\n \n \n \n \n Type : boolean\n\n \n \n \n \n\n\n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n clear\n \n \n \n \n \n \nclear()\n \n \n\n\n\n\n \n \n\n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n update\n \n \n \n \n \n \nupdate(value: boolean)\n \n \n\n\n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n boolean\n \n\n \n No\n \n\n\n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n Public\n elementRef\n \n \n \n \n \n \n Type : ElementRef\n\n \n \n\n\n \n \n \n \n \n \n \n \n videoControlsValue\n \n \n \n \n \n \n Type : boolean\n\n \n \n\n\n \n \n\n\n \n \n Accessors\n \n \n \n \n \n \n streamVideoControls\n \n \n\n\n \n \n setstreamVideoControls(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n videoControls\n \n \n\n\n \n \n setvideoControls(value: boolean)\n \n \n \n \n\n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n value\n \n \n boolean\n \n \n \n No\n \n \n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/TokenDirective.html":{"url":"directives/TokenDirective.html","title":"directive - TokenDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n TokenDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The token directive sets the token to grant a participant access to a Room.\nThis OpenVidu token will be use by each participant when connecting to a Room.\nIt is only available for VideoconferenceComponent.\n Default: \"\"\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[token]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/TokenErrorDirective.html":{"url":"directives/TokenErrorDirective.html","title":"directive - TokenErrorDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n TokenErrorDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The tokenError directive allows to display an error message in case of issues during token request.\nIt is only available for VideoconferenceComponent.\n Default: undefined\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[tokenError]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarActivitiesPanelButtonDirective.html":{"url":"directives/ToolbarActivitiesPanelButtonDirective.html","title":"directive - ToolbarActivitiesPanelButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarActivitiesPanelButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The activitiesPanelButton directive allows show/hide the activities panel toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarAdditionalButtonsDirective.html":{"url":"directives/ToolbarAdditionalButtonsDirective.html","title":"directive - ToolbarAdditionalButtonsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarAdditionalButtonsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovToolbarAdditionalButtons directive enables the addition of extra buttons to the central button group within the toolbar.\nIn the following example, we've included the same buttons as those in the ToolbarDirective. Additionally, we utilize the ParticipantService to assess audio and video statuses.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n ParticipantService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n videocam\n \n \n mic\n \n \n \n `,\n styles: [],\n standalone: true,\n imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // The name of the room for the video conference.\n roomName = 'toolbar-additionalbtn';\n\n // The token used to authenticate the user in the video conference.\n token!: string;\n\n constructor(\n private httpClient: HttpClient,\n private participantService: ParticipantService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Called when the token is requested.\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Toggles the camera on/off.\n async toggleVideo() {\n const isCameraEnabled = this.participantService.isMyCameraEnabled();\n await this.participantService.setCameraEnabled(!isCameraEnabled);\n }\n\n // Toggles the microphone on/off.\n async toggleAudio() {\n const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n }\n\n // Retrieves a token from the server to authenticate the user.\n getToken(roomName: string, participantName: string): Promise {\n try {\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n if (error.status === 404) {\n throw {\n status: error.status,\n message: 'Cannot connect with backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nTo follow a step-by-step tutorial on this feature, please visit this link.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovToolbarAdditionalButtons]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarAdditionalButtonsPossitionDirective.html":{"url":"directives/ToolbarAdditionalButtonsPossitionDirective.html","title":"directive - ToolbarAdditionalButtonsPossitionDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarAdditionalButtonsPossitionDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The ovToolbarAdditionalButtonsPosition defines the position where the additional buttons should be inserted.\nThe possible values are: ToolbarAdditionalButtonsPosition\nDefault: afterMenu\nIt can be used in the any element which contains the structural directive ToolbarAdditionalButtonsDirective.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n [ovToolbarAdditionalButtonsPosition]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarAdditionalPanelButtonsDirective.html":{"url":"directives/ToolbarAdditionalPanelButtonsDirective.html","title":"directive - ToolbarAdditionalPanelButtonsDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarAdditionalPanelButtonsDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovToolbarAdditionalPanelButtons directive allows to add additional panel buttons to the toolbar.\nIn the example below we've added a simple button without any functionality. To learn how to toggle the panel check the AdditionalPanelsDirective.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n \n star\n \n \n \n `,\n styles: [],\n standalone: true,\n imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n\n // Set the room name\n roomName = 'toolbar-additional-panel-btn';\n\n // Initialize the token variable\n token!: string;\n\n constructor(private httpClient: HttpClient) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Method to request a token for a participant\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Method to handle button click\n onButtonClicked() {\n alert('button clicked');\n }\n\n // Method to get a token from the backend\n getToken(roomName: string, participantName: string): Promise {\n try {\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n if (error.status === 404) {\n throw {\n status: error.status,\n message: 'Cannot connect with backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nYou can run the associated tutorial here.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovToolbarAdditionalPanelButtons]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarBackgroundEffectsButtonDirective.html":{"url":"directives/ToolbarBackgroundEffectsButtonDirective.html","title":"directive - ToolbarBackgroundEffectsButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarBackgroundEffectsButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The backgroundEffectsButton directive allows show/hide the background effects toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarBroadcastingButtonDirective.html":{"url":"directives/ToolbarBroadcastingButtonDirective.html","title":"directive - ToolbarBroadcastingButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarBroadcastingButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The broadcastingButton directive allows show/hide the start/stop broadcasting toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarChatPanelButtonDirective.html":{"url":"directives/ToolbarChatPanelButtonDirective.html","title":"directive - ToolbarChatPanelButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarChatPanelButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The chatPanelButton directive allows show/hide the chat panel toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/ToolbarComponent.html":{"url":"components/ToolbarComponent.html","title":"component - ToolbarComponent","body":"\n \n\n\n\n\n\n Components\n \n ToolbarComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/toolbar/toolbar.component.ts\n\n\n\n \n Description\n \n \n The ToolbarComponent is hosted inside of the VideoconferenceComponent.\nIt is in charge of displaying the participants controlls for handling the media, panels and more videoconference features.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n AfterViewInit\n \n\n\n\n Metadata\n \n \n\n \n changeDetection\n ChangeDetectionStrategy.OnPush\n \n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-toolbar\n \n\n\n\n \n styleUrls\n ./toolbar.component.scss\n \n\n\n\n \n templateUrl\n ./toolbar.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onAudioEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onBroadcastingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop broadcasting has been requested.\nIt provides the BroadcastingStopRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onFullscreenEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onRecordingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the user clicks on the start recording button.\nIt provides the RecordingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop recording has been requested.\nIt provides the RecordingStopRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRoomDisconnected\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the room has been disconnected.\n\n \n \n \n \n \n \n \n \n \n onScreenShareEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onVideoEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\n \n \n \n \n\n\n\n\n\n\n\n \n \n\n\nStructural Directives\nWith these kind of directives you can replace the default ToolbarComponent with your own component. You can also add your own components to the default ones.\n\n\n\nDirective\nReference\n\n\n\n\n*ovToolbar\nToolbarDirective\n\n\n\nIt is also providing us a way to add additional buttons to the default toolbar.\nIt will recognise the following directive in a child element.\n\n\n\nDirective\nReference\n\n\n\n\n*ovToolbarAdditionalButtons\nToolbarAdditionalButtonsDirective\n\n\n*ovToolbarAdditionalPanelButtons\nToolbarAdditionalPanelButtonsDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nscreenshareButton\nboolean\nToolbarScreenshareButtonDirective\n\n\nrecordingButton\nboolean\nToolbarRecordingButtonDirective\n\n\nbroadcastingButton\nboolean\nToolbarBroadcastingButtonDirective\n\n\nfullscreenButton\nboolean\nToolbarFullscreenButtonDirective\n\n\nbackgroundEffectsButton\nboolean\nToolbarBackgroundEffectsButtonDirective\n\n\nsettingsButton\nboolean\nToolbarSettingsButtonDirective\n\n\nleaveButton\nboolean\nToolbarLeaveButtonDirective\n\n\nparticipantsPanelButton\nboolean\nToolbarParticipantsPanelButtonDirective\n\n\nchatPanelButton\nboolean\nToolbarChatPanelButtonDirective\n\n\nactivitiesPanelButton\nboolean\nToolbarActivitiesPanelButtonDirective\n\n\ndisplayRoomName\nboolean\nToolbarDisplayRoomNameDirective\n\n\ndisplayLogo\nboolean\nToolbarDisplayLogoDirective\n\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ room.name }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tradio_button_checked\t\t\t\t\t\tREC\t\t\t\t\t\t | {{ recordingTime | date: \\'H:mm:ss\\' }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsensors\t\t\t\t\t\tLIVE\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t videocam \t\t\t videocam_off \t\t\t\t\t\t\t\t\t mic \t\t\t mic_off \t\t\t\t\t\t\t\t\tscreen_share\t\t\t\t\t\t\t\t\tscreen_share\t\t\t\t\t\t\t\t\t\t\tpicture_in_picture\t\t\t\t{{ \\'STREAM.REPLACE_SCREEN\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\tstop_screen_share\t\t\t\t{{ \\'TOOLBAR.DISABLE_SCREEN\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmore_vert\t\t\t\t\t\t\t\t\t\t\t\t\t\tfullscreen\t\t\t\t{{ \\'TOOLBAR.FULLSCREEN\\' | translate }}\t\t\t\tfullscreen_exit\t\t\t\t{{ \\'TOOLBAR.EXIT_FULLSCREEN\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\tradio_button_checked\t\t\t\t\t\t\t\t\t{{ \\'TOOLBAR.START_RECORDING\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'TOOLBAR.STOP_RECORDING\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsensors\t\t\t\t\t\t\t\t\t{{ \\'PANEL.STREAMING.START\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t{{ \\'PANEL.STREAMING.STOP\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t background_replace \t\t\t\t{{ \\'TOOLBAR.BACKGROUND\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\tclosed_caption\t\t\t\t{{ \\'TOOLBAR.DISABLE_CAPTIONS\\' | translate }}\t\t\t\t{{ \\'TOOLBAR.ENABLE_CAPTIONS\\' | translate }}\t\t\t -->\t\t\t\t\t\t\t\t\t\t\t\t\tsettings\t\t\t\t{{ \\'TOOLBAR.SETTINGS\\' | translate }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcall_end\t\t\t\t\t\t\t\t\t\t\tcategory\t\t\t\t\t\t\t\t\tpeople\t\t\t\t\t\t\t\t\t\t\t\t\tchat\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'ToolbarComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarDirective.html":{"url":"directives/ToolbarDirective.html","title":"directive - ToolbarDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts\n \n\n\n \n Description\n \n \n The *ovToolbar directive allows to replace the default toolbar component with a custom one.\nIn the example below we've replaced the default toolbar and added the toggleAudio and toggleVideo buttons.\nHere we are using the ParticipantService for enabling/disabling the audio and video.\n\nExample :import { HttpClient } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n ParticipantService,\n OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n selector: 'app-root',\n template: `\n \n \n Toggle Video\n Toggle Audio\n \n \n `,\n standalone: true,\n imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n // For local development, leave these variables empty\n // For production, configure them with correct URLs depending on your deployment\n\n APPLICATION_SERVER_URL = '';\n LIVEKIT_URL = '';\n // The name of the room.\n roomName = 'custom-toolbar';\n\n // The token used to connect to the videoconference.\n token!: string;\n\n constructor(\n private httpClient: HttpClient,\n private participantService: ParticipantService\n ) {\n this.configureUrls();\n }\n\n private configureUrls() {\n // If APPLICATION_SERVER_URL is not configured, use default value from local development\n if (!this.APPLICATION_SERVER_URL) {\n if (window.location.hostname === 'localhost') {\n this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n } else {\n this.APPLICATION_SERVER_URL =\n 'https://' + window.location.hostname + ':6443/';\n }\n }\n\n // If LIVEKIT_URL is not configured, use default value from local development\n if (!this.LIVEKIT_URL) {\n if (window.location.hostname === 'localhost') {\n this.LIVEKIT_URL = 'ws://localhost:7880/';\n } else {\n this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n }\n }\n }\n\n // Called when a token is requested for a participant.\n async onTokenRequested(participantName: string) {\n const { token } = await this.getToken(this.roomName, participantName);\n this.token = token;\n }\n\n // Toggles the camera on and off.\n async toggleVideo() {\n const isCameraEnabled = this.participantService.isMyCameraEnabled();\n await this.participantService.setCameraEnabled(!isCameraEnabled);\n }\n\n // Toggles the microphone on and off.\n async toggleAudio() {\n const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n }\n\n // Gets a token for a participant.\n getToken(roomName: string, participantName: string): Promise {\n try {\n return lastValueFrom(\n this.httpClient.post(this.APPLICATION_SERVER_URL + 'token', {\n roomName,\n participantName,\n })\n );\n } catch (error: any) {\n if (error.status === 404) {\n throw {\n status: error.status,\n message: 'Cannot connect with backend. ' + error.url + ' not found',\n };\n }\n throw error;\n }\n }\n}\n\n\nYou can run the associated tutorial here.\n\n \n\n\n\n\n \n Metadata\n \n \n\n \n Selector\n [ovToolbar]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarDisplayLogoDirective.html":{"url":"directives/ToolbarDisplayLogoDirective.html","title":"directive - ToolbarDisplayLogoDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarDisplayLogoDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The displayLogo directive allows show/hide the branding logo.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarDisplayRoomNameDirective.html":{"url":"directives/ToolbarDisplayRoomNameDirective.html","title":"directive - ToolbarDisplayRoomNameDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarDisplayRoomNameDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The displayRoomName directive allows show/hide the room name.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarFullscreenButtonDirective.html":{"url":"directives/ToolbarFullscreenButtonDirective.html","title":"directive - ToolbarFullscreenButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarFullscreenButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The fullscreenButton directive allows show/hide the fullscreen toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarLeaveButtonDirective.html":{"url":"directives/ToolbarLeaveButtonDirective.html","title":"directive - ToolbarLeaveButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarLeaveButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The leaveButton directive allows show/hide the leave toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarParticipantsPanelButtonDirective.html":{"url":"directives/ToolbarParticipantsPanelButtonDirective.html","title":"directive - ToolbarParticipantsPanelButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarParticipantsPanelButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The participantsPanelButton directive allows show/hide the participants panel toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarRecordingButtonDirective.html":{"url":"directives/ToolbarRecordingButtonDirective.html","title":"directive - ToolbarRecordingButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarRecordingButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The recordingButton directive allows show/hide the start/stop recording toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarScreenshareButtonDirective.html":{"url":"directives/ToolbarScreenshareButtonDirective.html","title":"directive - ToolbarScreenshareButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarScreenshareButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The screenshareButton directive allows show/hide the screenshare toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/ToolbarSettingsButtonDirective.html":{"url":"directives/ToolbarSettingsButtonDirective.html","title":"directive - ToolbarSettingsButtonDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n ToolbarSettingsButtonDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/toolbar.directive.ts\n \n\n\n \n Description\n \n \n The settingsButton directive allows show/hide the settings toolbar button.\nDefault: true\nIt can be used in the parent element VideoconferenceComponent specifying the name of the toolbar component:\nExample :And it also can be used in the ToolbarComponent.\nExample :\n \n\n\n \n Implements\n \n \n AfterViewInit\n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"injectables/TranslateService.html":{"url":"injectables/TranslateService.html","title":"injectable - TranslateService","body":"\n \n\n\n\n\n\n\n\n\n\n Injectables\n TranslateService\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/services/translate/translate.service.ts\n \n\n\n \n Description\n \n \n Service responsible for managing translations for the application.\nThis service provides methods to add additional translations and to translate keys into the currently selected language.\nThe pipe TranslatePipe is used to translate keys in the templates.\n\n \n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n selectedLanguageOption$\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n addTranslations\n \n \n getAvailableLanguages\n \n \n translate\n \n \n \n \n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \nconstructor(storageService: StorageService)\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n storageService\n \n \n StorageService\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n addTranslations\n \n \n \n \n \n \naddTranslations(translations: Partial)\n \n \n\n\n\n\n \n \n Adds multiple translations to the additional translations storage.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n Description\n \n \n \n \n translations\n \n Partial\n \n\n \n No\n \n\n\n \n \nA record where each key is a language code and the value is an object of translations for that language.\n\n\n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n getAvailableLanguages\n \n \n \n \n \n \ngetAvailableLanguages()\n \n \n\n\n\n\n \n \n Retrieves the list of all available language options.\n\n\n \n Returns : LangOption[]\n\n \n \n An array of available language options.\n\n \n \n \n \n \n \n \n \n \n \n \n translate\n \n \n \n \n \n \ntranslate(key: string)\n \n \n\n\n\n\n \n \n Translates a given key into the current language.\nThis method first attempts to find the translation in the official translations.\nIf the translation is not found, it then looks for the translation in the additional translations registered by the app.\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n Description\n \n \n \n \n key\n \n string\n \n\n \n No\n \n\n\n \n \nThe key to be translated.\n\n\n \n \n \n \n \n \n Returns : string\n\n \n \n The translated string if found, otherwise an empty string.\n\n \n \n \n \n \n\n \n \n \n Properties\n \n \n \n \n \n \n \n selectedLanguageOption$\n \n \n \n \n \n \n Type : Observable\n\n \n \n\n\n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"directives/VideoEnabledDirective.html":{"url":"directives/VideoEnabledDirective.html","title":"directive - VideoEnabledDirective","body":"\n \n\n\n\n\n\n\n\n\n Directives\n VideoEnabledDirective\n\n\n\n \n Info\n \n\n\n\n \n \n File\n \n \n projects/openvidu-components-angular/src/lib/directives/api/videoconference.directive.ts\n \n\n\n \n Description\n \n \n The videoEnabled directive allows to join the room with camera enabled or disabled.\nIt is only available for VideoconferenceComponent.\nDefault: true\nExample :\n \n\n\n \n Implements\n \n \n OnDestroy\n \n\n\n \n Metadata\n \n \n\n \n Selector\n ov-videoconference[videoEnabled]\n \n\n\n\n\n \n \n \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"components/VideoconferenceComponent.html":{"url":"components/VideoconferenceComponent.html","title":"component - VideoconferenceComponent","body":"\n \n\n\n\n\n\n Components\n \n VideoconferenceComponent\n\n\n\n \n Info\n \n \n Directives\n \n\n\n\n \n File\n\n\n projects/openvidu-components-angular/src/lib/components/videoconference/videoconference.component.ts\n\n\n\n \n Description\n \n \n The VideoconferenceComponent is the parent of all OpenVidu components.\nIt allow us to create a modern, useful and powerful videoconference apps with ease.\n\n \n\n\n \n Implements\n \n \n OnInit\n OnDestroy\n AfterViewInit\n \n\n\n\n Metadata\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n \n selector\n ov-videoconference\n \n\n\n\n \n styleUrls\n ./videoconference.component.scss\n \n\n\n\n \n templateUrl\n ./videoconference.component.html\n \n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n \n Outputs\n \n \n \n \n \n onActivitiesPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the activities panel status has been changed.\nIt provides the new status of the activities panel as ActivitiesPanelStatusEvent payload.\n\n \n \n \n \n \n \n \n \n \n onAudioDeviceChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the selected audio device changes, providing information about the new custom device that has been selected.\n\n \n \n \n \n \n \n \n \n \n onAudioEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the audio state changes, providing information about if the audio is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onBroadcastingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when start broadcasting button is clicked.\nIt provides the BroadcastingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onBroadcastingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop broadcasting button is clicked.\nIt provides the BroadcastingStopRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onChatPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the chat panel status has been changed.\nIt provides the new status of the chat panel as ChatPanelStatusEvent payload.\n\n \n \n \n \n \n \n \n \n \n onFullscreenEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n The event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onLangChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the language changes, providing information about the new language that has been selected.\n\n \n \n \n \n \n \n \n \n \n onParticipantCreated\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when local participant is created.\nIt provides the ParticipantModel payload as event data.\n\n \n \n \n \n \n \n \n \n \n onParticipantsPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the participants panel status has been changed.\nIt provides the new status of the participants panel as ParticipantsPanelStatusEvent payload.\n\n \n \n \n \n \n \n \n \n \n onReadyToJoin\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when the participant is ready to join to the room. This event is only emitted when the prejoin page has been shown.\n\n \n \n \n \n \n \n \n \n \n onRecordingDeleteRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when delete recording button has been clicked.\nIt provides the RecordingDeleteRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingDownloadClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when download recording button is clicked from ActivitiesPanelComponent.\nIt provides the RecordingDownloadClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingPlayClicked\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when play recording button is clicked from ActivitiesPanelComponent.\nIt provides the RecordingPlayClickedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStartRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the user clicks on the start recording button.\nIt provides the RecordingStartRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRecordingStopRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when stop recording button has been clicked.\nIt provides the RecordingStopRequestedEvent payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRoomCreated\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when OpenVidu Room is created.\nIt provides the Room payload as event data.\n\n \n \n \n \n \n \n \n \n \n onRoomDisconnected\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when the room has been disconnected.\n\n \n \n \n \n \n \n \n \n \n onScreenShareEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).\n\n \n \n \n \n \n \n \n \n \n onSettingsPanelStatusChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is fired when the settings panel status has been changed.\nIt provides the new status of the settings panel as SettingsPanelStatusEvent payload.\n\n \n \n \n \n \n \n \n \n \n onTokenRequested\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n Provides event notifications that fire when videconference is ready to received the token.\nThis event emits the participant name as data.\n\n \n \n \n \n \n \n \n \n \n onVideoDeviceChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the selected video device changes, providing information about the new custom device that has been selected.\n\n \n \n \n \n \n \n \n \n \n onVideoEnabledChanged\n \n \n \n \n Type : EventEmitter\n\n \n \n \n \n This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\n \n \n \n \n\n\n\n\n\n\n\n \n \n\nStructural Directives\nThe VideoconferenceComponent also offers the option to tailor the default templates to your preferences using a custom template.\n\n\n\nDirective\nReference\n\n\n\n\n*ovToolbar\nToolbarDirective\n\n\n*ovToolbarAdditionalButtons\nToolbarAdditionalButtonsDirective\n\n\n*ovToolbarAdditionalPanelButtons\nToolbarAdditionalPanelButtonsDirective\n\n\n*ovPanel\nPanelDirective\n\n\n*ovAdditionalPanels\nAdditionalPanelsDirective\n\n\n*ovChatPanel\nChatPanelDirective\n\n\n*ovParticipantsPanel\nParticipantsPanelDirective\n\n\n*ovParticipantPanelItem\nParticipantPanelItemDirective\n\n\n*ovParticipantPanelItemElements\nParticipantPanelItemElementsDirective\n\n\n*ovLayout\nLayoutDirective\n\n\n*ovStream\nStreamDirective\n\n\n\n\n\nAPI Directives\nWith the following directives you can modify the default User Interface with the aim of fully customizing your videoconference application.\n\n\n\n\nParameter\nType\nReference\n\n\n\n\nlivekitUrl\nstring\nLivekitUrlDirective\n\n\ntoken\nstring\nTokenDirective\n\n\ntokenError\nany\nTokenErrorDirective\n\n\nminimal\nboolean\nMinimalDirective\n\n\nlang\nstring\nLangDirective\n\n\nlangOptions\nLangOption\nLangOptionsDirective\n\n\nparticipantName\nstring\nParticipantNameDirective\n\n\nprejoin\nboolean\nPrejoinDirective\n\n\nvideoEnabled\nboolean\nVideoEnabledDirective\n\n\naudioEnabled\nboolean\nAudioEnabledDirective\n\n\ntoolbarScreenshareButton\nboolean\nToolbarScreenshareButtonDirective\n\n\ntoolbarRecordingButton\nboolean\nToolbarRecordingButtonDirective\n\n\ntoolbarBroadcastingButton\nboolean\nToolbarBroadcastingButtonDirective\n\n\ntoolbarFullscreenButton\nboolean\nToolbarFullscreenButtonDirective\n\n\ntoolbarBackgroundEffectsButton\nboolean\nToolbarBackgroundEffectsButtonDirective\n\n\ntoolbarSettingsButton\nboolean\nToolbarSettingsButtonDirective\n\n\ntoolbarLeaveButton\nboolean\nToolbarLeaveButtonDirective\n\n\ntoolbarParticipantsPanelButton\nboolean\nToolbarParticipantsPanelButtonDirective\n\n\ntoolbarChatPanelButton\nboolean\nToolbarChatPanelButtonDirective\n\n\ntoolbarActivitiesPanelButton\nboolean\nToolbarActivitiesPanelButtonDirective\n\n\ntoolbarDisplayRoomName\nboolean\nToolbarDisplayRoomNameDirective\n\n\ntoolbarDisplayLogo\nboolean\nToolbarDisplayLogoDirective\n\n\nstreamDisplayParticipantName\nboolean\nStreamDisplayParticipantNameDirective\n\n\nstreamDisplayAudioDetection\nboolean\nStreamDisplayAudioDetectionDirective\n\n\nstreamVideoControls\nboolean\nStreamVideoControlsDirective\n\n\nparticipantPanelItemMuteButton\nboolean\nParticipantPanelItemMuteButtonDirective\n\n\nactivitiesPanelRecordingActivity\nboolean\nActivitiesPanelRecordingActivityDirective\n\n\nactivitiesPanelBroadcastingActivity\nboolean\nActivitiesPanelBroadcastingActivityDirective\n\n\n\n\n \n\n\n\n\n\n \n\n\n\n\n\n\n var COMPONENT_TEMPLATE = '\t\t\t\t\t{{ \\'PREJOIN.PREPARING\\' | translate }}\t\t\t\t\t\t\t\terror\t\t{{ errorMessage }}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'\n var COMPONENTS = [{'name': 'ActivitiesPanelComponent', 'selector': 'ov-activities-panel'},{'name': 'AdminDashboardComponent', 'selector': 'ov-admin-dashboard'},{'name': 'AdminLoginComponent', 'selector': 'ov-admin-login'},{'name': 'BroadcastingActivityComponent', 'selector': 'ov-broadcasting-activity'},{'name': 'ChatPanelComponent', 'selector': 'ov-chat-panel'},{'name': 'LayoutComponent', 'selector': 'ov-layout'},{'name': 'PanelComponent', 'selector': 'ov-panel'},{'name': 'ParticipantPanelItemComponent', 'selector': 'ov-participant-panel-item'},{'name': 'ParticipantsPanelComponent', 'selector': 'ov-participants-panel'},{'name': 'RecordingActivityComponent', 'selector': 'ov-recording-activity'},{'name': 'StreamComponent', 'selector': 'ov-stream'},{'name': 'ToolbarComponent', 'selector': 'ov-toolbar'},{'name': 'VideoconferenceComponent', 'selector': 'ov-videoconference'}];\n var DIRECTIVES = [{'name': 'ActivitiesPanelBroadcastingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]'},{'name': 'ActivitiesPanelDirective', 'selector': '[ovActivitiesPanel]'},{'name': 'ActivitiesPanelRecordingActivityDirective', 'selector': 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]'},{'name': 'AdditionalPanelsDirective', 'selector': '[ovAdditionalPanels]'},{'name': 'AdminDashboardRecordingsListDirective', 'selector': 'ov-admin-dashboard[recordingsList]'},{'name': 'AdminDashboardTitleDirective', 'selector': 'ov-admin-dashboard[navbarTitle]'},{'name': 'AdminLoginErrorDirective', 'selector': 'ov-admin-login[error]'},{'name': 'AdminLoginTitleDirective', 'selector': 'ov-admin-login[navbarTitle]'},{'name': 'AudioEnabledDirective', 'selector': 'ov-videoconference[audioEnabled]'},{'name': 'ChatPanelDirective', 'selector': '[ovChatPanel]'},{'name': 'LangDirective', 'selector': 'ov-videoconference[lang]'},{'name': 'LangOptionsDirective', 'selector': 'ov-videoconference[langOptions]'},{'name': 'LayoutDirective', 'selector': '[ovLayout]'},{'name': 'LivekitUrlDirective', 'selector': 'ov-videoconference[livekitUrl]'},{'name': 'MinimalDirective', 'selector': 'ov-videoconference[minimal]'},{'name': 'PanelDirective', 'selector': '[ovPanel]'},{'name': 'ParticipantNameDirective', 'selector': 'ov-videoconference[participantName]'},{'name': 'ParticipantPanelItemDirective', 'selector': '[ovParticipantPanelItem]'},{'name': 'ParticipantPanelItemElementsDirective', 'selector': '[ovParticipantPanelItemElements]'},{'name': 'ParticipantPanelItemMuteButtonDirective', 'selector': 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'},{'name': 'ParticipantsPanelDirective', 'selector': '[ovParticipantsPanel]'},{'name': 'PrejoinDirective', 'selector': 'ov-videoconference[prejoin]'},{'name': 'StreamDirective', 'selector': '[ovStream]'},{'name': 'StreamDisplayAudioDetectionDirective', 'selector': 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]'},{'name': 'StreamDisplayParticipantNameDirective', 'selector': 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]'},{'name': 'StreamVideoControlsDirective', 'selector': 'ov-videoconference[streamVideoControls], ov-stream[videoControls]'},{'name': 'TokenDirective', 'selector': 'ov-videoconference[token]'},{'name': 'TokenErrorDirective', 'selector': 'ov-videoconference[tokenError]'},{'name': 'ToolbarActivitiesPanelButtonDirective', 'selector': 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]'},{'name': 'ToolbarAdditionalButtonsDirective', 'selector': '[ovToolbarAdditionalButtons]'},{'name': 'ToolbarAdditionalButtonsPossitionDirective', 'selector': '[ovToolbarAdditionalButtonsPosition]'},{'name': 'ToolbarAdditionalPanelButtonsDirective', 'selector': '[ovToolbarAdditionalPanelButtons]'},{'name': 'ToolbarBackgroundEffectsButtonDirective', 'selector': 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]'},{'name': 'ToolbarBroadcastingButtonDirective', 'selector': 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]'},{'name': 'ToolbarChatPanelButtonDirective', 'selector': 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]'},{'name': 'ToolbarDirective', 'selector': '[ovToolbar]'},{'name': 'ToolbarDisplayLogoDirective', 'selector': 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]'},{'name': 'ToolbarDisplayRoomNameDirective', 'selector': 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]'},{'name': 'ToolbarFullscreenButtonDirective', 'selector': 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]'},{'name': 'ToolbarLeaveButtonDirective', 'selector': 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]'},{'name': 'ToolbarParticipantsPanelButtonDirective', 'selector': 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]'},{'name': 'ToolbarRecordingButtonDirective', 'selector': 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]'},{'name': 'ToolbarScreenshareButtonDirective', 'selector': 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]'},{'name': 'ToolbarSettingsButtonDirective', 'selector': 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]'},{'name': 'VideoEnabledDirective', 'selector': 'ov-videoconference[videoEnabled]'}];\n var ACTUAL_COMPONENT = {'name': 'VideoconferenceComponent'};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/enumerations.html":{"url":"miscellaneous/enumerations.html","title":"miscellaneous-enumerations - enumerations","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Enumerations\n\n\n\n Index\n \n \n \n \n \n \n BroadcastingStatus   (projects/.../broadcasting.model.ts)\n \n \n PanelType   (projects/.../panel.model.ts)\n \n \n RecordingOutputMode   (projects/.../recording.model.ts)\n \n \n RecordingStatus   (projects/.../recording.model.ts)\n \n \n ToolbarAdditionalButtonsPosition   (projects/.../toolbar.model.ts)\n \n \n \n \n \n \n\n\n projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts\n \n \n \n \n \n \n BroadcastingStatus\n \n \n \n \n Enum representing the possible status of a broadcast\n\n \n \n \n \n  STARTING\n \n \n \n \n Value : STARTING\n \n \n \n \n  STARTED\n \n \n \n \n Value : STARTED\n \n \n \n \n  STOPPING\n \n \n \n \n Value : STOPPING\n \n \n \n \n  STOPPED\n \n \n \n \n Value : STOPPED\n \n \n \n \n  FAILED\n \n \n \n \n Value : FAILED\n \n \n \n \n\n projects/openvidu-components-angular/src/lib/models/panel.model.ts\n \n \n \n \n \n \n PanelType\n \n \n \n \n Interface representing the different types of panels\n\n \n \n \n \n  CHAT\n \n \n \n \n Value : chat\n \n \n \n \n  PARTICIPANTS\n \n \n \n \n Value : participants\n \n \n \n \n  BACKGROUND_EFFECTS\n \n \n \n \n Value : background-effects\n \n \n \n \n  ACTIVITIES\n \n \n \n \n Value : activities\n \n \n \n \n  SETTINGS\n \n \n \n \n Value : settings\n \n \n \n \n\n projects/openvidu-components-angular/src/lib/models/recording.model.ts\n \n \n \n \n \n \n RecordingOutputMode\n \n \n \n \n  COMPOSED\n \n \n \n \n Value : COMPOSED\n \n \n \n \n  INDIVIDUAL\n \n \n \n \n Value : INDIVIDUAL\n \n \n \n \n \n \n \n \n \n RecordingStatus\n \n \n \n \n Enum representing the possible status of a recording\n\n \n \n \n \n  STARTING\n \n \n \n \n Value : STARTING\n \n \n \n \n  STARTED\n \n \n \n \n Value : STARTED\n \n \n \n \n  STOPPING\n \n \n \n \n Value : STOPPING\n \n \n \n \n  STOPPED\n \n \n \n \n Value : STOPPED\n \n \n \n \n  FAILED\n \n \n \n \n Value : FAILED\n \n \n \n \n  READY\n \n \n \n \n Value : READY\n \n \n \n \n\n projects/openvidu-components-angular/src/lib/models/toolbar.model.ts\n \n \n \n \n \n \n ToolbarAdditionalButtonsPosition\n \n \n \n \n Enum representing the position of additional buttons in a toolbar.\n\n \n \n \n \n  BEFORE_MENU\n \n \n \n \n Value : beforeMenu\n \n \n \n \n  AFTER_MENU\n \n \n \n \n Value : afterMenu\n \n \n \n \n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"index.html":{"url":"index.html","title":"getting-started - index","body":"\n \n\nWelcome to OpenVidu Components Angular\nBuild powerful video conferencing applications with ease using OpenVidu Components Angular.\nIntroduction\nAngular Components are the simplest way to create real-time videoconferencing apps with Angular. There's no need to manage state or low-level events; Angular Components from OpenVidu handle all the complexity for you.\nGetting Started\nTo get started with OpenVidu Components Angular, visit our Getting Started guide.\n\nCreate an Angular Project (>= 17.0.0)\nExample :ng new your-project-name\nAdd Angular Material to your project\nExample :ng add @angular/material\nInstall OpenVidu Components Angular\nExample :npm install openvidu-components-angular\nImport and use OpenVidu Components Angular\nExample :import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\n// Other imports ...\n\nconst config: OpenViduComponentsConfig = {\n production: environment.production\n};\n\nbootstrapApplication(AppComponent, {\n providers: [\n importProvidersFrom(\n OpenViduComponentsModule.forRoot(config)\n // Other imports ...\n ),\n provideAnimations()\n ]\n}).catch((err) => console.error(err));\n\nYou can also customize the styles in your styles.scss file:\nExample ::root {\n --ov-primary-color: #303030;\n --ov-secondary-color: #3e3f3f;\n --ov-tertiary-color: #598eff;\n --ov-warn-color: #eb5144;\n --ov-accent-color: #ffae35;\n --ov-light-color: #e6e6e6;\n\n --ov-logo-background-color: #3a3d3d;\n\n --ov-text-color: #ffffff;\n\n --ov-panel-text-color: #1d1d1d;\n --ov-panel-background: #ffffff;\n\n --ov-buttons-radius: 50%;\n --ov-leave-button-radius: 10px;\n --ov-video-radius: 5px;\n --ov-panel-radius: 5px;\n}Usage\nExample :\nAPI Documentation\nFor detailed information on OpenVidu Angular Components, refer to our API Reference.\nSupport\nIf you have any questions or need assistance, please reach out to our Support page.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"license.html":{"url":"license.html","title":"getting-started - license","body":"\n \n\nExample : Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\nDefinitions.\n\"License\" shall mean the terms and conditions for use, reproduction,\nand distribution as defined by Sections 1 through 9 of this document.\n\"Licensor\" shall mean the copyright owner or entity authorized by\nthe copyright owner that is granting the License.\n\"Legal Entity\" shall mean the union of the acting entity and all\nother entities that control, are controlled by, or are under common\ncontrol with that entity. For the purposes of this definition,\n\"control\" means (i) the power, direct or indirect, to cause the\ndirection or management of such entity, whether by contract or\notherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\"You\" (or \"Your\") shall mean an individual or Legal Entity\nexercising permissions granted by this License.\n\"Source\" form shall mean the preferred form for making modifications,\nincluding but not limited to software source code, documentation\nsource, and configuration files.\n\"Object\" form shall mean any form resulting from mechanical\ntransformation or translation of a Source form, including but\nnot limited to compiled object code, generated documentation,\nand conversions to other media types.\n\"Work\" shall mean the work of authorship, whether in Source or\nObject form, made available under the License, as indicated by a\ncopyright notice that is included in or attached to the work\n(an example is provided in the Appendix below).\n\"Derivative Works\" shall mean any work, whether in Source or Object\nform, that is based on (or derived from) the Work and for which the\neditorial revisions, annotations, elaborations, or other modifications\nrepresent, as a whole, an original work of authorship. For the purposes\nof this License, Derivative Works shall not include works that remain\nseparable from, or merely link (or bind by name) to the interfaces of,\nthe Work and Derivative Works thereof.\n\"Contribution\" shall mean any work of authorship, including\nthe original version of the Work and any modifications or additions\nto that Work or Derivative Works thereof, that is intentionally\nsubmitted to Licensor for inclusion in the Work by the copyright owner\nor by an individual or Legal Entity authorized to submit on behalf of\nthe copyright owner. For the purposes of this definition, \"submitted\"\nmeans any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems,\nand issue tracking systems that are managed by, or on behalf of, the\nLicensor for the purpose of discussing and improving the Work, but\nexcluding communication that is conspicuously marked or otherwise\ndesignated in writing by the copyright owner as \"Not a Contribution.\"\n\"Contributor\" shall mean Licensor and any individual or Legal Entity\non behalf of whom a Contribution has been received by Licensor and\nsubsequently incorporated within the Work.\n\nGrant of Copyright License. Subject to the terms and conditions of\nthis License, each Contributor hereby grants to You a perpetual,\nworldwide, non-exclusive, no-charge, royalty-free, irrevocable\ncopyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the\nWork and such Derivative Works in Source or Object form.\n\nGrant of Patent License. Subject to the terms and conditions of\nthis License, each Contributor hereby grants to You a perpetual,\nworldwide, non-exclusive, no-charge, royalty-free, irrevocable\n(except as stated in this section) patent license to make, have made,\nuse, offer to sell, sell, import, and otherwise transfer the Work,\nwhere such license applies only to those patent claims licensable\nby such Contributor that are necessarily infringed by their\nContribution(s) alone or by combination of their Contribution(s)\nwith the Work to which such Contribution(s) was submitted. If You\ninstitute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work\nor a Contribution incorporated within the Work constitutes direct\nor contributory patent infringement, then any patent licenses\ngranted to You under this License for that Work shall terminate\nas of the date such litigation is filed.\n\nRedistribution. You may reproduce and distribute copies of the\nWork or Derivative Works thereof in any medium, with or without\nmodifications, and in Source or Object form, provided that You\nmeet the following conditions:\n(a) You must give any other recipients of the Work or\nDerivative Works a copy of this License; and\n(b) You must cause any modified files to carry prominent notices\nstating that You changed the files; and\n(c) You must retain, in the Source form of any Derivative Works\nthat You distribute, all copyright, patent, trademark, and\nattribution notices from the Source form of the Work,\nexcluding those notices that do not pertain to any part of\nthe Derivative Works; and\n(d) If the Work includes a \"NOTICE\" text file as part of its\ndistribution, then any Derivative Works that You distribute must\ninclude a readable copy of the attribution notices contained\nwithin such NOTICE file, excluding those notices that do not\npertain to any part of the Derivative Works, in at least one\nof the following places: within a NOTICE text file distributed\nas part of the Derivative Works; within the Source form or\ndocumentation, if provided along with the Derivative Works; or,\nwithin a display generated by the Derivative Works, if and\nwherever such third-party notices normally appear. The contents\nof the NOTICE file are for informational purposes only and\ndo not modify the License. You may add Your own attribution\nnotices within Derivative Works that You distribute, alongside\nor as an addendum to the NOTICE text from the Work, provided\nthat such additional attribution notices cannot be construed\nas modifying the License.\nYou may add Your own copyright statement to Your modifications and\nmay provide additional or different license terms and conditions\nfor use, reproduction, or distribution of Your modifications, or\nfor any such Derivative Works as a whole, provided Your use,\nreproduction, and distribution of the Work otherwise complies with\nthe conditions stated in this License.\n\nSubmission of Contributions. Unless You explicitly state otherwise,\nany Contribution intentionally submitted for inclusion in the Work\nby You to the Licensor shall be under the terms and conditions of\nthis License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify\nthe terms of any separate license agreement you may have executed\nwith Licensor regarding such Contributions.\n\nTrademarks. This License does not grant permission to use the trade\nnames, trademarks, service marks, or product names of the Licensor,\nexcept as required for reasonable and customary use in describing the\norigin of the Work and reproducing the content of the NOTICE file.\n\nDisclaimer of Warranty. Unless required by applicable law or\nagreed to in writing, Licensor provides the Work (and each\nContributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied, including, without limitation, any warranties or conditions\nof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\nPARTICULAR PURPOSE. You are solely responsible for determining the\nappropriateness of using or redistributing the Work and assume any\nrisks associated with Your exercise of permissions under this License.\n\nLimitation of Liability. In no event and under no legal theory,\nwhether in tort (including negligence), contract, or otherwise,\nunless required by applicable law (such as deliberate and grossly\nnegligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special,\nincidental, or consequential damages of any character arising as a\nresult of this License or out of the use or inability to use the\nWork (including but not limited to damages for loss of goodwill,\nwork stoppage, computer failure or malfunction, or any and all\nother commercial damages or losses), even if such Contributor\nhas been advised of the possibility of such damages.\n\nAccepting Warranty or Additional Liability. While redistributing\nthe Work or Derivative Works thereof, You may choose to offer,\nand charge a fee for, acceptance of support, warranty, indemnity,\nor other liability obligations and/or rights consistent with this\nLicense. However, in accepting such obligations, You may act only\non Your own behalf and on Your sole responsibility, not on behalf\nof any other Contributor, and only if You agree to indemnify,\ndefend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason\nof your accepting any such warranty or additional liability.\n\n\n END OF TERMS AND CONDITIONS\n APPENDIX: How to apply the Apache License to your work.\nExample : To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives. Copyright [yyyy] [name of copyright owner]\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\nExample : http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"modules.html":{"url":"modules.html","title":"modules - modules","body":"\n \n\n\n\n\n Modules\n\n\n \n \n \n \n ApiDirectiveModule\n \n \n \n \n Your browser does not support SVG\n \n \n \n Browse\n \n \n \n \n \n \n \n OpenViduComponentsDirectiveModule\n \n \n \n \n Your browser does not support SVG\n \n \n \n Browse\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"overview.html":{"url":"overview.html","title":"overview - overview","body":"\n \n\n\n\n Overview\n\n \n\n \n \n\n\n\n\n\ndependencies\n\nLegend\n\n  Declarations\n\n  Module\n\n  Bootstrap\n\n  Providers\n\n  Exports\n\ncluster_ApiDirectiveModule\n\n\n\ncluster_ApiDirectiveModule_declarations\n\n\n\ncluster_ApiDirectiveModule_exports\n\n\n\ncluster_OpenViduComponentsDirectiveModule\n\n\n\ncluster_OpenViduComponentsDirectiveModule_declarations\n\n\n\ncluster_OpenViduComponentsDirectiveModule_exports\n\n\n\n\nActivitiesPanelBroadcastingActivityDirective\n\nActivitiesPanelBroadcastingActivityDirective\n\n\n\nApiDirectiveModule\n\nApiDirectiveModule\n\nApiDirectiveModule -->\n\nActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule\n\n\n\n\n\nActivitiesPanelRecordingActivityDirective\n\nActivitiesPanelRecordingActivityDirective\n\nApiDirectiveModule -->\n\nActivitiesPanelRecordingActivityDirective->ApiDirectiveModule\n\n\n\n\n\nAdminDashboardRecordingsListDirective\n\nAdminDashboardRecordingsListDirective\n\nApiDirectiveModule -->\n\nAdminDashboardRecordingsListDirective->ApiDirectiveModule\n\n\n\n\n\nAdminDashboardTitleDirective\n\nAdminDashboardTitleDirective\n\nApiDirectiveModule -->\n\nAdminDashboardTitleDirective->ApiDirectiveModule\n\n\n\n\n\nAdminLoginErrorDirective\n\nAdminLoginErrorDirective\n\nApiDirectiveModule -->\n\nAdminLoginErrorDirective->ApiDirectiveModule\n\n\n\n\n\nAdminLoginTitleDirective\n\nAdminLoginTitleDirective\n\nApiDirectiveModule -->\n\nAdminLoginTitleDirective->ApiDirectiveModule\n\n\n\n\n\nAudioEnabledDirective\n\nAudioEnabledDirective\n\nApiDirectiveModule -->\n\nAudioEnabledDirective->ApiDirectiveModule\n\n\n\n\n\nLangDirective\n\nLangDirective\n\nApiDirectiveModule -->\n\nLangDirective->ApiDirectiveModule\n\n\n\n\n\nLangOptionsDirective\n\nLangOptionsDirective\n\nApiDirectiveModule -->\n\nLangOptionsDirective->ApiDirectiveModule\n\n\n\n\n\nLivekitUrlDirective\n\nLivekitUrlDirective\n\nApiDirectiveModule -->\n\nLivekitUrlDirective->ApiDirectiveModule\n\n\n\n\n\nMinimalDirective\n\nMinimalDirective\n\nApiDirectiveModule -->\n\nMinimalDirective->ApiDirectiveModule\n\n\n\n\n\nParticipantNameDirective\n\nParticipantNameDirective\n\nApiDirectiveModule -->\n\nParticipantNameDirective->ApiDirectiveModule\n\n\n\n\n\nParticipantPanelItemMuteButtonDirective\n\nParticipantPanelItemMuteButtonDirective\n\nApiDirectiveModule -->\n\nParticipantPanelItemMuteButtonDirective->ApiDirectiveModule\n\n\n\n\n\nPrejoinDirective\n\nPrejoinDirective\n\nApiDirectiveModule -->\n\nPrejoinDirective->ApiDirectiveModule\n\n\n\n\n\nStreamDisplayAudioDetectionDirective\n\nStreamDisplayAudioDetectionDirective\n\nApiDirectiveModule -->\n\nStreamDisplayAudioDetectionDirective->ApiDirectiveModule\n\n\n\n\n\nStreamDisplayParticipantNameDirective\n\nStreamDisplayParticipantNameDirective\n\nApiDirectiveModule -->\n\nStreamDisplayParticipantNameDirective->ApiDirectiveModule\n\n\n\n\n\nStreamVideoControlsDirective\n\nStreamVideoControlsDirective\n\nApiDirectiveModule -->\n\nStreamVideoControlsDirective->ApiDirectiveModule\n\n\n\n\n\nTokenDirective\n\nTokenDirective\n\nApiDirectiveModule -->\n\nTokenDirective->ApiDirectiveModule\n\n\n\n\n\nTokenErrorDirective\n\nTokenErrorDirective\n\nApiDirectiveModule -->\n\nTokenErrorDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarActivitiesPanelButtonDirective\n\nToolbarActivitiesPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarActivitiesPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarAdditionalButtonsPossitionDirective\n\nToolbarAdditionalButtonsPossitionDirective\n\nApiDirectiveModule -->\n\nToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarBackgroundEffectsButtonDirective\n\nToolbarBackgroundEffectsButtonDirective\n\nApiDirectiveModule -->\n\nToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarBroadcastingButtonDirective\n\nToolbarBroadcastingButtonDirective\n\nApiDirectiveModule -->\n\nToolbarBroadcastingButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarChatPanelButtonDirective\n\nToolbarChatPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarChatPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarDisplayLogoDirective\n\nToolbarDisplayLogoDirective\n\nApiDirectiveModule -->\n\nToolbarDisplayLogoDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarDisplayRoomNameDirective\n\nToolbarDisplayRoomNameDirective\n\nApiDirectiveModule -->\n\nToolbarDisplayRoomNameDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarFullscreenButtonDirective\n\nToolbarFullscreenButtonDirective\n\nApiDirectiveModule -->\n\nToolbarFullscreenButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarLeaveButtonDirective\n\nToolbarLeaveButtonDirective\n\nApiDirectiveModule -->\n\nToolbarLeaveButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarParticipantsPanelButtonDirective\n\nToolbarParticipantsPanelButtonDirective\n\nApiDirectiveModule -->\n\nToolbarParticipantsPanelButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarRecordingButtonDirective\n\nToolbarRecordingButtonDirective\n\nApiDirectiveModule -->\n\nToolbarRecordingButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarScreenshareButtonDirective\n\nToolbarScreenshareButtonDirective\n\nApiDirectiveModule -->\n\nToolbarScreenshareButtonDirective->ApiDirectiveModule\n\n\n\n\n\nToolbarSettingsButtonDirective\n\nToolbarSettingsButtonDirective\n\nApiDirectiveModule -->\n\nToolbarSettingsButtonDirective->ApiDirectiveModule\n\n\n\n\n\nVideoEnabledDirective\n\nVideoEnabledDirective\n\nApiDirectiveModule -->\n\nVideoEnabledDirective->ApiDirectiveModule\n\n\n\n\n\nActivitiesPanelBroadcastingActivityDirective \n\nActivitiesPanelBroadcastingActivityDirective \n\nActivitiesPanelBroadcastingActivityDirective -->\n\nApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective \n\n\n\n\n\nActivitiesPanelRecordingActivityDirective \n\nActivitiesPanelRecordingActivityDirective \n\nActivitiesPanelRecordingActivityDirective -->\n\nApiDirectiveModule->ActivitiesPanelRecordingActivityDirective \n\n\n\n\n\nAdminDashboardRecordingsListDirective \n\nAdminDashboardRecordingsListDirective \n\nAdminDashboardRecordingsListDirective -->\n\nApiDirectiveModule->AdminDashboardRecordingsListDirective \n\n\n\n\n\nAdminDashboardTitleDirective \n\nAdminDashboardTitleDirective \n\nAdminDashboardTitleDirective -->\n\nApiDirectiveModule->AdminDashboardTitleDirective \n\n\n\n\n\nAdminLoginErrorDirective \n\nAdminLoginErrorDirective \n\nAdminLoginErrorDirective -->\n\nApiDirectiveModule->AdminLoginErrorDirective \n\n\n\n\n\nAdminLoginTitleDirective \n\nAdminLoginTitleDirective \n\nAdminLoginTitleDirective -->\n\nApiDirectiveModule->AdminLoginTitleDirective \n\n\n\n\n\nAudioEnabledDirective \n\nAudioEnabledDirective \n\nAudioEnabledDirective -->\n\nApiDirectiveModule->AudioEnabledDirective \n\n\n\n\n\nLangDirective \n\nLangDirective \n\nLangDirective -->\n\nApiDirectiveModule->LangDirective \n\n\n\n\n\nLangOptionsDirective \n\nLangOptionsDirective \n\nLangOptionsDirective -->\n\nApiDirectiveModule->LangOptionsDirective \n\n\n\n\n\nLivekitUrlDirective \n\nLivekitUrlDirective \n\nLivekitUrlDirective -->\n\nApiDirectiveModule->LivekitUrlDirective \n\n\n\n\n\nMinimalDirective \n\nMinimalDirective \n\nMinimalDirective -->\n\nApiDirectiveModule->MinimalDirective \n\n\n\n\n\nParticipantNameDirective \n\nParticipantNameDirective \n\nParticipantNameDirective -->\n\nApiDirectiveModule->ParticipantNameDirective \n\n\n\n\n\nParticipantPanelItemMuteButtonDirective \n\nParticipantPanelItemMuteButtonDirective \n\nParticipantPanelItemMuteButtonDirective -->\n\nApiDirectiveModule->ParticipantPanelItemMuteButtonDirective \n\n\n\n\n\nPrejoinDirective \n\nPrejoinDirective \n\nPrejoinDirective -->\n\nApiDirectiveModule->PrejoinDirective \n\n\n\n\n\nStreamDisplayAudioDetectionDirective \n\nStreamDisplayAudioDetectionDirective \n\nStreamDisplayAudioDetectionDirective -->\n\nApiDirectiveModule->StreamDisplayAudioDetectionDirective \n\n\n\n\n\nStreamDisplayParticipantNameDirective \n\nStreamDisplayParticipantNameDirective \n\nStreamDisplayParticipantNameDirective -->\n\nApiDirectiveModule->StreamDisplayParticipantNameDirective \n\n\n\n\n\nStreamVideoControlsDirective \n\nStreamVideoControlsDirective \n\nStreamVideoControlsDirective -->\n\nApiDirectiveModule->StreamVideoControlsDirective \n\n\n\n\n\nTokenDirective \n\nTokenDirective \n\nTokenDirective -->\n\nApiDirectiveModule->TokenDirective \n\n\n\n\n\nTokenErrorDirective \n\nTokenErrorDirective \n\nTokenErrorDirective -->\n\nApiDirectiveModule->TokenErrorDirective \n\n\n\n\n\nToolbarActivitiesPanelButtonDirective \n\nToolbarActivitiesPanelButtonDirective \n\nToolbarActivitiesPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarActivitiesPanelButtonDirective \n\n\n\n\n\nToolbarAdditionalButtonsPossitionDirective \n\nToolbarAdditionalButtonsPossitionDirective \n\nToolbarAdditionalButtonsPossitionDirective -->\n\nApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective \n\n\n\n\n\nToolbarBackgroundEffectsButtonDirective \n\nToolbarBackgroundEffectsButtonDirective \n\nToolbarBackgroundEffectsButtonDirective -->\n\nApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective \n\n\n\n\n\nToolbarBroadcastingButtonDirective \n\nToolbarBroadcastingButtonDirective \n\nToolbarBroadcastingButtonDirective -->\n\nApiDirectiveModule->ToolbarBroadcastingButtonDirective \n\n\n\n\n\nToolbarChatPanelButtonDirective \n\nToolbarChatPanelButtonDirective \n\nToolbarChatPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarChatPanelButtonDirective \n\n\n\n\n\nToolbarDisplayLogoDirective \n\nToolbarDisplayLogoDirective \n\nToolbarDisplayLogoDirective -->\n\nApiDirectiveModule->ToolbarDisplayLogoDirective \n\n\n\n\n\nToolbarDisplayRoomNameDirective \n\nToolbarDisplayRoomNameDirective \n\nToolbarDisplayRoomNameDirective -->\n\nApiDirectiveModule->ToolbarDisplayRoomNameDirective \n\n\n\n\n\nToolbarFullscreenButtonDirective \n\nToolbarFullscreenButtonDirective \n\nToolbarFullscreenButtonDirective -->\n\nApiDirectiveModule->ToolbarFullscreenButtonDirective \n\n\n\n\n\nToolbarLeaveButtonDirective \n\nToolbarLeaveButtonDirective \n\nToolbarLeaveButtonDirective -->\n\nApiDirectiveModule->ToolbarLeaveButtonDirective \n\n\n\n\n\nToolbarParticipantsPanelButtonDirective \n\nToolbarParticipantsPanelButtonDirective \n\nToolbarParticipantsPanelButtonDirective -->\n\nApiDirectiveModule->ToolbarParticipantsPanelButtonDirective \n\n\n\n\n\nToolbarRecordingButtonDirective \n\nToolbarRecordingButtonDirective \n\nToolbarRecordingButtonDirective -->\n\nApiDirectiveModule->ToolbarRecordingButtonDirective \n\n\n\n\n\nToolbarScreenshareButtonDirective \n\nToolbarScreenshareButtonDirective \n\nToolbarScreenshareButtonDirective -->\n\nApiDirectiveModule->ToolbarScreenshareButtonDirective \n\n\n\n\n\nToolbarSettingsButtonDirective \n\nToolbarSettingsButtonDirective \n\nToolbarSettingsButtonDirective -->\n\nApiDirectiveModule->ToolbarSettingsButtonDirective \n\n\n\n\n\nVideoEnabledDirective \n\nVideoEnabledDirective \n\nVideoEnabledDirective -->\n\nApiDirectiveModule->VideoEnabledDirective \n\n\n\n\n\nActivitiesPanelDirective\n\nActivitiesPanelDirective\n\n\n\nOpenViduComponentsDirectiveModule\n\nOpenViduComponentsDirectiveModule\n\nOpenViduComponentsDirectiveModule -->\n\nActivitiesPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nAdditionalPanelsDirective\n\nAdditionalPanelsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nAdditionalPanelsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nChatPanelDirective\n\nChatPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nChatPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nLayoutDirective\n\nLayoutDirective\n\nOpenViduComponentsDirectiveModule -->\n\nLayoutDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nPanelDirective\n\nPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantPanelItemDirective\n\nParticipantPanelItemDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantPanelItemDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantPanelItemElementsDirective\n\nParticipantPanelItemElementsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nParticipantsPanelDirective\n\nParticipantsPanelDirective\n\nOpenViduComponentsDirectiveModule -->\n\nParticipantsPanelDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nStreamDirective\n\nStreamDirective\n\nOpenViduComponentsDirectiveModule -->\n\nStreamDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarAdditionalButtonsDirective\n\nToolbarAdditionalButtonsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarAdditionalPanelButtonsDirective\n\nToolbarAdditionalPanelButtonsDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nToolbarDirective\n\nToolbarDirective\n\nOpenViduComponentsDirectiveModule -->\n\nToolbarDirective->OpenViduComponentsDirectiveModule\n\n\n\n\n\nActivitiesPanelDirective \n\nActivitiesPanelDirective \n\nActivitiesPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ActivitiesPanelDirective \n\n\n\n\n\nAdditionalPanelsDirective \n\nAdditionalPanelsDirective \n\nAdditionalPanelsDirective -->\n\nOpenViduComponentsDirectiveModule->AdditionalPanelsDirective \n\n\n\n\n\nChatPanelDirective \n\nChatPanelDirective \n\nChatPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ChatPanelDirective \n\n\n\n\n\nLayoutDirective \n\nLayoutDirective \n\nLayoutDirective -->\n\nOpenViduComponentsDirectiveModule->LayoutDirective \n\n\n\n\n\nPanelDirective \n\nPanelDirective \n\nPanelDirective -->\n\nOpenViduComponentsDirectiveModule->PanelDirective \n\n\n\n\n\nParticipantPanelItemDirective \n\nParticipantPanelItemDirective \n\nParticipantPanelItemDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantPanelItemDirective \n\n\n\n\n\nParticipantPanelItemElementsDirective \n\nParticipantPanelItemElementsDirective \n\nParticipantPanelItemElementsDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective \n\n\n\n\n\nParticipantsPanelDirective \n\nParticipantsPanelDirective \n\nParticipantsPanelDirective -->\n\nOpenViduComponentsDirectiveModule->ParticipantsPanelDirective \n\n\n\n\n\nStreamDirective \n\nStreamDirective \n\nStreamDirective -->\n\nOpenViduComponentsDirectiveModule->StreamDirective \n\n\n\n\n\nToolbarAdditionalButtonsDirective \n\nToolbarAdditionalButtonsDirective \n\nToolbarAdditionalButtonsDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective \n\n\n\n\n\nToolbarAdditionalPanelButtonsDirective \n\nToolbarAdditionalPanelButtonsDirective \n\nToolbarAdditionalPanelButtonsDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective \n\n\n\n\n\nToolbarDirective \n\nToolbarDirective \n\nToolbarDirective -->\n\nOpenViduComponentsDirectiveModule->ToolbarDirective \n\n\n\n\n\n\n \n \n \n Zoom in\n Reset\n Zoom out\n \n\n \n\n \n \n \n \n \n \n 2 Modules\n \n \n \n \n \n \n \n \n 13 Components\n \n \n \n \n \n \n \n 45 Directives\n \n \n \n \n \n \n \n 6 Injectables\n \n \n \n \n \n \n \n 1 Pipe\n \n \n \n \n \n \n \n 1 Class\n \n \n \n \n \n \n \n 21 Interfaces\n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"properties.html":{"url":"properties.html","title":"package-properties - properties","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n Properties\n \n \n \n Version : 3.0.0-beta3\n \n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/typealiases.html":{"url":"miscellaneous/typealiases.html","title":"miscellaneous-typealiases - typealiases","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Type aliases\n\n\n\n Index\n \n \n \n \n \n \n AdditionalTranslationsType   (projects/.../lang.model.ts)\n \n \n AvailableLangs   (projects/.../lang.model.ts)\n \n \n \n \n \n \n\n\n projects/openvidu-components-angular/src/lib/models/lang.model.ts\n \n \n \n \n \n \n AdditionalTranslationsType\n \n \n \n \n Record>\n\n \n \n \n \n \n \n \n \n \n AvailableLangs\n \n \n \n \n \"en\" | \"es\" | \"de\" | \"fr\" | \"cn\" | \"hi\" | \"it\" | \"ja\" | \"nl\" | \"pt\"\n\n \n \n \n \n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/variables.html":{"url":"miscellaneous/variables.html","title":"miscellaneous-variables - variables","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Variables\n\n\n\n Index\n \n \n \n \n \n \n STORAGE_PREFIX   (projects/.../storage.model.ts)\n \n \n \n \n \n \n\n\n projects/openvidu-components-angular/src/lib/models/storage.model.ts\n \n \n \n \n \n \n \n STORAGE_PREFIX\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Default value : 'ovComponents-'\n \n \n\n\n \n \n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"}} -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/sourceCode.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/sourceCode.js deleted file mode 100644 index 541dbd11..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/sourceCode.js +++ /dev/null @@ -1,58 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - var $tabSource = document.querySelector('#source-tab'), - $tabInfo = document.querySelector('#info-tab'), - $tabReadme = document.querySelector('#readme-tab'), - $tabTemplate = document.querySelector('#templateData-tab'), - $tabTree = document.querySelector('#tree-tab'), - $tabExample = document.querySelector('#example-tab'), - $prismPre = document.querySelector('pre.compodoc-sourcecode'); - if ($tabSource && $prismPre) { - $prismCode = $prismPre.querySelector('code'), - $content = document.querySelector('.content'), - prismLinks = document.querySelectorAll('.link-to-prism') - - for (var i = 0; i < prismLinks.length; i++) { - prismLinks[i].addEventListener('click', linkToPrism, false); - } - - function linkToPrism(event) { - var targetLine = event.target.getAttribute('data-line'); - event.preventDefault(); - - $prismPre.setAttribute('data-line', targetLine); - Prism.highlightElement($prismCode, function() {}); - - $tabSource.click(); - - setTimeout(function() { - var $prismHighlightLine = document.querySelector('.line-highlight'), - top = parseInt(getComputedStyle($prismHighlightLine)['top']); - $content.scrollTop = top; - }, 500); - }; - - window.onhashchange = function(event) { - switch (window.location.hash) { - case '': - case '#info': - $tabInfo.click(); - break; - case '#readme': - $tabReadme.click(); - break; - case '#source': - $tabSource.click(); - break; - case '#template': - $tabTemplate.click(); - break; - case '#dom-tree': - $tabTree.click(); - break; - case '#example': - $tabExample.click(); - break; - } - } - } -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/svg-pan-zoom.controls.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/svg-pan-zoom.controls.js deleted file mode 100644 index ea6d138d..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/svg-pan-zoom.controls.js +++ /dev/null @@ -1,53 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - if (document.getElementById('module-graph-svg')) { - panZoom = svgPanZoom(document.getElementById('module-graph-svg').querySelector('svg'), { - zoomEnabled: true, - minZoom: 1, - maxZoom: 5 - }); - - document.getElementById('zoom-in').addEventListener('click', function(ev) { - ev.preventDefault(); - panZoom.zoomIn(); - }); - - document.getElementById('zoom-out').addEventListener('click', function(ev) { - ev.preventDefault(); - panZoom.zoomOut(); - }); - - document.getElementById('reset').addEventListener('click', function(ev) { - ev.preventDefault(); - panZoom.resetZoom(); - panZoom.resetPan(); - }); - - var overviewFullscreen = false, - originalOverviewHeight; - - document.getElementById('fullscreen').addEventListener('click', function(ev) { - if (overviewFullscreen) { - document.getElementById('module-graph-svg').style.height = originalOverviewHeight; - overviewFullscreen = false; - if (ev.target) { - ev.target.classList.remove('ion-md-close'); - ev.target.classList.add('ion-ios-resize'); - } - } else { - originalOverviewHeight = document.getElementById('module-graph-svg').style.height; - document.getElementById('module-graph-svg').style.height = '85vh'; - overviewFullscreen = true; - if (ev.target) { - ev.target.classList.remove('ion-ios-resize'); - ev.target.classList.add('ion-md-close'); - } - } - document.getElementById('module-graph-svg').querySelector('svg').style.height = document.getElementById('module-graph-svg').clientHeight; - setTimeout(function() { - panZoom.resize(); - panZoom.fit(); - panZoom.center(); - }, 0) - }); - } -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tabs.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tabs.js deleted file mode 100644 index dbe4c287..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tabs.js +++ /dev/null @@ -1,21 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - var tabs = document.getElementsByClassName('nav-tabs'), - updateAddress = function(e) { - if(history.pushState && e.target.dataset.link) { - history.pushState(null, null, '#' + e.target.dataset.link); - } - }; - if (tabs.length > 0) { - tabs = tabs[0].querySelectorAll('li'); - for (var i = 0; i < tabs.length; i++) { - tabs[i].addEventListener('click', updateAddress); - var linkTag = tabs[i].querySelector('a'); - if (location.hash !== '') { - var currentHash = location.hash.substr(1); - if (currentHash === linkTag.dataset.link) { - linkTag.click(); - } - } - } - } -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tree.js b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tree.js deleted file mode 100644 index f79e1d71..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/js/tree.js +++ /dev/null @@ -1,147 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - var tabs = document.getElementsByClassName('nav-tabs')[0], - tabsCollection = tabs.getElementsByTagName('A'), - treeTab; - var len = tabsCollection.length; - for(var i = 0; i < len; i++) { - if (tabsCollection[i].getAttribute('id') === 'tree-tab') { - treeTab = tabsCollection[i]; - } - } - - // short-circuit if no tree tab - if (!treeTab) return; - - var handler = new Tautologistics.NodeHtmlParser.HtmlBuilder(function(error, dom) { - if (error) { - console.log('handler ko'); - } - }), - parser = new Tautologistics.NodeHtmlParser.Parser(handler), - currentLocation = window.location; - parser.parseComplete(COMPONENT_TEMPLATE); - - var newNodes = [], - newEdges = [], - parsedHtml = handler.dom[0], - nodeCount = 0, - nodeLevel = 0; - - newNodes.push({ - _id: 0, - label: parsedHtml.name, - type: parsedHtml.type - }) - //Add id for nodes - var traverseIds = function(o) { - for (i in o) { - if (!!o[i] && typeof(o[i]) == "object") { - if (!o[i].length && o[i].type === 'tag') { - nodeCount += 1; - o[i]._id = nodeCount; - } - traverseIds(o[i]); - } - } - } - parsedHtml._id = 0; - traverseIds(parsedHtml); - - - var DeepIterator = deepIterator.default, - it = DeepIterator(parsedHtml); - for (let { - value, - parent, - parentNode, - key, - type - } of it) { - if (type === 'NonIterableObject' && typeof key !== 'undefined' && value.type === 'tag') { - var newNode = { - id: value._id, - label: value.name, - type: value.type - }; - for(var i = 0; i < COMPONENTS.length; i++) { - if (COMPONENTS[i].selector === value.name) { - newNode.font = { - multi: 'html' - }; - newNode.label = '' + newNode.label + ''; - newNode.color = '#FB7E81'; - newNode.name = COMPONENTS[i].name; - } - } - for(var i = 0; i < DIRECTIVES.length; i++) { - if (value.attributes) { - for(attr in value.attributes) { - if (DIRECTIVES[i].selector.indexOf(attr) !== -1) { - newNode.font = { - multi: 'html' - }; - newNode.label = '' + newNode.label + ''; - newNode.color = '#FF9800'; - newNode.name = DIRECTIVES[i].name; - } - } - } - } - newNodes.push(newNode); - newEdges.push({ - from: parentNode._parent._id, - to: value._id, - arrows: 'to' - }); - } - } - - newNodes.shift(); - - var container = document.getElementById('tree-container'), - data = { - nodes: newNodes, - edges: newEdges - }, - options = { - layout: { - hierarchical: { - sortMethod: 'directed', - enabled: true - } - }, - nodes: { - shape: 'ellipse', - fixed: true - } - }, - - handleClickNode = function(params) { - var clickeNodeId; - if (params.nodes.length > 0) { - clickeNodeId = params.nodes[0]; - for(var i = 0; i < newNodes.length; i++) { - if (newNodes[i].id === clickeNodeId) { - for(var j = 0; j < COMPONENTS.length; j++) { - if (COMPONENTS[j].name === newNodes[i].name) { - document.location.href = currentLocation.origin + currentLocation.pathname.replace(ACTUAL_COMPONENT.name, newNodes[i].name); - } - } - } - } - } - }, - - loadTree = function () { - setTimeout(function() { - container.style.height = document.getElementsByClassName('content')[0].offsetHeight - 140 + 'px'; - var network = new vis.Network(container, data, options); - network.on('click', handleClickNode); - }, 200); // Fade is 0.150 - }; - - loadTree(); - treeTab.addEventListener('click', function() { - loadTree(); - }); -}); diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/license.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/license.html deleted file mode 100644 index 2ee87b2f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/license.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                -
                                                                                                                                                                                - - -
                                                                                                                                                                                -
                                                                                                                                                                                - -Example :
                                                                                                                                                                                                             Apache License
                                                                                                                                                                                -                       Version 2.0, January 2004
                                                                                                                                                                                -                    http://www.apache.org/licenses/

                                                                                                                                                                                TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

                                                                                                                                                                                -
                                                                                                                                                                                  -
                                                                                                                                                                                1. Definitions.

                                                                                                                                                                                  -

                                                                                                                                                                                  "License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Licensor" shall mean the copyright owner or entity authorized by -the copyright owner that is granting the License.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Legal Entity" shall mean the union of the acting entity and all -other entities that control, are controlled by, or are under common -control with that entity. For the purposes of this definition, -"control" means (i) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or -otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity.

                                                                                                                                                                                  -

                                                                                                                                                                                  "You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation -source, and configuration files.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a -copyright notice that is included in or attached to the work -(an example is provided in the Appendix below).

                                                                                                                                                                                  -

                                                                                                                                                                                  "Derivative Works" shall mean any work, whether in Source or Object -form, that is based on (or derived from) the Work and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the purposes -of this License, Derivative Works shall not include works that remain -separable from, or merely link (or bind by name) to the interfaces of, -the Work and Derivative Works thereof.

                                                                                                                                                                                  -

                                                                                                                                                                                  "Contribution" shall mean any work of authorship, including -the original version of the Work and any modifications or additions -to that Work or Derivative Works thereof, that is intentionally -submitted to Licensor for inclusion in the Work by the copyright owner -or by an individual or Legal Entity authorized to submit on behalf of -the copyright owner. For the purposes of this definition, "submitted" -means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, -and issue tracking systems that are managed by, or on behalf of, the -Licensor for the purpose of discussing and improving the Work, but -excluding communication that is conspicuously marked or otherwise -designated in writing by the copyright owner as "Not a Contribution."

                                                                                                                                                                                  -

                                                                                                                                                                                  "Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work.

                                                                                                                                                                                  -
                                                                                                                                                                                2. -
                                                                                                                                                                                3. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the -Work and such Derivative Works in Source or Object form.

                                                                                                                                                                                  -
                                                                                                                                                                                4. -
                                                                                                                                                                                5. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed.

                                                                                                                                                                                  -
                                                                                                                                                                                6. -
                                                                                                                                                                                7. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions:

                                                                                                                                                                                  -

                                                                                                                                                                                  (a) You must give any other recipients of the Work or -Derivative Works a copy of this License; and -(b) You must cause any modified files to carry prominent notices -stating that You changed the files; and -(c) You must retain, in the Source form of any Derivative Works -that You distribute, all copyright, patent, trademark, and -attribution notices from the Source form of the Work, -excluding those notices that do not pertain to any part of -the Derivative Works; and -(d) If the Work includes a "NOTICE" text file as part of its -distribution, then any Derivative Works that You distribute must -include a readable copy of the attribution notices contained -within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one -of the following places: within a NOTICE text file distributed -as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, -within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and -do not modify the License. You may add Your own attribution -notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided -that such additional attribution notices cannot be construed -as modifying the License. -You may add Your own copyright statement to Your modifications and -may provide additional or different license terms and conditions -for use, reproduction, or distribution of Your modifications, or -for any such Derivative Works as a whole, provided Your use, -reproduction, and distribution of the Work otherwise complies with -the conditions stated in this License.

                                                                                                                                                                                  -
                                                                                                                                                                                8. -
                                                                                                                                                                                9. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions.

                                                                                                                                                                                  -
                                                                                                                                                                                10. -
                                                                                                                                                                                11. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file.

                                                                                                                                                                                  -
                                                                                                                                                                                12. -
                                                                                                                                                                                13. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License.

                                                                                                                                                                                  -
                                                                                                                                                                                14. -
                                                                                                                                                                                15. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages.

                                                                                                                                                                                  -
                                                                                                                                                                                16. -
                                                                                                                                                                                17. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability.

                                                                                                                                                                                  -
                                                                                                                                                                                18. -
                                                                                                                                                                                -

                                                                                                                                                                                END OF TERMS AND CONDITIONS

                                                                                                                                                                                -

                                                                                                                                                                                APPENDIX: How to apply the Apache License to your work.

                                                                                                                                                                                -Example :
                                                                                                                                                                                  To apply the Apache License to your work, attach the following
                                                                                                                                                                                -  boilerplate notice, with the fields enclosed by brackets "[]"
                                                                                                                                                                                -  replaced with your own identifying information. (Don't include
                                                                                                                                                                                -  the brackets!)  The text should be enclosed in the appropriate
                                                                                                                                                                                -  comment syntax for the file format. We also recommend that a
                                                                                                                                                                                -  file or class name and description of purpose be included on the
                                                                                                                                                                                -  same "printed page" as the copyright notice for easier
                                                                                                                                                                                -  identification within third-party archives.

                                                                                                                                                                                Copyright [yyyy] [name of copyright owner]

                                                                                                                                                                                -

                                                                                                                                                                                Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at

                                                                                                                                                                                -Example :
                                                                                                                                                                                   http://www.apache.org/licenses/LICENSE-2.0

                                                                                                                                                                                Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.

                                                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                -
                                                                                                                                                                                -

                                                                                                                                                                                results matching ""

                                                                                                                                                                                -
                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -

                                                                                                                                                                                  No results matching ""

                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  - -
                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/enumerations.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/enumerations.html deleted file mode 100644 index a881522e..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/enumerations.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                  -
                                                                                                                                                                                  - - -
                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  -

                                                                                                                                                                                  Index

                                                                                                                                                                                  - - - - - - -
                                                                                                                                                                                  - -
                                                                                                                                                                                  -
                                                                                                                                                                                  - -

                                                                                                                                                                                  projects/openvidu-components-angular/src/lib/models/broadcasting.model.ts

                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  - - BroadcastingStatus -
                                                                                                                                                                                  -

                                                                                                                                                                                  Enum representing the possible status of a broadcast

                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -  STARTING -
                                                                                                                                                                                  - Value : STARTING -
                                                                                                                                                                                  -  STARTED -
                                                                                                                                                                                  - Value : STARTED -
                                                                                                                                                                                  -  STOPPING -
                                                                                                                                                                                  - Value : STOPPING -
                                                                                                                                                                                  -  STOPPED -
                                                                                                                                                                                  - Value : STOPPED -
                                                                                                                                                                                  -  FAILED -
                                                                                                                                                                                  - Value : FAILED -
                                                                                                                                                                                  -
                                                                                                                                                                                  -

                                                                                                                                                                                  projects/openvidu-components-angular/src/lib/models/panel.model.ts

                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  - - PanelType -
                                                                                                                                                                                  -

                                                                                                                                                                                  Interface representing the different types of panels

                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -  CHAT -
                                                                                                                                                                                  - Value : chat -
                                                                                                                                                                                  -  PARTICIPANTS -
                                                                                                                                                                                  - Value : participants -
                                                                                                                                                                                  -  BACKGROUND_EFFECTS -
                                                                                                                                                                                  - Value : background-effects -
                                                                                                                                                                                  -  ACTIVITIES -
                                                                                                                                                                                  - Value : activities -
                                                                                                                                                                                  -  SETTINGS -
                                                                                                                                                                                  - Value : settings -
                                                                                                                                                                                  -
                                                                                                                                                                                  -

                                                                                                                                                                                  projects/openvidu-components-angular/src/lib/models/recording.model.ts

                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  - - RecordingOutputMode -
                                                                                                                                                                                  -  COMPOSED -
                                                                                                                                                                                  - Value : COMPOSED -
                                                                                                                                                                                  -  INDIVIDUAL -
                                                                                                                                                                                  - Value : INDIVIDUAL -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  - - RecordingStatus -
                                                                                                                                                                                  -

                                                                                                                                                                                  Enum representing the possible status of a recording

                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -  STARTING -
                                                                                                                                                                                  - Value : STARTING -
                                                                                                                                                                                  -  STARTED -
                                                                                                                                                                                  - Value : STARTED -
                                                                                                                                                                                  -  STOPPING -
                                                                                                                                                                                  - Value : STOPPING -
                                                                                                                                                                                  -  STOPPED -
                                                                                                                                                                                  - Value : STOPPED -
                                                                                                                                                                                  -  FAILED -
                                                                                                                                                                                  - Value : FAILED -
                                                                                                                                                                                  -  READY -
                                                                                                                                                                                  - Value : READY -
                                                                                                                                                                                  -
                                                                                                                                                                                  -

                                                                                                                                                                                  projects/openvidu-components-angular/src/lib/models/toolbar.model.ts

                                                                                                                                                                                  -
                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                  - - ToolbarAdditionalButtonsPosition -
                                                                                                                                                                                  -

                                                                                                                                                                                  Enum representing the position of additional buttons in a toolbar.

                                                                                                                                                                                  -
                                                                                                                                                                                  -
                                                                                                                                                                                  -  BEFORE_MENU -
                                                                                                                                                                                  - Value : beforeMenu -
                                                                                                                                                                                  -  AFTER_MENU -
                                                                                                                                                                                  - Value : afterMenu -
                                                                                                                                                                                  -
                                                                                                                                                                                  - - - -
                                                                                                                                                                                  -
                                                                                                                                                                                  -

                                                                                                                                                                                  results matching ""

                                                                                                                                                                                  -
                                                                                                                                                                                    -
                                                                                                                                                                                    -
                                                                                                                                                                                    -

                                                                                                                                                                                    No results matching ""

                                                                                                                                                                                    -
                                                                                                                                                                                    -
                                                                                                                                                                                    -
                                                                                                                                                                                    - -
                                                                                                                                                                                    -
                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/typealiases.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/typealiases.html deleted file mode 100644 index 942f5408..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/typealiases.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                    -
                                                                                                                                                                                    - - -
                                                                                                                                                                                    -
                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                    -

                                                                                                                                                                                    Index

                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                    - -
                                                                                                                                                                                    -
                                                                                                                                                                                    - -

                                                                                                                                                                                    projects/openvidu-components-angular/src/lib/models/lang.model.ts

                                                                                                                                                                                    -
                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                    - - AdditionalTranslationsType -
                                                                                                                                                                                    - Record<AvailableLangs | Record<string, any>> - -
                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                    - - AvailableLangs -
                                                                                                                                                                                    - "en" | "es" | "de" | "fr" | "cn" | "hi" | "it" | "ja" | "nl" | "pt" - -
                                                                                                                                                                                    -
                                                                                                                                                                                    - - -
                                                                                                                                                                                    -
                                                                                                                                                                                    -

                                                                                                                                                                                    results matching ""

                                                                                                                                                                                    -
                                                                                                                                                                                      -
                                                                                                                                                                                      -
                                                                                                                                                                                      -

                                                                                                                                                                                      No results matching ""

                                                                                                                                                                                      -
                                                                                                                                                                                      -
                                                                                                                                                                                      -
                                                                                                                                                                                      - -
                                                                                                                                                                                      -
                                                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/variables.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/variables.html deleted file mode 100644 index 27a31480..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/miscellaneous/variables.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                      -
                                                                                                                                                                                      - - -
                                                                                                                                                                                      -
                                                                                                                                                                                      - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                      -

                                                                                                                                                                                      Index

                                                                                                                                                                                      - - - - - - -
                                                                                                                                                                                      - -
                                                                                                                                                                                      -
                                                                                                                                                                                      - -

                                                                                                                                                                                      projects/openvidu-components-angular/src/lib/models/storage.model.ts

                                                                                                                                                                                      -
                                                                                                                                                                                      -

                                                                                                                                                                                      - - - - - - - - - - - - - -
                                                                                                                                                                                      - - - STORAGE_PREFIX - - -
                                                                                                                                                                                      - Type : string - -
                                                                                                                                                                                      - Default value : 'ovComponents-' -
                                                                                                                                                                                      -
                                                                                                                                                                                      - - - -
                                                                                                                                                                                      -
                                                                                                                                                                                      -

                                                                                                                                                                                      results matching ""

                                                                                                                                                                                      -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        No results matching ""

                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        - -
                                                                                                                                                                                        -
                                                                                                                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules.html deleted file mode 100644 index 9322b2f7..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                        -
                                                                                                                                                                                        - - -
                                                                                                                                                                                        -
                                                                                                                                                                                        - - - - -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        ApiDirectiveModule

                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        - - Your browser does not support SVG - -

                                                                                                                                                                                        - -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        OpenViduComponentsDirectiveModule

                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        - - Your browser does not support SVG - -

                                                                                                                                                                                        - -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        -
                                                                                                                                                                                        - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                        -
                                                                                                                                                                                        -

                                                                                                                                                                                        results matching ""

                                                                                                                                                                                        -
                                                                                                                                                                                          -
                                                                                                                                                                                          -
                                                                                                                                                                                          -

                                                                                                                                                                                          No results matching ""

                                                                                                                                                                                          -
                                                                                                                                                                                          -
                                                                                                                                                                                          -
                                                                                                                                                                                          - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule.html deleted file mode 100644 index bf01268c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule.html +++ /dev/null @@ -1,1271 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_ApiDirectiveModule - - - -cluster_ApiDirectiveModule_declarations - - - -cluster_ApiDirectiveModule_exports - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule - -ApiDirectiveModule - - - -ActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ActivitiesPanelRecordingActivityDirective->ApiDirectiveModule - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -AdminDashboardRecordingsListDirective->ApiDirectiveModule - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -AdminDashboardTitleDirective->ApiDirectiveModule - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -AdminLoginErrorDirective->ApiDirectiveModule - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -AdminLoginTitleDirective->ApiDirectiveModule - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -AudioEnabledDirective->ApiDirectiveModule - - - - - -LangDirective - -LangDirective - - - -LangDirective->ApiDirectiveModule - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -LangOptionsDirective->ApiDirectiveModule - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -LivekitUrlDirective->ApiDirectiveModule - - - - - -MinimalDirective - -MinimalDirective - - - -MinimalDirective->ApiDirectiveModule - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ParticipantNameDirective->ApiDirectiveModule - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ParticipantPanelItemMuteButtonDirective->ApiDirectiveModule - - - - - -PrejoinDirective - -PrejoinDirective - - - -PrejoinDirective->ApiDirectiveModule - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -StreamDisplayAudioDetectionDirective->ApiDirectiveModule - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -StreamDisplayParticipantNameDirective->ApiDirectiveModule - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -StreamVideoControlsDirective->ApiDirectiveModule - - - - - -TokenDirective - -TokenDirective - - - -TokenDirective->ApiDirectiveModule - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -TokenErrorDirective->ApiDirectiveModule - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ToolbarActivitiesPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ToolbarBroadcastingButtonDirective->ApiDirectiveModule - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ToolbarChatPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ToolbarDisplayLogoDirective->ApiDirectiveModule - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ToolbarDisplayRoomNameDirective->ApiDirectiveModule - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ToolbarFullscreenButtonDirective->ApiDirectiveModule - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ToolbarLeaveButtonDirective->ApiDirectiveModule - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ToolbarParticipantsPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ToolbarRecordingButtonDirective->ApiDirectiveModule - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ToolbarScreenshareButtonDirective->ApiDirectiveModule - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ToolbarSettingsButtonDirective->ApiDirectiveModule - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -VideoEnabledDirective->ApiDirectiveModule - - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelRecordingActivityDirective - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -ApiDirectiveModule->AdminDashboardRecordingsListDirective - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -ApiDirectiveModule->AdminDashboardTitleDirective - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -ApiDirectiveModule->AdminLoginErrorDirective - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -ApiDirectiveModule->AdminLoginTitleDirective - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -ApiDirectiveModule->AudioEnabledDirective - - - - - -LangDirective - -LangDirective - - - -ApiDirectiveModule->LangDirective - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -ApiDirectiveModule->LangOptionsDirective - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -ApiDirectiveModule->LivekitUrlDirective - - - - - -MinimalDirective - -MinimalDirective - - - -ApiDirectiveModule->MinimalDirective - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ApiDirectiveModule->ParticipantNameDirective - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ApiDirectiveModule->ParticipantPanelItemMuteButtonDirective - - - - - -PrejoinDirective - -PrejoinDirective - - - -ApiDirectiveModule->PrejoinDirective - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -ApiDirectiveModule->StreamDisplayAudioDetectionDirective - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -ApiDirectiveModule->StreamDisplayParticipantNameDirective - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -ApiDirectiveModule->StreamVideoControlsDirective - - - - - -TokenDirective - -TokenDirective - - - -ApiDirectiveModule->TokenDirective - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -ApiDirectiveModule->TokenErrorDirective - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ApiDirectiveModule->ToolbarActivitiesPanelButtonDirective - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ApiDirectiveModule->ToolbarBroadcastingButtonDirective - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ApiDirectiveModule->ToolbarChatPanelButtonDirective - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ApiDirectiveModule->ToolbarDisplayLogoDirective - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ApiDirectiveModule->ToolbarDisplayRoomNameDirective - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ApiDirectiveModule->ToolbarFullscreenButtonDirective - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ApiDirectiveModule->ToolbarLeaveButtonDirective - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ApiDirectiveModule->ToolbarParticipantsPanelButtonDirective - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ApiDirectiveModule->ToolbarRecordingButtonDirective - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ApiDirectiveModule->ToolbarScreenshareButtonDirective - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ApiDirectiveModule->ToolbarSettingsButtonDirective - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -ApiDirectiveModule->VideoEnabledDirective - - - - - - -
                                                                                                                                                                                          - -
                                                                                                                                                                                          - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - -

                                                                                                                                                                                          -

                                                                                                                                                                                          File

                                                                                                                                                                                          -

                                                                                                                                                                                          -

                                                                                                                                                                                          - projects/openvidu-components-angular/src/lib/directives/api/api.directive.module.ts -

                                                                                                                                                                                          - - - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          - - -
                                                                                                                                                                                          - - -
                                                                                                                                                                                          - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                          -
                                                                                                                                                                                          -

                                                                                                                                                                                          results matching ""

                                                                                                                                                                                          -
                                                                                                                                                                                            -
                                                                                                                                                                                            -
                                                                                                                                                                                            -

                                                                                                                                                                                            No results matching ""

                                                                                                                                                                                            -
                                                                                                                                                                                            -
                                                                                                                                                                                            -
                                                                                                                                                                                            - -
                                                                                                                                                                                            -
                                                                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule/dependencies.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule/dependencies.svg deleted file mode 100644 index 013a1a15..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/ApiDirectiveModule/dependencies.svg +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_ApiDirectiveModule - - - -cluster_ApiDirectiveModule_declarations - - - -cluster_ApiDirectiveModule_exports - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule - -ApiDirectiveModule - - - -ActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ActivitiesPanelRecordingActivityDirective->ApiDirectiveModule - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -AdminDashboardRecordingsListDirective->ApiDirectiveModule - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -AdminDashboardTitleDirective->ApiDirectiveModule - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -AdminLoginErrorDirective->ApiDirectiveModule - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -AdminLoginTitleDirective->ApiDirectiveModule - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -AudioEnabledDirective->ApiDirectiveModule - - - - - -LangDirective - -LangDirective - - - -LangDirective->ApiDirectiveModule - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -LangOptionsDirective->ApiDirectiveModule - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -LivekitUrlDirective->ApiDirectiveModule - - - - - -MinimalDirective - -MinimalDirective - - - -MinimalDirective->ApiDirectiveModule - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ParticipantNameDirective->ApiDirectiveModule - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ParticipantPanelItemMuteButtonDirective->ApiDirectiveModule - - - - - -PrejoinDirective - -PrejoinDirective - - - -PrejoinDirective->ApiDirectiveModule - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -StreamDisplayAudioDetectionDirective->ApiDirectiveModule - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -StreamDisplayParticipantNameDirective->ApiDirectiveModule - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -StreamVideoControlsDirective->ApiDirectiveModule - - - - - -TokenDirective - -TokenDirective - - - -TokenDirective->ApiDirectiveModule - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -TokenErrorDirective->ApiDirectiveModule - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ToolbarActivitiesPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ToolbarBroadcastingButtonDirective->ApiDirectiveModule - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ToolbarChatPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ToolbarDisplayLogoDirective->ApiDirectiveModule - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ToolbarDisplayRoomNameDirective->ApiDirectiveModule - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ToolbarFullscreenButtonDirective->ApiDirectiveModule - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ToolbarLeaveButtonDirective->ApiDirectiveModule - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ToolbarParticipantsPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ToolbarRecordingButtonDirective->ApiDirectiveModule - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ToolbarScreenshareButtonDirective->ApiDirectiveModule - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ToolbarSettingsButtonDirective->ApiDirectiveModule - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -VideoEnabledDirective->ApiDirectiveModule - - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelRecordingActivityDirective - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -ApiDirectiveModule->AdminDashboardRecordingsListDirective - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -ApiDirectiveModule->AdminDashboardTitleDirective - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -ApiDirectiveModule->AdminLoginErrorDirective - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -ApiDirectiveModule->AdminLoginTitleDirective - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -ApiDirectiveModule->AudioEnabledDirective - - - - - -LangDirective - -LangDirective - - - -ApiDirectiveModule->LangDirective - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -ApiDirectiveModule->LangOptionsDirective - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -ApiDirectiveModule->LivekitUrlDirective - - - - - -MinimalDirective - -MinimalDirective - - - -ApiDirectiveModule->MinimalDirective - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ApiDirectiveModule->ParticipantNameDirective - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ApiDirectiveModule->ParticipantPanelItemMuteButtonDirective - - - - - -PrejoinDirective - -PrejoinDirective - - - -ApiDirectiveModule->PrejoinDirective - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -ApiDirectiveModule->StreamDisplayAudioDetectionDirective - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -ApiDirectiveModule->StreamDisplayParticipantNameDirective - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -ApiDirectiveModule->StreamVideoControlsDirective - - - - - -TokenDirective - -TokenDirective - - - -ApiDirectiveModule->TokenDirective - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -ApiDirectiveModule->TokenErrorDirective - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ApiDirectiveModule->ToolbarActivitiesPanelButtonDirective - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ApiDirectiveModule->ToolbarBroadcastingButtonDirective - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ApiDirectiveModule->ToolbarChatPanelButtonDirective - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ApiDirectiveModule->ToolbarDisplayLogoDirective - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ApiDirectiveModule->ToolbarDisplayRoomNameDirective - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ApiDirectiveModule->ToolbarFullscreenButtonDirective - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ApiDirectiveModule->ToolbarLeaveButtonDirective - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ApiDirectiveModule->ToolbarParticipantsPanelButtonDirective - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ApiDirectiveModule->ToolbarRecordingButtonDirective - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ApiDirectiveModule->ToolbarScreenshareButtonDirective - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ApiDirectiveModule->ToolbarSettingsButtonDirective - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -ApiDirectiveModule->VideoEnabledDirective - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule.html deleted file mode 100644 index aba56e3c..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule.html +++ /dev/null @@ -1,641 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                            -
                                                                                                                                                                                            - - -
                                                                                                                                                                                            -
                                                                                                                                                                                            - - - - - -
                                                                                                                                                                                            -
                                                                                                                                                                                            - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_OpenViduComponentsDirectiveModule - - - -cluster_OpenViduComponentsDirectiveModule_declarations - - - -cluster_OpenViduComponentsDirectiveModule_exports - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule - -OpenViduComponentsDirectiveModule - - - -ActivitiesPanelDirective->OpenViduComponentsDirectiveModule - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -AdditionalPanelsDirective->OpenViduComponentsDirectiveModule - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -ChatPanelDirective->OpenViduComponentsDirectiveModule - - - - - -LayoutDirective - -LayoutDirective - - - -LayoutDirective->OpenViduComponentsDirectiveModule - - - - - -PanelDirective - -PanelDirective - - - -PanelDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -ParticipantPanelItemDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -ParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -ParticipantsPanelDirective->OpenViduComponentsDirectiveModule - - - - - -StreamDirective - -StreamDirective - - - -StreamDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -ToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -ToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarDirective - -ToolbarDirective - - - -ToolbarDirective->OpenViduComponentsDirectiveModule - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule->ActivitiesPanelDirective - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -OpenViduComponentsDirectiveModule->AdditionalPanelsDirective - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -OpenViduComponentsDirectiveModule->ChatPanelDirective - - - - - -LayoutDirective - -LayoutDirective - - - -OpenViduComponentsDirectiveModule->LayoutDirective - - - - - -PanelDirective - -PanelDirective - - - -OpenViduComponentsDirectiveModule->PanelDirective - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemDirective - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -OpenViduComponentsDirectiveModule->ParticipantsPanelDirective - - - - - -StreamDirective - -StreamDirective - - - -OpenViduComponentsDirectiveModule->StreamDirective - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective - - - - - -ToolbarDirective - -ToolbarDirective - - - -OpenViduComponentsDirectiveModule->ToolbarDirective - - - - - - -
                                                                                                                                                                                            - -
                                                                                                                                                                                            - - - -
                                                                                                                                                                                            -
                                                                                                                                                                                            - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                            -
                                                                                                                                                                                            -

                                                                                                                                                                                            results matching ""

                                                                                                                                                                                            -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              No results matching ""

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              - -
                                                                                                                                                                                              -
                                                                                                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule/dependencies.svg b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule/dependencies.svg deleted file mode 100644 index 2e100425..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/modules/OpenViduComponentsDirectiveModule/dependencies.svg +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_OpenViduComponentsDirectiveModule - - - -cluster_OpenViduComponentsDirectiveModule_declarations - - - -cluster_OpenViduComponentsDirectiveModule_exports - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule - -OpenViduComponentsDirectiveModule - - - -ActivitiesPanelDirective->OpenViduComponentsDirectiveModule - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -AdditionalPanelsDirective->OpenViduComponentsDirectiveModule - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -ChatPanelDirective->OpenViduComponentsDirectiveModule - - - - - -LayoutDirective - -LayoutDirective - - - -LayoutDirective->OpenViduComponentsDirectiveModule - - - - - -PanelDirective - -PanelDirective - - - -PanelDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -ParticipantPanelItemDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -ParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -ParticipantsPanelDirective->OpenViduComponentsDirectiveModule - - - - - -StreamDirective - -StreamDirective - - - -StreamDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -ToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -ToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarDirective - -ToolbarDirective - - - -ToolbarDirective->OpenViduComponentsDirectiveModule - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule->ActivitiesPanelDirective - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -OpenViduComponentsDirectiveModule->AdditionalPanelsDirective - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -OpenViduComponentsDirectiveModule->ChatPanelDirective - - - - - -LayoutDirective - -LayoutDirective - - - -OpenViduComponentsDirectiveModule->LayoutDirective - - - - - -PanelDirective - -PanelDirective - - - -OpenViduComponentsDirectiveModule->PanelDirective - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemDirective - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -OpenViduComponentsDirectiveModule->ParticipantsPanelDirective - - - - - -StreamDirective - -StreamDirective - - - -OpenViduComponentsDirectiveModule->StreamDirective - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective - - - - - -ToolbarDirective - -ToolbarDirective - - - -OpenViduComponentsDirectiveModule->ToolbarDirective - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/overview.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/overview.html deleted file mode 100644 index 0afa8e2a..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/overview.html +++ /dev/null @@ -1,1394 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                              -
                                                                                                                                                                                              - - -
                                                                                                                                                                                              -
                                                                                                                                                                                              - - - - -
                                                                                                                                                                                              -
                                                                                                                                                                                              - - - - - - -dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports - -cluster_ApiDirectiveModule - - - -cluster_ApiDirectiveModule_declarations - - - -cluster_ApiDirectiveModule_exports - - - -cluster_OpenViduComponentsDirectiveModule - - - -cluster_OpenViduComponentsDirectiveModule_declarations - - - -cluster_OpenViduComponentsDirectiveModule_exports - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule - -ApiDirectiveModule - - - -ActivitiesPanelBroadcastingActivityDirective->ApiDirectiveModule - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ActivitiesPanelRecordingActivityDirective->ApiDirectiveModule - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -AdminDashboardRecordingsListDirective->ApiDirectiveModule - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -AdminDashboardTitleDirective->ApiDirectiveModule - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -AdminLoginErrorDirective->ApiDirectiveModule - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -AdminLoginTitleDirective->ApiDirectiveModule - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -AudioEnabledDirective->ApiDirectiveModule - - - - - -LangDirective - -LangDirective - - - -LangDirective->ApiDirectiveModule - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -LangOptionsDirective->ApiDirectiveModule - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -LivekitUrlDirective->ApiDirectiveModule - - - - - -MinimalDirective - -MinimalDirective - - - -MinimalDirective->ApiDirectiveModule - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ParticipantNameDirective->ApiDirectiveModule - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ParticipantPanelItemMuteButtonDirective->ApiDirectiveModule - - - - - -PrejoinDirective - -PrejoinDirective - - - -PrejoinDirective->ApiDirectiveModule - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -StreamDisplayAudioDetectionDirective->ApiDirectiveModule - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -StreamDisplayParticipantNameDirective->ApiDirectiveModule - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -StreamVideoControlsDirective->ApiDirectiveModule - - - - - -TokenDirective - -TokenDirective - - - -TokenDirective->ApiDirectiveModule - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -TokenErrorDirective->ApiDirectiveModule - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ToolbarActivitiesPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ToolbarAdditionalButtonsPossitionDirective->ApiDirectiveModule - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ToolbarBackgroundEffectsButtonDirective->ApiDirectiveModule - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ToolbarBroadcastingButtonDirective->ApiDirectiveModule - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ToolbarChatPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ToolbarDisplayLogoDirective->ApiDirectiveModule - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ToolbarDisplayRoomNameDirective->ApiDirectiveModule - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ToolbarFullscreenButtonDirective->ApiDirectiveModule - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ToolbarLeaveButtonDirective->ApiDirectiveModule - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ToolbarParticipantsPanelButtonDirective->ApiDirectiveModule - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ToolbarRecordingButtonDirective->ApiDirectiveModule - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ToolbarScreenshareButtonDirective->ApiDirectiveModule - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ToolbarSettingsButtonDirective->ApiDirectiveModule - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -VideoEnabledDirective->ApiDirectiveModule - - - - - -ActivitiesPanelBroadcastingActivityDirective - -ActivitiesPanelBroadcastingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelBroadcastingActivityDirective - - - - - -ActivitiesPanelRecordingActivityDirective - -ActivitiesPanelRecordingActivityDirective - - - -ApiDirectiveModule->ActivitiesPanelRecordingActivityDirective - - - - - -AdminDashboardRecordingsListDirective - -AdminDashboardRecordingsListDirective - - - -ApiDirectiveModule->AdminDashboardRecordingsListDirective - - - - - -AdminDashboardTitleDirective - -AdminDashboardTitleDirective - - - -ApiDirectiveModule->AdminDashboardTitleDirective - - - - - -AdminLoginErrorDirective - -AdminLoginErrorDirective - - - -ApiDirectiveModule->AdminLoginErrorDirective - - - - - -AdminLoginTitleDirective - -AdminLoginTitleDirective - - - -ApiDirectiveModule->AdminLoginTitleDirective - - - - - -AudioEnabledDirective - -AudioEnabledDirective - - - -ApiDirectiveModule->AudioEnabledDirective - - - - - -LangDirective - -LangDirective - - - -ApiDirectiveModule->LangDirective - - - - - -LangOptionsDirective - -LangOptionsDirective - - - -ApiDirectiveModule->LangOptionsDirective - - - - - -LivekitUrlDirective - -LivekitUrlDirective - - - -ApiDirectiveModule->LivekitUrlDirective - - - - - -MinimalDirective - -MinimalDirective - - - -ApiDirectiveModule->MinimalDirective - - - - - -ParticipantNameDirective - -ParticipantNameDirective - - - -ApiDirectiveModule->ParticipantNameDirective - - - - - -ParticipantPanelItemMuteButtonDirective - -ParticipantPanelItemMuteButtonDirective - - - -ApiDirectiveModule->ParticipantPanelItemMuteButtonDirective - - - - - -PrejoinDirective - -PrejoinDirective - - - -ApiDirectiveModule->PrejoinDirective - - - - - -StreamDisplayAudioDetectionDirective - -StreamDisplayAudioDetectionDirective - - - -ApiDirectiveModule->StreamDisplayAudioDetectionDirective - - - - - -StreamDisplayParticipantNameDirective - -StreamDisplayParticipantNameDirective - - - -ApiDirectiveModule->StreamDisplayParticipantNameDirective - - - - - -StreamVideoControlsDirective - -StreamVideoControlsDirective - - - -ApiDirectiveModule->StreamVideoControlsDirective - - - - - -TokenDirective - -TokenDirective - - - -ApiDirectiveModule->TokenDirective - - - - - -TokenErrorDirective - -TokenErrorDirective - - - -ApiDirectiveModule->TokenErrorDirective - - - - - -ToolbarActivitiesPanelButtonDirective - -ToolbarActivitiesPanelButtonDirective - - - -ApiDirectiveModule->ToolbarActivitiesPanelButtonDirective - - - - - -ToolbarAdditionalButtonsPossitionDirective - -ToolbarAdditionalButtonsPossitionDirective - - - -ApiDirectiveModule->ToolbarAdditionalButtonsPossitionDirective - - - - - -ToolbarBackgroundEffectsButtonDirective - -ToolbarBackgroundEffectsButtonDirective - - - -ApiDirectiveModule->ToolbarBackgroundEffectsButtonDirective - - - - - -ToolbarBroadcastingButtonDirective - -ToolbarBroadcastingButtonDirective - - - -ApiDirectiveModule->ToolbarBroadcastingButtonDirective - - - - - -ToolbarChatPanelButtonDirective - -ToolbarChatPanelButtonDirective - - - -ApiDirectiveModule->ToolbarChatPanelButtonDirective - - - - - -ToolbarDisplayLogoDirective - -ToolbarDisplayLogoDirective - - - -ApiDirectiveModule->ToolbarDisplayLogoDirective - - - - - -ToolbarDisplayRoomNameDirective - -ToolbarDisplayRoomNameDirective - - - -ApiDirectiveModule->ToolbarDisplayRoomNameDirective - - - - - -ToolbarFullscreenButtonDirective - -ToolbarFullscreenButtonDirective - - - -ApiDirectiveModule->ToolbarFullscreenButtonDirective - - - - - -ToolbarLeaveButtonDirective - -ToolbarLeaveButtonDirective - - - -ApiDirectiveModule->ToolbarLeaveButtonDirective - - - - - -ToolbarParticipantsPanelButtonDirective - -ToolbarParticipantsPanelButtonDirective - - - -ApiDirectiveModule->ToolbarParticipantsPanelButtonDirective - - - - - -ToolbarRecordingButtonDirective - -ToolbarRecordingButtonDirective - - - -ApiDirectiveModule->ToolbarRecordingButtonDirective - - - - - -ToolbarScreenshareButtonDirective - -ToolbarScreenshareButtonDirective - - - -ApiDirectiveModule->ToolbarScreenshareButtonDirective - - - - - -ToolbarSettingsButtonDirective - -ToolbarSettingsButtonDirective - - - -ApiDirectiveModule->ToolbarSettingsButtonDirective - - - - - -VideoEnabledDirective - -VideoEnabledDirective - - - -ApiDirectiveModule->VideoEnabledDirective - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule - -OpenViduComponentsDirectiveModule - - - -ActivitiesPanelDirective->OpenViduComponentsDirectiveModule - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -AdditionalPanelsDirective->OpenViduComponentsDirectiveModule - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -ChatPanelDirective->OpenViduComponentsDirectiveModule - - - - - -LayoutDirective - -LayoutDirective - - - -LayoutDirective->OpenViduComponentsDirectiveModule - - - - - -PanelDirective - -PanelDirective - - - -PanelDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -ParticipantPanelItemDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -ParticipantPanelItemElementsDirective->OpenViduComponentsDirectiveModule - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -ParticipantsPanelDirective->OpenViduComponentsDirectiveModule - - - - - -StreamDirective - -StreamDirective - - - -StreamDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -ToolbarAdditionalButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -ToolbarAdditionalPanelButtonsDirective->OpenViduComponentsDirectiveModule - - - - - -ToolbarDirective - -ToolbarDirective - - - -ToolbarDirective->OpenViduComponentsDirectiveModule - - - - - -ActivitiesPanelDirective - -ActivitiesPanelDirective - - - -OpenViduComponentsDirectiveModule->ActivitiesPanelDirective - - - - - -AdditionalPanelsDirective - -AdditionalPanelsDirective - - - -OpenViduComponentsDirectiveModule->AdditionalPanelsDirective - - - - - -ChatPanelDirective - -ChatPanelDirective - - - -OpenViduComponentsDirectiveModule->ChatPanelDirective - - - - - -LayoutDirective - -LayoutDirective - - - -OpenViduComponentsDirectiveModule->LayoutDirective - - - - - -PanelDirective - -PanelDirective - - - -OpenViduComponentsDirectiveModule->PanelDirective - - - - - -ParticipantPanelItemDirective - -ParticipantPanelItemDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemDirective - - - - - -ParticipantPanelItemElementsDirective - -ParticipantPanelItemElementsDirective - - - -OpenViduComponentsDirectiveModule->ParticipantPanelItemElementsDirective - - - - - -ParticipantsPanelDirective - -ParticipantsPanelDirective - - - -OpenViduComponentsDirectiveModule->ParticipantsPanelDirective - - - - - -StreamDirective - -StreamDirective - - - -OpenViduComponentsDirectiveModule->StreamDirective - - - - - -ToolbarAdditionalButtonsDirective - -ToolbarAdditionalButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalButtonsDirective - - - - - -ToolbarAdditionalPanelButtonsDirective - -ToolbarAdditionalPanelButtonsDirective - - - -OpenViduComponentsDirectiveModule->ToolbarAdditionalPanelButtonsDirective - - - - - -ToolbarDirective - -ToolbarDirective - - - -OpenViduComponentsDirectiveModule->ToolbarDirective - - - - - - -
                                                                                                                                                                                              - -
                                                                                                                                                                                              - - - -
                                                                                                                                                                                              -
                                                                                                                                                                                              - -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              - 2 Modules -

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              13 Components

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              45 Directives

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              6 Injectables

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              1 Pipe

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              1 Class

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              -

                                                                                                                                                                                              21 Interfaces

                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              -
                                                                                                                                                                                              - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                              -
                                                                                                                                                                                              -

                                                                                                                                                                                              results matching ""

                                                                                                                                                                                              -
                                                                                                                                                                                                -
                                                                                                                                                                                                -
                                                                                                                                                                                                -

                                                                                                                                                                                                No results matching ""

                                                                                                                                                                                                -
                                                                                                                                                                                                -
                                                                                                                                                                                                -
                                                                                                                                                                                                - -
                                                                                                                                                                                                -
                                                                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/pipes/RemoteParticipantTracksPipe.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/pipes/RemoteParticipantTracksPipe.html deleted file mode 100644 index d28b9123..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/pipes/RemoteParticipantTracksPipe.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                                -
                                                                                                                                                                                                - - -
                                                                                                                                                                                                -
                                                                                                                                                                                                - - - - - - - - - - - - - - - -
                                                                                                                                                                                                -
                                                                                                                                                                                                - -

                                                                                                                                                                                                -

                                                                                                                                                                                                File

                                                                                                                                                                                                -

                                                                                                                                                                                                -

                                                                                                                                                                                                - projects/openvidu-components-angular/src/lib/pipes/participant.pipe.ts -

                                                                                                                                                                                                - - -

                                                                                                                                                                                                -

                                                                                                                                                                                                Description

                                                                                                                                                                                                -

                                                                                                                                                                                                -

                                                                                                                                                                                                -

                                                                                                                                                                                                The RemoteParticipantTracksPipe allows us to get all the tracks from all remote participants. -This is used to display the tracks in the videoconference layout.

                                                                                                                                                                                                - -

                                                                                                                                                                                                - - -
                                                                                                                                                                                                -

                                                                                                                                                                                                Metadata

                                                                                                                                                                                                - - - - - - - - -
                                                                                                                                                                                                - -
                                                                                                                                                                                                - -

                                                                                                                                                                                                - Methods -

                                                                                                                                                                                                - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                - - - transform - - -
                                                                                                                                                                                                -transform(participants: ParticipantModel[]) -
                                                                                                                                                                                                - -
                                                                                                                                                                                                - Parameters : - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                NameTypeOptional
                                                                                                                                                                                                participants - ParticipantModel[] - - No -
                                                                                                                                                                                                -
                                                                                                                                                                                                - -
                                                                                                                                                                                                - -
                                                                                                                                                                                                -
                                                                                                                                                                                                -
                                                                                                                                                                                                - -
                                                                                                                                                                                                - - - -
                                                                                                                                                                                                - - - - - - - - - - -
                                                                                                                                                                                                -
                                                                                                                                                                                                -

                                                                                                                                                                                                results matching ""

                                                                                                                                                                                                -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  -

                                                                                                                                                                                                  No results matching ""

                                                                                                                                                                                                  -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  - -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/properties.html b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/properties.html deleted file mode 100644 index fa153734..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/properties.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - OpenVidu Components Angular Documentation - - - - - - - - - - - - - - -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  - - -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                  • - Version : 3.0.0-beta3
                                                                                                                                                                                                  • -
                                                                                                                                                                                                  - - - - - -
                                                                                                                                                                                                  -
                                                                                                                                                                                                  -

                                                                                                                                                                                                  results matching ""

                                                                                                                                                                                                  -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    No results matching ""

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap-card.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap-card.css deleted file mode 100644 index 0869c689..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap-card.css +++ /dev/null @@ -1,219 +0,0 @@ -.card { - position: relative; - display: block; - margin-bottom: 20px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; -} - -.card-block { - padding: 15px; -} -.card-block:before, .card-block:after { - content: " "; - display: table; -} -.card-block:after { - clear: both; -} - -.card-title { - margin: 5px; - margin-bottom: 2px; - text-align: center; -} - -.card-subtitle { - margin-top: -10px; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; - margin-top: 10px; -} - -.card-link:hover { - text-decoration: none; -} -.card-link + .card-link { - margin-left: 15px; -} - -.card > .list-group:first-child .list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} -.card > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.card-header { - padding: 10px 15px; - background-color: #f5f5f5; - border-bottom: 1px solid #ddd; -} -.card-header:before, .card-header:after { - content: " "; - display: table; -} -.card-header:after { - clear: both; -} -.card-header:first-child { - border-radius: 4px 4px 0 0; -} - -.card-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; -} -.card-footer:before, .card-footer:after { - content: " "; - display: table; -} -.card-footer:after { - clear: both; -} -.card-footer:last-child { - border-radius: 0 0 4px 4px; -} - -.card-header-tabs { - margin-right: -5px; - margin-bottom: -10px; - margin-left: -5px; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -5px; - margin-left: -5px; -} - -.card-primary { - background-color: #337ab7; - border-color: #337ab7; -} -.card-primary .card-header, -.card-primary .card-footer { - background-color: transparent; -} - -.card-success { - background-color: #5cb85c; - border-color: #5cb85c; -} -.card-success .card-header, -.card-success .card-footer { - background-color: transparent; -} - -.card-info { - background-color: #5bc0de; - border-color: #5bc0de; -} -.card-info .card-header, -.card-info .card-footer { - background-color: transparent; -} - -.card-warning { - background-color: #f0ad4e; - border-color: #f0ad4e; -} -.card-warning .card-header, -.card-warning .card-footer { - background-color: transparent; -} - -.card-danger { - background-color: #d9534f; - border-color: #d9534f; -} -.card-danger .card-header, -.card-danger .card-footer { - background-color: transparent; -} - -.card-outline-primary { - background-color: transparent; - border-color: #337ab7; -} - -.card-outline-secondary { - background-color: transparent; - border-color: #ccc; -} - -.card-outline-info { - background-color: transparent; - border-color: #5bc0de; -} - -.card-outline-success { - background-color: transparent; - border-color: #5cb85c; -} - -.card-outline-warning { - background-color: transparent; - border-color: #f0ad4e; -} - -.card-outline-danger { - background-color: transparent; - border-color: #d9534f; -} - -.card-inverse .card-header, -.card-inverse .card-footer { - border-color: rgba(255, 255, 255, 0.2); -} -.card-inverse .card-header, -.card-inverse .card-footer, -.card-inverse .card-title, -.card-inverse .card-blockquote { - color: #fff; -} -.card-inverse .card-link, -.card-inverse .card-text, -.card-inverse .card-subtitle, -.card-inverse .card-blockquote .blockquote-footer { - color: rgba(255, 255, 255, 0.65); -} -.card-inverse .card-link:hover, .card-inverse .card-link:focus { - color: #fff; -} - -.card-blockquote { - padding: 0; - margin-bottom: 0; - border-left: 0; -} - -.card-img { - border-radius: .25em; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 15px; -} - -.card-img-top { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.card-img-bottom { - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap.min.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap.min.css deleted file mode 100644 index 86317acb..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.2.0 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select,.input-group>:not(:first-child):not(.dropdown-menu):not(.form-floating):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.375rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.375rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check:focus+.btn,.btn:focus{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:active+.btn,.btn-check:checked+.btn,.btn.active,.btn.show,.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:active+.btn:focus,.btn-check:checked+.btn:focus,.btn.active:focus,.btn.show:focus,.btn:active:focus{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:1000;display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(var(--bs-nav-tabs-border-width) * -1);background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(var(--bs-nav-tabs-border-width) * -1);border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:#000;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width) * -1) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(var(--bs-list-group-border-width) * -1);border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{position:absolute;z-index:1090;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(var(--bs-toast-padding-x) * -.5);margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(var(--bs-modal-header-padding-y) * -.5) calc(var(--bs-modal-header-padding-x) * -.5) calc(var(--bs-modal-header-padding-y) * -.5) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:var(--bs-heading-color);--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(var(--bs-popover-arrow-width) * -.5);content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(var(--bs-offcanvas-padding-y) * -.5);margin-right:calc(var(--bs-offcanvas-padding-x) * -.5);margin-bottom:calc(var(--bs-offcanvas-padding-y) * -.5)}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/compodoc.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/compodoc.css deleted file mode 100644 index 684bd9a4..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/compodoc.css +++ /dev/null @@ -1,1124 +0,0 @@ -body { - position: absolute; - width: 100%; - height: 100%; - font-family: 'Roboto', sans-serif; - --bs-body-font-size: 0.9rem; -} - -/* roboto-300 - latin */ - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url('../fonts/roboto-v15-latin-300.eot'); - /* IE9 Compat Modes */ - src: - local('Roboto Light'), - local('Roboto-Light'), - url('../fonts/roboto-v15-latin-300.eot?#iefix') format('embedded-opentype'), - /* IE6-IE8 */ url('../fonts/roboto-v15-latin-300.woff2') format('woff2'), - /* Super Modern Browsers */ url('../fonts/roboto-v15-latin-300.woff') format('woff'), - /* Modern Browsers */ url('../fonts/roboto-v15-latin-300.ttf') format('truetype'), - /* Safari, Android, iOS */ url('../fonts/roboto-v15-latin-300.svg#Roboto') format('svg'); - /* Legacy iOS */ -} - -/* roboto-regular - latin */ - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url('../fonts/roboto-v15-latin-regular.eot'); - /* IE9 Compat Modes */ - src: - local('Roboto'), - local('Roboto-Regular'), - url('../fonts/roboto-v15-latin-regular.eot?#iefix') format('embedded-opentype'), - /* IE6-IE8 */ url('../fonts/roboto-v15-latin-regular.woff2') format('woff2'), - /* Super Modern Browsers */ url('../fonts/roboto-v15-latin-regular.woff') format('woff'), - /* Modern Browsers */ url('../fonts/roboto-v15-latin-regular.ttf') format('truetype'), - /* Safari, Android, iOS */ url('../fonts/roboto-v15-latin-regular.svg#Roboto') format('svg'); - /* Legacy iOS */ -} - -/* roboto-700 - latin */ - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: url('../fonts/roboto-v15-latin-700.eot'); - /* IE9 Compat Modes */ - src: - local('Roboto Bold'), - local('Roboto-Bold'), - url('../fonts/roboto-v15-latin-700.eot?#iefix') format('embedded-opentype'), - /* IE6-IE8 */ url('../fonts/roboto-v15-latin-700.woff2') format('woff2'), - /* Super Modern Browsers */ url('../fonts/roboto-v15-latin-700.woff') format('woff'), - /* Modern Browsers */ url('../fonts/roboto-v15-latin-700.ttf') format('truetype'), - /* Safari, Android, iOS */ url('../fonts/roboto-v15-latin-700.svg#Roboto') format('svg'); - /* Legacy iOS */ -} - -h1 { - font-size: 26px; -} - -h2 { - font-size: 22px; -} - -h3 { - font-size: 20px; - font-weight: bold; -} - -h4, -h5 { - font-size: 18px; -} - -h6 { - font-size: 16px; -} - -a[href] { - cursor: pointer; -} - -/** - * Mobile navbar - */ - -.navbar { - min-height: 50px; -} - -.navbar-brand { - height: 50px; - font-size: 14px; - line-height: 20px; - padding: 15px; -} - -.navbar-static-top { - margin-bottom: 0; - height: 50px; -} - -/** - * Main container - */ - -.container-fluid { - overflow-y: hidden; - overflow-x: hidden; -} - -.container-fluid.main { - height: 100%; - padding: 0; -} - -.tab-content.overview { - margin-top: 50px; - margin-left: 15px; -} - -.container-fluid.modules, -.container-fluid.components, -.container-fluid.directives, -.container-fluid.classes, -.container-fluid.injectables, -.container-fluid.pipes, -.content.routes table { - margin-top: 25px; -} - -.container-fluid.modules { - width: 100%; - overflow-y: auto; -} - -.container-fluid.module { - padding: 0; - margin-top: 0; -} - -.container-fluid.module h3 a { - margin-left: 10px; - color: #333; -} - -.row.main { - height: 100%; - margin: 0; -} - -/** - * Copyright - */ - -.copyright { - margin: 0; - padding: 15px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - z-index: 1; -} - -.copyright img { - width: 80px; - margin-top: 10px; -} - -.copyright a { - color: #009dff; - text-decoration: underline; -} - -/** - * Content - */ - -.content { - height: 100%; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - width: calc(100% - 320px); - position: absolute; - top: 0; - left: 320px; - padding: 15px 30px; -} - -.content > h1:first-of-type { - margin-top: 15px; -} - -.content > h3:first-of-type { - margin-top: 5px; -} - -.content.readme h1:first-of-type { - margin-top: 0; -} - -.content table { - margin-top: 20px; -} - -.content-data { - display: flex; - flex-direction: column; - height: 100%; -} - -.content-data .tab-content { - flex: 1; -} - -.content-data .tab-pane { - height: 100%; -} - -.content-data .tab-pane.active { - opacity: 1; -} - -.content-data .exampleContainer { - height: 100%; - width: 100%; -} - -/** - * Icons - */ - -.glyphicon, -.icon { - margin-right: 10px; -} - -/** - * Menu - */ - -#book-search-input { - padding: 6px; - transition: top 0.5s ease; - background: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.07); - border-top: 1px solid rgba(0, 0, 0, 0.07); - margin-bottom: 5px; - margin-top: -1px; -} - -#book-search-input input, -#book-search-input input:focus, -#book-search-input input:hover { - width: 100%; - background: 0 0; - border: 1px solid transparent; - box-shadow: none; - outline: 0; - line-height: 22px; - padding: 7px 7px; - color: inherit; -} - -.panel-body { - padding: 0px; -} - -.panel-group .panel-heading + .panel-collapse > .list-group, -.panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 0; -} - -.panel-body table tr td { - padding-left: 15px; -} - -.panel-body .table { - margin-bottom: 0px; -} - -.panel-group .panel:first-child { - border-top: 0; -} - -.menu { - background: #fafafa; - border-right: 1px solid #e7e7e7; - height: 100%; - padding: 0; - width: 320px; - overflow-y: auto; - -webkit-overflow-scrolling: touch; -} - -.menu ul.list { - list-style: none; - margin: 0; - padding: 0; -} - -.menu ul.list li a { - display: block; - padding: 10px 15px; - border-bottom: none; - color: #364149; - background: 0 0; - text-overflow: ellipsis; - text-decoration: none; - overflow: hidden; - white-space: nowrap; - position: relative; -} - -.menu ul.list li a.active { - color: #008cff; -} - -.menu ul.list li.divider { - height: 1px; - margin: 7px 0; - overflow: hidden; - background: rgba(0, 0, 0, 0.07); -} - -.menu ul.list li.chapter ul.links { - padding-left: 20px; -} - -.menu ul.list li.for-chapter2 { - padding-left: 0; -} - -.menu ul.list li.for-chapter3 { - padding-left: 20px; -} - -.menu ul.list li.for-chapter4 { - padding-left: 40px; -} - -.menu ul.list li.for-chapter5 { - padding-left: 60px; -} - -.menu ul.list li.chapter .simple { - padding: 10px 15px; - position: relative; -} - -.menu ul.list li.chapter .inner .simple { - padding-left: 35px; -} - -.menu ul.list li.chapter .inner ul.links { - padding-left: 40px; -} - -.menu ul.list li.chapter.additional .inner ul.links { - padding-left: 20px; -} - -.menu .panel-group { - width: 100%; - height: 100%; - overflow-y: auto; -} - -.menu .panel-default { - border-right: none; - border-left: none; - border-bottom: none; -} - -.menu .panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: none; - overflow-y: auto; - max-height: 350px; -} - -.menu .panel-default:last-of-type { - border-bottom: 1px solid #ddd; -} - -.panel-group .panel + .panel { - margin-top: 0; -} - -.panel-group .panel { - z-index: 2; - position: relative; - border-radius: 0; - box-shadow: none; - border-left: 0; - border-right: 0; -} - -.menu a { - color: #3c3c3c; -} - -.xs-menu ul.list li:nth-child(2) { - margin: 0; - background: none; -} - -.menu ul.list li:nth-child(2) { - margin: 0; - background: none; -} - -.menu .title { - padding: 8px 0; -} - -.menu-toggler { - cursor: pointer; -} - -.menu-toggler .ion-ios-arrow-down, -.menu-toggler .ion-ios-arrow-up { - cursor: pointer; - padding: 5px 10px; - font-size: 16px; - position: absolute; - right: 0; - top: 7px; -} - -.overview .card-title .icon { - font-size: 50px; -} - -.overview .card-text a { - text-decoration: underline; - color: black; -} - -.overview .col-sm-3 { - width: 200px; -} - -.breadcrumb { - background: none; - padding-left: 0 !important; - margin-bottom: 10px; - font-size: 24px; - padding-top: 0; - list-style: none; -} - -ol.breadcrumb { - list-style-type: none !important; -} - -.breadcrumb a { - text-decoration: underline; - color: #333; -} - -.comment { - margin: 15px 0; -} - -.io-description { - margin: 10px 0; -} - -.io-file { - margin: 20px 0; -} - -.navbar .btn-menu { - position: absolute; - right: 0; - top: 0; - margin: 6px 10px; -} - -.content ul.nav { - padding-left: 0; -} - -.xs-menu { - height: calc(100% - 50px); - display: none; - width: 100%; - overflow-y: scroll; - z-index: 1; - top: 50px; - position: absolute; -} - -.xs-menu .copyright { - margin-top: 20px; - position: relative; -} - -.tab-source-code { - padding: 10px 0; -} - -pre { - padding: 12px 12px; - border: none; - background: #23241f; -} - -code { - background: none; - padding: 2px 0; -} - -@media (max-width: 767px) { - .container-fluid.main { - height: calc(100% - 50px); - } - - .content { - width: 100%; - left: 0; - position: relative; - } - - .menu ul.list li.title { - display: none; - } -} - -/** - * Search - */ - -.search-results { - display: none; - max-width: 800px; - margin: 0 auto; - padding: 20px 15px 40px 15px; -} - -.search-results .no-results { - display: none; -} - -.with-search .search-results { - display: block; -} - -.with-search .content-data { - display: none; -} - -.with-search .xs-menu { - height: 51px; -} - -.with-search .xs-menu nav { - display: none; -} - -.search-results.no-results .has-results { - display: none; -} - -.search-results.no-results .no-results { - display: block; -} - -.search-results .search-results-title { - text-transform: uppercase; - text-align: center; - font-weight: 200; - margin-bottom: 35px; - opacity: 0.6; -} - -.search-results ul.search-results-list { - list-style-type: none; - padding-left: 0; -} - -.search-results ul.search-results-list li { - margin-bottom: 1.5rem; - padding-bottom: 0.5rem; -} - -.search-results ul.search-results-list li p em { - background-color: rgba(255, 220, 0, 0.4); - font-style: normal; -} - -.search-results-item { - margin-bottom: 1rem !important; - margin-top: 1rem; - padding-bottom: 0 !important; -} - -.search-results-item a { - font-size: 18px; -} - -.search-results-group, -.search-results-group .search-results-list { - margin-bottom: 0 !important; -} - -.search-results-group h3 { - margin-top: 10px; -} - -.jsdoc-params { - list-style: square; - margin-top: 10px; - margin-bottom: 0 !important; -} - -.jsdoc-params li { - padding-bottom: 10px; -} - -.jsdoc-example-ul ul { - padding-left: 20px; -} - -example-url { - display: none; -} - -i { - font-style: italic; -} - -.coverage a { - color: #333; - text-decoration: underline; -} - -.coverage tr.low, -.coverage td.low { - background: rgba(216, 96, 75, 0.75); -} - -.coverage tr.medium, -.coverage td.medium { - background: rgba(218, 178, 38, 0.75); -} - -.coverage tr.good, -.coverage td.good { - background: rgba(143, 189, 8, 0.75); -} - -.coverage tr.very-good, -.coverage td.very-good { - background: rgba(77, 199, 31, 0.75); -} - -.coverage td.uncovered { - background: rgba(221, 221, 221, 0.75); -} - -.coverage-header { - background: #fafafa; -} - -thead.coverage-header > tr > td, -thead.coverage-header > tr > th { - border-bottom-width: 0; -} - -th[role='columnheader'].statements:not(.no-sort):after { - margin-left: 10px; -} - -.coverage-count { - color: grey; - font-size: 12px; - margin-left: 10px; - display: inline-block; - width: 50px; -} - -.coverage-badge { - background: #5d5d5d; - border-radius: 4px; - display: inline-block; - color: white; - padding: 4px; - padding-right: 0; - padding-left: 8px; -} - -.coverage-badge .count { - padding: 6px; - margin-left: 5px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.coverage-badge .count.low { - background: #d8624c; -} - -.coverage-badge .count.medium { - background: #dab226; -} - -.coverage-badge .count.good { - background: #8fbd08; -} - -.coverage-badge .count.very-good { - background: #4dc71f; -} - -.content ol { - list-style-type: decimal; - margin-top: 0; - padding-left: 20px; - margin-bottom: 16px; -} - -.content ul { - list-style: disc; - margin-top: 0; - padding-left: 20px; - margin-bottom: 16px; -} - -.content ul.list-group { - padding-left: 0; -} - -.content ul.list-group li.list-group-item a { - display: inline-block; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.content ul ul { - list-style-type: circle; -} - -.compodoc-table { - width: inherit; -} - -.compodoc-table thead { - font-weight: bold; -} - -.modifier { - background: #9a9a9a; - padding: 1px 5px; - color: white; - border-radius: 4px; -} - -.modifier:empty { - display: none; -} - -.modifier-icon { - color: #c7254e; -} - -.modifier-icon.method { - color: white; - background: #c7254e; - padding: 4px; - border-radius: 8px; - font-size: 10px; - margin-right: 2px; -} - -.modifier-icon.method.square { - border-radius: 4px; -} - -.modifier-icon.method.export { - display: none; -} - -.modifier-icon.method .ion-ios-radio-button-off, -.modifier-icon.method .ion-ios-square-outline { - display: none; -} - -.modifier-icon.method .ion-ios-lock { - margin-right: 0; -} - -.modifier-icon.ion-ios-reset { - margin-right: 0; -} - -/** - * Modules - */ - -.card-module { - min-height: 323px; -} - -/** - * Routes graph - */ - -.node text { - font-size: 12px; -} - -.node .icon { - font-size: 15px; - cursor: default; -} - -.node .icon.has-children { - cursor: pointer; -} - -path.link { - fill: none; - stroke: #9ecae1; - stroke-width: 1.5px; -} - -#body-routes a { - text-decoration: underline; -} - -#body-routes svg { - overflow: visible; -} - -/** - * Miscellaneous - */ - -.content.miscellaneous h2 { - margin-bottom: 20px; -} - -.content.miscellaneous h4 { - padding-top: 20px; -} - -/* highlight line */ - -.line-highlight { - background: linear-gradient(to right, hsla(0, 0%, 100%, 0.1) 70%, hsla(24, 20%, 50%, 0)); -} - -#tree-container { - width: 100%; - height: 100%; -} - -#tree { - position: relative; -} - -.tree-legend { - position: absolute; - bottom: 10px; - left: 10px; - border: 1px solid #ddd; - padding: 5px 10px; -} - -.tree-legend .title { - margin-bottom: 8px; -} - -.tree-legend .color { - width: 20px; - height: 12px; - display: inline-block; - margin-right: 5px; -} - -.tree-legend .htmlelement { - background: #97c2fc; -} - -.tree-legend .component { - background: #fb7e81; -} - -.tree-legend .directive { - background: #ff9800; -} - -#module-graph-svg { - width: 100%; - height: 250px; -} - -#module-graph-svg svg { - width: 100%; - height: 100%; -} - -.content ul.type-parameters { - margin-bottom: 5px; -} - -table.params { - width: 100%; - margin: 10px 0; - border-spacing: 0; - border: 0; - border-collapse: collapse; -} - -table.params thead { - background: #f5f5f5; - color: #525252; -} - -table.params td { - padding: 4px; - border: solid 1px #ddd; -} - -table.params td p { - margin: 0; -} - -.img-responsive { - display: inline-block; -} - -.index-table h6 { - margin-top: 5px; - margin-bottom: 5px; -} - -ul.index-list { - list-style: none; - padding: 0; - column-gap: 20px; - column-count: 3; - line-height: 25px; - margin-bottom: 0; -} - -.no-graph { - text-align: center; - height: 175px; - line-height: 175px; -} - -.name a { - display: none; - color: #6e6e6e; - margin-left: 5px; -} - -.name:hover a { - display: inline-block; -} - -.accessor b { - color: #808080; - margin-right: 8px; - font-weight: normal; -} - -.module-graph-container { - position: relative; -} - -.module-graph-container .size-buttons { - margin-top: 10px; -} - -.module-graph-fullscreen-btn { - position: absolute; - right: 5px; - top: 0; - cursor: pointer; -} - -/** - * Dependencies - */ - -.package-dependencies ul { - list-style: none; - margin: 0; -} - -.package-dependencies li { - margin: 5px 0; -} - -.deprecated { - color: #e73440; -} -.deprecated p { - margin-bottom: 0; -} -.deprecated-name, -.deprecated-name:hover { - text-decoration: line-through !important; -} -.deprecated-name::before { - text-decoration: none; - display: inline-block; -} - -/** - * Dark mode - */ - -.dark-mode-switch { - position: absolute; - top: 70px; - right: 15px; - display: inline-block; - width: 60px; - height: 34px; -} - -.dark-mode-switch input { - opacity: 0; - width: 0; - height: 0; -} - -.dark-mode-switch .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #5cc0ae80; - border-radius: 34px; - transition: 0.6s; -} - -.dark-mode-switch .slider:before { - position: absolute; - content: ''; - height: 26px; - width: 26px; - left: 4px; - bottom: 4px; - background-color: white; - border-radius: 50%; - transition: 0.4s; -} - -.dark-mode-switch input:checked + .slider { - background-color: #f1c40fb8; -} - -.dark-mode-switch.dark .slider-icon { - stroke: black; -} - -.dark-mode-switch input:checked + .slider:before { - transform: translateX(26px); -} - -.dark-mode-switch .slider-icon { - transform: rotate(250deg); - position: absolute; - right: 6px; - top: 7px; - stroke: white; -} - -@media (min-width: 768px) { - .dark-mode-switch { - top: 15px; - } -} - -ul.properties-list { - list-style: none; - padding-left: 0; -} -.properties-list li { - margin-bottom: 10px; -} - -.fade.show { - opacity: 1; -} - -.nav-tabs ::marker { - content: ''; -} - -.content { - --bs-link-color: #337ab7; -} - -.table-sm > :not(caption) > * > * { - padding: 0.5rem 0.5rem; -} - -.search-results a { - text-decoration: none; -} - -.module-graph-container .btn-default { - --bs-btn-border-color: #ccc; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/dark.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/dark.css deleted file mode 100644 index aeefc97f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/dark.css +++ /dev/null @@ -1,121 +0,0 @@ -body.dark { - background: #212121; - color: #fafafa; -} - -.dark code { - color: #e09393; -} - -.dark a, -.dark .menu ul.list li a.active { - color: #7fc9ff; -} - -.dark .menu { - background: #212121; - border-right: 1px solid #444; -} - -.dark .menu ul.list li a { - color: #fafafa; -} - -.dark .menu ul.list li.divider { - background: #444; -} - -.dark .xs-menu ul.list li:nth-child(2) { - margin: 0; - background: none; -} - -.dark .menu ul.list li:nth-child(2) { - margin: 0; - background: none; -} - -.dark #book-search-input { - background: #212121; - border-top: 1px solid #444; - border-bottom: 1px solid #444; - color: #fafafa; -} - -.dark .table.metadata > tbody > tr:hover { - color: #555; -} - -.dark .table-bordered { - border: 1px solid #444; -} - -.dark .table-bordered > tbody > tr > td, -.dark .table-bordered > tbody > tr > th, -.dark .table-bordered > tfoot > tr > td, -.dark .table-bordered > tfoot > tr > th, -.dark .table-bordered > thead > tr > td, -.dark .table-bordered > thead > tr > th { - border: 1px solid #444; -} - -.dark .coverage a, -.dark .coverage-count { - color: #fafafa; -} - -.dark .coverage-header { - color: black; -} - -.dark .routes svg text, -.dark .routes svg a { - fill: white; -} -.dark .routes svg rect { - fill: #212121 !important; -} - -.dark .navbar-default, -.dark .btn-default { - background-color: black; - border-color: #444; - color: #fafafa; -} - -.dark .navbar-default .navbar-brand { - color: #fafafa; -} - -.dark .overview .card, -.dark .modules .card { - background: #171717; - color: #fafafa; - border: 1px solid #444; -} -.dark .overview .card a { - color: #fafafa; -} - -.dark .modules .card-header { - background: none; - border-bottom: 1px solid #444; -} - -.dark .module .list-group-item { - background: none; - border: 1px solid #444; -} - -.dark .container-fluid.module h3 a { - color: #337ab7; -} - -.dark table.params thead { - background: #484848; - color: #fafafa; -} - -.dark .content table { - --bs-table-color: #fafafa; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/ionicons.min.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/ionicons.min.css deleted file mode 100644 index e50e1bb3..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/ionicons.min.css +++ /dev/null @@ -1,11 +0,0 @@ -/*! - Ionicons, v4.1.2 - Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ - https://twitter.com/benjsperry https://twitter.com/ionicframework - MIT License: https://github.com/driftyco/ionicons - - Android-style icons originally built by Google’s - Material Design Icons: https://github.com/google/material-design-icons - used under CC BY http://creativecommons.org/licenses/by/4.0/ - Modified icons to fit ionicon’s grid from original. -*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=4.1.2");src:url("../fonts/ionicons.eot?v=4.1.2#iefix") format("embedded-opentype"),url("../fonts/ionicons.woff2?v=4.1.2") format("woff2"),url("../fonts/ionicons.woff?v=4.1.2") format("woff"),url("../fonts/ionicons.ttf?v=4.1.2") format("truetype"),url("../fonts/ionicons.svg?v=4.1.2#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-ios-add:before,.ion-ios-add-circle:before,.ion-ios-add-circle-outline:before,.ion-ios-airplane:before,.ion-ios-alarm:before,.ion-ios-albums:before,.ion-ios-alert:before,.ion-ios-american-football:before,.ion-ios-analytics:before,.ion-ios-aperture:before,.ion-ios-apps:before,.ion-ios-appstore:before,.ion-ios-archive:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-dropdown:before,.ion-ios-arrow-dropdown-circle:before,.ion-ios-arrow-dropleft:before,.ion-ios-arrow-dropleft-circle:before,.ion-ios-arrow-dropright:before,.ion-ios-arrow-dropright-circle:before,.ion-ios-arrow-dropup:before,.ion-ios-arrow-dropup-circle:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-round-back:before,.ion-ios-arrow-round-down:before,.ion-ios-arrow-round-forward:before,.ion-ios-arrow-round-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-attach:before,.ion-ios-backspace:before,.ion-ios-barcode:before,.ion-ios-baseball:before,.ion-ios-basket:before,.ion-ios-basketball:before,.ion-ios-battery-charging:before,.ion-ios-battery-dead:before,.ion-ios-battery-full:before,.ion-ios-beaker:before,.ion-ios-bed:before,.ion-ios-beer:before,.ion-ios-bicycle:before,.ion-ios-bluetooth:before,.ion-ios-boat:before,.ion-ios-body:before,.ion-ios-bonfire:before,.ion-ios-book:before,.ion-ios-bookmark:before,.ion-ios-bookmarks:before,.ion-ios-bowtie:before,.ion-ios-briefcase:before,.ion-ios-browsers:before,.ion-ios-brush:before,.ion-ios-bug:before,.ion-ios-build:before,.ion-ios-bulb:before,.ion-ios-bus:before,.ion-ios-business:before,.ion-ios-cafe:before,.ion-ios-calculator:before,.ion-ios-calendar:before,.ion-ios-call:before,.ion-ios-camera:before,.ion-ios-car:before,.ion-ios-card:before,.ion-ios-cart:before,.ion-ios-cash:before,.ion-ios-cellular:before,.ion-ios-chatboxes:before,.ion-ios-chatbubbles:before,.ion-ios-checkbox:before,.ion-ios-checkbox-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-circle:before,.ion-ios-checkmark-circle-outline:before,.ion-ios-clipboard:before,.ion-ios-clock:before,.ion-ios-close:before,.ion-ios-close-circle:before,.ion-ios-close-circle-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-circle:before,.ion-ios-cloud-done:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-code:before,.ion-ios-code-download:before,.ion-ios-code-working:before,.ion-ios-cog:before,.ion-ios-color-fill:before,.ion-ios-color-filter:before,.ion-ios-color-palette:before,.ion-ios-color-wand:before,.ion-ios-compass:before,.ion-ios-construct:before,.ion-ios-contact:before,.ion-ios-contacts:before,.ion-ios-contract:before,.ion-ios-contrast:before,.ion-ios-copy:before,.ion-ios-create:before,.ion-ios-crop:before,.ion-ios-cube:before,.ion-ios-cut:before,.ion-ios-desktop:before,.ion-ios-disc:before,.ion-ios-document:before,.ion-ios-done-all:before,.ion-ios-download:before,.ion-ios-easel:before,.ion-ios-egg:before,.ion-ios-exit:before,.ion-ios-expand:before,.ion-ios-eye:before,.ion-ios-eye-off:before,.ion-ios-fastforward:before,.ion-ios-female:before,.ion-ios-filing:before,.ion-ios-film:before,.ion-ios-finger-print:before,.ion-ios-fitness:before,.ion-ios-flag:before,.ion-ios-flame:before,.ion-ios-flash:before,.ion-ios-flash-off:before,.ion-ios-flashlight:before,.ion-ios-flask:before,.ion-ios-flower:before,.ion-ios-folder:before,.ion-ios-folder-open:before,.ion-ios-football:before,.ion-ios-funnel:before,.ion-ios-gift:before,.ion-ios-git-branch:before,.ion-ios-git-commit:before,.ion-ios-git-compare:before,.ion-ios-git-merge:before,.ion-ios-git-network:before,.ion-ios-git-pull-request:before,.ion-ios-glasses:before,.ion-ios-globe:before,.ion-ios-grid:before,.ion-ios-hammer:before,.ion-ios-hand:before,.ion-ios-happy:before,.ion-ios-headset:before,.ion-ios-heart:before,.ion-ios-heart-dislike:before,.ion-ios-heart-empty:before,.ion-ios-heart-half:before,.ion-ios-help:before,.ion-ios-help-buoy:before,.ion-ios-help-circle:before,.ion-ios-help-circle-outline:before,.ion-ios-home:before,.ion-ios-hourglass:before,.ion-ios-ice-cream:before,.ion-ios-image:before,.ion-ios-images:before,.ion-ios-infinite:before,.ion-ios-information:before,.ion-ios-information-circle:before,.ion-ios-information-circle-outline:before,.ion-ios-jet:before,.ion-ios-journal:before,.ion-ios-key:before,.ion-ios-keypad:before,.ion-ios-laptop:before,.ion-ios-leaf:before,.ion-ios-link:before,.ion-ios-list:before,.ion-ios-list-box:before,.ion-ios-locate:before,.ion-ios-lock:before,.ion-ios-log-in:before,.ion-ios-log-out:before,.ion-ios-magnet:before,.ion-ios-mail:before,.ion-ios-mail-open:before,.ion-ios-mail-unread:before,.ion-ios-male:before,.ion-ios-man:before,.ion-ios-map:before,.ion-ios-medal:before,.ion-ios-medical:before,.ion-ios-medkit:before,.ion-ios-megaphone:before,.ion-ios-menu:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-microphone:before,.ion-ios-moon:before,.ion-ios-more:before,.ion-ios-move:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-notifications:before,.ion-ios-notifications-off:before,.ion-ios-notifications-outline:before,.ion-ios-nuclear:before,.ion-ios-nutrition:before,.ion-ios-open:before,.ion-ios-options:before,.ion-ios-outlet:before,.ion-ios-paper:before,.ion-ios-paper-plane:before,.ion-ios-partly-sunny:before,.ion-ios-pause:before,.ion-ios-paw:before,.ion-ios-people:before,.ion-ios-person:before,.ion-ios-person-add:before,.ion-ios-phone-landscape:before,.ion-ios-phone-portrait:before,.ion-ios-photos:before,.ion-ios-pie:before,.ion-ios-pin:before,.ion-ios-pint:before,.ion-ios-pizza:before,.ion-ios-planet:before,.ion-ios-play:before,.ion-ios-play-circle:before,.ion-ios-podium:before,.ion-ios-power:before,.ion-ios-pricetag:before,.ion-ios-pricetags:before,.ion-ios-print:before,.ion-ios-pulse:before,.ion-ios-qr-scanner:before,.ion-ios-quote:before,.ion-ios-radio:before,.ion-ios-radio-button-off:before,.ion-ios-radio-button-on:before,.ion-ios-rainy:before,.ion-ios-recording:before,.ion-ios-redo:before,.ion-ios-refresh:before,.ion-ios-refresh-circle:before,.ion-ios-remove:before,.ion-ios-remove-circle:before,.ion-ios-remove-circle-outline:before,.ion-ios-reorder:before,.ion-ios-repeat:before,.ion-ios-resize:before,.ion-ios-restaurant:before,.ion-ios-return-left:before,.ion-ios-return-right:before,.ion-ios-reverse-camera:before,.ion-ios-rewind:before,.ion-ios-ribbon:before,.ion-ios-rocket:before,.ion-ios-rose:before,.ion-ios-sad:before,.ion-ios-save:before,.ion-ios-school:before,.ion-ios-search:before,.ion-ios-send:before,.ion-ios-settings:before,.ion-ios-share:before,.ion-ios-share-alt:before,.ion-ios-shirt:before,.ion-ios-shuffle:before,.ion-ios-skip-backward:before,.ion-ios-skip-forward:before,.ion-ios-snow:before,.ion-ios-speedometer:before,.ion-ios-square:before,.ion-ios-square-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stats:before,.ion-ios-stopwatch:before,.ion-ios-subway:before,.ion-ios-sunny:before,.ion-ios-swap:before,.ion-ios-switch:before,.ion-ios-sync:before,.ion-ios-tablet-landscape:before,.ion-ios-tablet-portrait:before,.ion-ios-tennisball:before,.ion-ios-text:before,.ion-ios-thermometer:before,.ion-ios-thumbs-down:before,.ion-ios-thumbs-up:before,.ion-ios-thunderstorm:before,.ion-ios-time:before,.ion-ios-timer:before,.ion-ios-today:before,.ion-ios-train:before,.ion-ios-transgender:before,.ion-ios-trash:before,.ion-ios-trending-down:before,.ion-ios-trending-up:before,.ion-ios-trophy:before,.ion-ios-tv:before,.ion-ios-umbrella:before,.ion-ios-undo:before,.ion-ios-unlock:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-volume-mute:before,.ion-ios-volume-off:before,.ion-ios-walk:before,.ion-ios-wallet:before,.ion-ios-warning:before,.ion-ios-watch:before,.ion-ios-water:before,.ion-ios-wifi:before,.ion-ios-wine:before,.ion-ios-woman:before,.ion-logo-android:before,.ion-logo-angular:before,.ion-logo-apple:before,.ion-logo-bitbucket:before,.ion-logo-bitcoin:before,.ion-logo-buffer:before,.ion-logo-chrome:before,.ion-logo-closed-captioning:before,.ion-logo-codepen:before,.ion-logo-css3:before,.ion-logo-designernews:before,.ion-logo-dribbble:before,.ion-logo-dropbox:before,.ion-logo-euro:before,.ion-logo-facebook:before,.ion-logo-flickr:before,.ion-logo-foursquare:before,.ion-logo-freebsd-devil:before,.ion-logo-game-controller-a:before,.ion-logo-game-controller-b:before,.ion-logo-github:before,.ion-logo-google:before,.ion-logo-googleplus:before,.ion-logo-hackernews:before,.ion-logo-html5:before,.ion-logo-instagram:before,.ion-logo-ionic:before,.ion-logo-ionitron:before,.ion-logo-javascript:before,.ion-logo-linkedin:before,.ion-logo-markdown:before,.ion-logo-model-s:before,.ion-logo-no-smoking:before,.ion-logo-nodejs:before,.ion-logo-npm:before,.ion-logo-octocat:before,.ion-logo-pinterest:before,.ion-logo-playstation:before,.ion-logo-polymer:before,.ion-logo-python:before,.ion-logo-reddit:before,.ion-logo-rss:before,.ion-logo-sass:before,.ion-logo-skype:before,.ion-logo-slack:before,.ion-logo-snapchat:before,.ion-logo-steam:before,.ion-logo-tumblr:before,.ion-logo-tux:before,.ion-logo-twitch:before,.ion-logo-twitter:before,.ion-logo-usd:before,.ion-logo-vimeo:before,.ion-logo-vk:before,.ion-logo-whatsapp:before,.ion-logo-windows:before,.ion-logo-wordpress:before,.ion-logo-xbox:before,.ion-logo-xing:before,.ion-logo-yahoo:before,.ion-logo-yen:before,.ion-logo-youtube:before,.ion-md-add:before,.ion-md-add-circle:before,.ion-md-add-circle-outline:before,.ion-md-airplane:before,.ion-md-alarm:before,.ion-md-albums:before,.ion-md-alert:before,.ion-md-american-football:before,.ion-md-analytics:before,.ion-md-aperture:before,.ion-md-apps:before,.ion-md-appstore:before,.ion-md-archive:before,.ion-md-arrow-back:before,.ion-md-arrow-down:before,.ion-md-arrow-dropdown:before,.ion-md-arrow-dropdown-circle:before,.ion-md-arrow-dropleft:before,.ion-md-arrow-dropleft-circle:before,.ion-md-arrow-dropright:before,.ion-md-arrow-dropright-circle:before,.ion-md-arrow-dropup:before,.ion-md-arrow-dropup-circle:before,.ion-md-arrow-forward:before,.ion-md-arrow-round-back:before,.ion-md-arrow-round-down:before,.ion-md-arrow-round-forward:before,.ion-md-arrow-round-up:before,.ion-md-arrow-up:before,.ion-md-at:before,.ion-md-attach:before,.ion-md-backspace:before,.ion-md-barcode:before,.ion-md-baseball:before,.ion-md-basket:before,.ion-md-basketball:before,.ion-md-battery-charging:before,.ion-md-battery-dead:before,.ion-md-battery-full:before,.ion-md-beaker:before,.ion-md-bed:before,.ion-md-beer:before,.ion-md-bicycle:before,.ion-md-bluetooth:before,.ion-md-boat:before,.ion-md-body:before,.ion-md-bonfire:before,.ion-md-book:before,.ion-md-bookmark:before,.ion-md-bookmarks:before,.ion-md-bowtie:before,.ion-md-briefcase:before,.ion-md-browsers:before,.ion-md-brush:before,.ion-md-bug:before,.ion-md-build:before,.ion-md-bulb:before,.ion-md-bus:before,.ion-md-business:before,.ion-md-cafe:before,.ion-md-calculator:before,.ion-md-calendar:before,.ion-md-call:before,.ion-md-camera:before,.ion-md-car:before,.ion-md-card:before,.ion-md-cart:before,.ion-md-cash:before,.ion-md-cellular:before,.ion-md-chatboxes:before,.ion-md-chatbubbles:before,.ion-md-checkbox:before,.ion-md-checkbox-outline:before,.ion-md-checkmark:before,.ion-md-checkmark-circle:before,.ion-md-checkmark-circle-outline:before,.ion-md-clipboard:before,.ion-md-clock:before,.ion-md-close:before,.ion-md-close-circle:before,.ion-md-close-circle-outline:before,.ion-md-cloud:before,.ion-md-cloud-circle:before,.ion-md-cloud-done:before,.ion-md-cloud-download:before,.ion-md-cloud-outline:before,.ion-md-cloud-upload:before,.ion-md-cloudy:before,.ion-md-cloudy-night:before,.ion-md-code:before,.ion-md-code-download:before,.ion-md-code-working:before,.ion-md-cog:before,.ion-md-color-fill:before,.ion-md-color-filter:before,.ion-md-color-palette:before,.ion-md-color-wand:before,.ion-md-compass:before,.ion-md-construct:before,.ion-md-contact:before,.ion-md-contacts:before,.ion-md-contract:before,.ion-md-contrast:before,.ion-md-copy:before,.ion-md-create:before,.ion-md-crop:before,.ion-md-cube:before,.ion-md-cut:before,.ion-md-desktop:before,.ion-md-disc:before,.ion-md-document:before,.ion-md-done-all:before,.ion-md-download:before,.ion-md-easel:before,.ion-md-egg:before,.ion-md-exit:before,.ion-md-expand:before,.ion-md-eye:before,.ion-md-eye-off:before,.ion-md-fastforward:before,.ion-md-female:before,.ion-md-filing:before,.ion-md-film:before,.ion-md-finger-print:before,.ion-md-fitness:before,.ion-md-flag:before,.ion-md-flame:before,.ion-md-flash:before,.ion-md-flash-off:before,.ion-md-flashlight:before,.ion-md-flask:before,.ion-md-flower:before,.ion-md-folder:before,.ion-md-folder-open:before,.ion-md-football:before,.ion-md-funnel:before,.ion-md-gift:before,.ion-md-git-branch:before,.ion-md-git-commit:before,.ion-md-git-compare:before,.ion-md-git-merge:before,.ion-md-git-network:before,.ion-md-git-pull-request:before,.ion-md-glasses:before,.ion-md-globe:before,.ion-md-grid:before,.ion-md-hammer:before,.ion-md-hand:before,.ion-md-happy:before,.ion-md-headset:before,.ion-md-heart:before,.ion-md-heart-dislike:before,.ion-md-heart-empty:before,.ion-md-heart-half:before,.ion-md-help:before,.ion-md-help-buoy:before,.ion-md-help-circle:before,.ion-md-help-circle-outline:before,.ion-md-home:before,.ion-md-hourglass:before,.ion-md-ice-cream:before,.ion-md-image:before,.ion-md-images:before,.ion-md-infinite:before,.ion-md-information:before,.ion-md-information-circle:before,.ion-md-information-circle-outline:before,.ion-md-jet:before,.ion-md-journal:before,.ion-md-key:before,.ion-md-keypad:before,.ion-md-laptop:before,.ion-md-leaf:before,.ion-md-link:before,.ion-md-list:before,.ion-md-list-box:before,.ion-md-locate:before,.ion-md-lock:before,.ion-md-log-in:before,.ion-md-log-out:before,.ion-md-magnet:before,.ion-md-mail:before,.ion-md-mail-open:before,.ion-md-mail-unread:before,.ion-md-male:before,.ion-md-man:before,.ion-md-map:before,.ion-md-medal:before,.ion-md-medical:before,.ion-md-medkit:before,.ion-md-megaphone:before,.ion-md-menu:before,.ion-md-mic:before,.ion-md-mic-off:before,.ion-md-microphone:before,.ion-md-moon:before,.ion-md-more:before,.ion-md-move:before,.ion-md-musical-note:before,.ion-md-musical-notes:before,.ion-md-navigate:before,.ion-md-notifications:before,.ion-md-notifications-off:before,.ion-md-notifications-outline:before,.ion-md-nuclear:before,.ion-md-nutrition:before,.ion-md-open:before,.ion-md-options:before,.ion-md-outlet:before,.ion-md-paper:before,.ion-md-paper-plane:before,.ion-md-partly-sunny:before,.ion-md-pause:before,.ion-md-paw:before,.ion-md-people:before,.ion-md-person:before,.ion-md-person-add:before,.ion-md-phone-landscape:before,.ion-md-phone-portrait:before,.ion-md-photos:before,.ion-md-pie:before,.ion-md-pin:before,.ion-md-pint:before,.ion-md-pizza:before,.ion-md-planet:before,.ion-md-play:before,.ion-md-play-circle:before,.ion-md-podium:before,.ion-md-power:before,.ion-md-pricetag:before,.ion-md-pricetags:before,.ion-md-print:before,.ion-md-pulse:before,.ion-md-qr-scanner:before,.ion-md-quote:before,.ion-md-radio:before,.ion-md-radio-button-off:before,.ion-md-radio-button-on:before,.ion-md-rainy:before,.ion-md-recording:before,.ion-md-redo:before,.ion-md-refresh:before,.ion-md-refresh-circle:before,.ion-md-remove:before,.ion-md-remove-circle:before,.ion-md-remove-circle-outline:before,.ion-md-reorder:before,.ion-md-repeat:before,.ion-md-resize:before,.ion-md-restaurant:before,.ion-md-return-left:before,.ion-md-return-right:before,.ion-md-reverse-camera:before,.ion-md-rewind:before,.ion-md-ribbon:before,.ion-md-rocket:before,.ion-md-rose:before,.ion-md-sad:before,.ion-md-save:before,.ion-md-school:before,.ion-md-search:before,.ion-md-send:before,.ion-md-settings:before,.ion-md-share:before,.ion-md-share-alt:before,.ion-md-shirt:before,.ion-md-shuffle:before,.ion-md-skip-backward:before,.ion-md-skip-forward:before,.ion-md-snow:before,.ion-md-speedometer:before,.ion-md-square:before,.ion-md-square-outline:before,.ion-md-star:before,.ion-md-star-half:before,.ion-md-star-outline:before,.ion-md-stats:before,.ion-md-stopwatch:before,.ion-md-subway:before,.ion-md-sunny:before,.ion-md-swap:before,.ion-md-switch:before,.ion-md-sync:before,.ion-md-tablet-landscape:before,.ion-md-tablet-portrait:before,.ion-md-tennisball:before,.ion-md-text:before,.ion-md-thermometer:before,.ion-md-thumbs-down:before,.ion-md-thumbs-up:before,.ion-md-thunderstorm:before,.ion-md-time:before,.ion-md-timer:before,.ion-md-today:before,.ion-md-train:before,.ion-md-transgender:before,.ion-md-trash:before,.ion-md-trending-down:before,.ion-md-trending-up:before,.ion-md-trophy:before,.ion-md-tv:before,.ion-md-umbrella:before,.ion-md-undo:before,.ion-md-unlock:before,.ion-md-videocam:before,.ion-md-volume-high:before,.ion-md-volume-low:before,.ion-md-volume-mute:before,.ion-md-volume-off:before,.ion-md-walk:before,.ion-md-wallet:before,.ion-md-warning:before,.ion-md-watch:before,.ion-md-water:before,.ion-md-wifi:before,.ion-md-wine:before,.ion-md-woman:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios-add:before{content:"\f102"}.ion-ios-add-circle:before{content:"\f101"}.ion-ios-add-circle-outline:before{content:"\f100"}.ion-ios-airplane:before{content:"\f137"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-alert:before{content:"\f104"}.ion-ios-american-football:before{content:"\f106"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-aperture:before{content:"\f108"}.ion-ios-apps:before{content:"\f10a"}.ion-ios-appstore:before{content:"\f10c"}.ion-ios-archive:before{content:"\f10e"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-dropdown:before{content:"\f110"}.ion-ios-arrow-dropdown-circle:before{content:"\f125"}.ion-ios-arrow-dropleft:before{content:"\f112"}.ion-ios-arrow-dropleft-circle:before{content:"\f129"}.ion-ios-arrow-dropright:before{content:"\f114"}.ion-ios-arrow-dropright-circle:before{content:"\f12b"}.ion-ios-arrow-dropup:before{content:"\f116"}.ion-ios-arrow-dropup-circle:before{content:"\f12d"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-round-back:before{content:"\f117"}.ion-ios-arrow-round-down:before{content:"\f118"}.ion-ios-arrow-round-forward:before{content:"\f119"}.ion-ios-arrow-round-up:before{content:"\f11a"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-attach:before{content:"\f11b"}.ion-ios-backspace:before{content:"\f11d"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-basket:before{content:"\f11f"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-battery-charging:before{content:"\f120"}.ion-ios-battery-dead:before{content:"\f121"}.ion-ios-battery-full:before{content:"\f122"}.ion-ios-beaker:before{content:"\f124"}.ion-ios-bed:before{content:"\f139"}.ion-ios-beer:before{content:"\f126"}.ion-ios-bicycle:before{content:"\f127"}.ion-ios-bluetooth:before{content:"\f128"}.ion-ios-boat:before{content:"\f12a"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-bonfire:before{content:"\f12c"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-bookmark:before{content:"\f12e"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bowtie:before{content:"\f130"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-brush:before{content:"\f132"}.ion-ios-bug:before{content:"\f134"}.ion-ios-build:before{content:"\f136"}.ion-ios-bulb:before{content:"\f138"}.ion-ios-bus:before{content:"\f13a"}.ion-ios-business:before{content:"\f1a3"}.ion-ios-cafe:before{content:"\f13c"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-call:before{content:"\f13e"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-car:before{content:"\f140"}.ion-ios-card:before{content:"\f142"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cash:before{content:"\f144"}.ion-ios-cellular:before{content:"\f13d"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatbubbles:before{content:"\f146"}.ion-ios-checkbox:before{content:"\f148"}.ion-ios-checkbox-outline:before{content:"\f147"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-circle:before{content:"\f14a"}.ion-ios-checkmark-circle-outline:before{content:"\f149"}.ion-ios-clipboard:before{content:"\f14c"}.ion-ios-clock:before{content:"\f403"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-circle:before{content:"\f14e"}.ion-ios-close-circle-outline:before{content:"\f14d"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-circle:before{content:"\f152"}.ion-ios-cloud-done:before{content:"\f154"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-code:before{content:"\f157"}.ion-ios-code-download:before{content:"\f155"}.ion-ios-code-working:before{content:"\f156"}.ion-ios-cog:before{content:"\f412"}.ion-ios-color-fill:before{content:"\f159"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-palette:before{content:"\f15b"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-compass:before{content:"\f15d"}.ion-ios-construct:before{content:"\f15f"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contacts:before{content:"\f161"}.ion-ios-contract:before{content:"\f162"}.ion-ios-contrast:before{content:"\f163"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-create:before{content:"\f165"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-cube:before{content:"\f168"}.ion-ios-cut:before{content:"\f16a"}.ion-ios-desktop:before{content:"\f16c"}.ion-ios-disc:before{content:"\f16e"}.ion-ios-document:before{content:"\f170"}.ion-ios-done-all:before{content:"\f171"}.ion-ios-download:before{content:"\f420"}.ion-ios-easel:before{content:"\f173"}.ion-ios-egg:before{content:"\f175"}.ion-ios-exit:before{content:"\f177"}.ion-ios-expand:before{content:"\f178"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-off:before{content:"\f17a"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-female:before{content:"\f17b"}.ion-ios-filing:before{content:"\f429"}.ion-ios-film:before{content:"\f42b"}.ion-ios-finger-print:before{content:"\f17c"}.ion-ios-fitness:before{content:"\f1ab"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flash:before{content:"\f17e"}.ion-ios-flash-off:before{content:"\f12f"}.ion-ios-flashlight:before{content:"\f141"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flower:before{content:"\f433"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-open:before{content:"\f180"}.ion-ios-football:before{content:"\f437"}.ion-ios-funnel:before{content:"\f182"}.ion-ios-gift:before{content:"\f191"}.ion-ios-git-branch:before{content:"\f183"}.ion-ios-git-commit:before{content:"\f184"}.ion-ios-git-compare:before{content:"\f185"}.ion-ios-git-merge:before{content:"\f186"}.ion-ios-git-network:before{content:"\f187"}.ion-ios-git-pull-request:before{content:"\f188"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-globe:before{content:"\f18a"}.ion-ios-grid:before{content:"\f18c"}.ion-ios-hammer:before{content:"\f18e"}.ion-ios-hand:before{content:"\f190"}.ion-ios-happy:before{content:"\f192"}.ion-ios-headset:before{content:"\f194"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-dislike:before{content:"\f13f"}.ion-ios-heart-empty:before{content:"\f19b"}.ion-ios-heart-half:before{content:"\f19d"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-buoy:before{content:"\f196"}.ion-ios-help-circle:before{content:"\f198"}.ion-ios-help-circle-outline:before{content:"\f197"}.ion-ios-home:before{content:"\f448"}.ion-ios-hourglass:before{content:"\f103"}.ion-ios-ice-cream:before{content:"\f19a"}.ion-ios-image:before{content:"\f19c"}.ion-ios-images:before{content:"\f19e"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-circle:before{content:"\f1a0"}.ion-ios-information-circle-outline:before{content:"\f19f"}.ion-ios-jet:before{content:"\f1a5"}.ion-ios-journal:before{content:"\f189"}.ion-ios-key:before{content:"\f1a7"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-laptop:before{content:"\f1a8"}.ion-ios-leaf:before{content:"\f1aa"}.ion-ios-link:before{content:"\f22a"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-box:before{content:"\f143"}.ion-ios-locate:before{content:"\f1ae"}.ion-ios-lock:before{content:"\f1b0"}.ion-ios-log-in:before{content:"\f1b1"}.ion-ios-log-out:before{content:"\f1b2"}.ion-ios-magnet:before{content:"\f1b4"}.ion-ios-mail:before{content:"\f1b8"}.ion-ios-mail-open:before{content:"\f1b6"}.ion-ios-mail-unread:before{content:"\f145"}.ion-ios-male:before{content:"\f1b9"}.ion-ios-man:before{content:"\f1bb"}.ion-ios-map:before{content:"\f1bd"}.ion-ios-medal:before{content:"\f1bf"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-megaphone:before{content:"\f1c1"}.ion-ios-menu:before{content:"\f1c3"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-microphone:before{content:"\f1c6"}.ion-ios-moon:before{content:"\f468"}.ion-ios-more:before{content:"\f1c8"}.ion-ios-move:before{content:"\f1cb"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-notifications:before{content:"\f1d3"}.ion-ios-notifications-off:before{content:"\f1d1"}.ion-ios-notifications-outline:before{content:"\f133"}.ion-ios-nuclear:before{content:"\f1d5"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-open:before{content:"\f1d7"}.ion-ios-options:before{content:"\f1d9"}.ion-ios-outlet:before{content:"\f1db"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-plane:before{content:"\f1dd"}.ion-ios-partly-sunny:before{content:"\f1df"}.ion-ios-pause:before{content:"\f478"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-people:before{content:"\f47c"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-add:before{content:"\f1e1"}.ion-ios-phone-landscape:before{content:"\f1e2"}.ion-ios-phone-portrait:before{content:"\f1e3"}.ion-ios-photos:before{content:"\f482"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pin:before{content:"\f1e5"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pizza:before{content:"\f1e7"}.ion-ios-planet:before{content:"\f1eb"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-circle:before{content:"\f113"}.ion-ios-podium:before{content:"\f1ed"}.ion-ios-power:before{content:"\f1ef"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-print:before{content:"\f1f1"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-qr-scanner:before{content:"\f1f3"}.ion-ios-quote:before{content:"\f1f5"}.ion-ios-radio:before{content:"\f1f9"}.ion-ios-radio-button-off:before{content:"\f1f6"}.ion-ios-radio-button-on:before{content:"\f1f7"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-recording:before{content:"\f497"}.ion-ios-redo:before{content:"\f499"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-circle:before{content:"\f135"}.ion-ios-remove:before{content:"\f1fc"}.ion-ios-remove-circle:before{content:"\f1fb"}.ion-ios-remove-circle-outline:before{content:"\f1fa"}.ion-ios-reorder:before{content:"\f1fd"}.ion-ios-repeat:before{content:"\f1fe"}.ion-ios-resize:before{content:"\f1ff"}.ion-ios-restaurant:before{content:"\f201"}.ion-ios-return-left:before{content:"\f202"}.ion-ios-return-right:before{content:"\f203"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-ribbon:before{content:"\f205"}.ion-ios-rocket:before{content:"\f14b"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-sad:before{content:"\f207"}.ion-ios-save:before{content:"\f1a6"}.ion-ios-school:before{content:"\f209"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-send:before{content:"\f20c"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-share:before{content:"\f211"}.ion-ios-share-alt:before{content:"\f20f"}.ion-ios-shirt:before{content:"\f213"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-skip-backward:before{content:"\f215"}.ion-ios-skip-forward:before{content:"\f217"}.ion-ios-snow:before{content:"\f218"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-square:before{content:"\f21a"}.ion-ios-square-outline:before{content:"\f15c"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stats:before{content:"\f21c"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-subway:before{content:"\f21e"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-swap:before{content:"\f21f"}.ion-ios-switch:before{content:"\f221"}.ion-ios-sync:before{content:"\f222"}.ion-ios-tablet-landscape:before{content:"\f223"}.ion-ios-tablet-portrait:before{content:"\f24e"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-text:before{content:"\f250"}.ion-ios-thermometer:before{content:"\f252"}.ion-ios-thumbs-down:before{content:"\f254"}.ion-ios-thumbs-up:before{content:"\f256"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-today:before{content:"\f14f"}.ion-ios-train:before{content:"\f258"}.ion-ios-transgender:before{content:"\f259"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trending-down:before{content:"\f25a"}.ion-ios-trending-up:before{content:"\f25b"}.ion-ios-trophy:before{content:"\f25d"}.ion-ios-tv:before{content:"\f115"}.ion-ios-umbrella:before{content:"\f25f"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-unlock:before{content:"\f261"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-volume-high:before{content:"\f11c"}.ion-ios-volume-low:before{content:"\f11e"}.ion-ios-volume-mute:before{content:"\f263"}.ion-ios-volume-off:before{content:"\f264"}.ion-ios-walk:before{content:"\f266"}.ion-ios-wallet:before{content:"\f18b"}.ion-ios-warning:before{content:"\f268"}.ion-ios-watch:before{content:"\f269"}.ion-ios-water:before{content:"\f26b"}.ion-ios-wifi:before{content:"\f26d"}.ion-ios-wine:before{content:"\f26f"}.ion-ios-woman:before{content:"\f271"}.ion-logo-android:before{content:"\f225"}.ion-logo-angular:before{content:"\f227"}.ion-logo-apple:before{content:"\f229"}.ion-logo-bitbucket:before{content:"\f193"}.ion-logo-bitcoin:before{content:"\f22b"}.ion-logo-buffer:before{content:"\f22d"}.ion-logo-chrome:before{content:"\f22f"}.ion-logo-closed-captioning:before{content:"\f105"}.ion-logo-codepen:before{content:"\f230"}.ion-logo-css3:before{content:"\f231"}.ion-logo-designernews:before{content:"\f232"}.ion-logo-dribbble:before{content:"\f233"}.ion-logo-dropbox:before{content:"\f234"}.ion-logo-euro:before{content:"\f235"}.ion-logo-facebook:before{content:"\f236"}.ion-logo-flickr:before{content:"\f107"}.ion-logo-foursquare:before{content:"\f237"}.ion-logo-freebsd-devil:before{content:"\f238"}.ion-logo-game-controller-a:before{content:"\f13b"}.ion-logo-game-controller-b:before{content:"\f181"}.ion-logo-github:before{content:"\f239"}.ion-logo-google:before{content:"\f23a"}.ion-logo-googleplus:before{content:"\f23b"}.ion-logo-hackernews:before{content:"\f23c"}.ion-logo-html5:before{content:"\f23d"}.ion-logo-instagram:before{content:"\f23e"}.ion-logo-ionic:before{content:"\f150"}.ion-logo-ionitron:before{content:"\f151"}.ion-logo-javascript:before{content:"\f23f"}.ion-logo-linkedin:before{content:"\f240"}.ion-logo-markdown:before{content:"\f241"}.ion-logo-model-s:before{content:"\f153"}.ion-logo-no-smoking:before{content:"\f109"}.ion-logo-nodejs:before{content:"\f242"}.ion-logo-npm:before{content:"\f195"}.ion-logo-octocat:before{content:"\f243"}.ion-logo-pinterest:before{content:"\f244"}.ion-logo-playstation:before{content:"\f245"}.ion-logo-polymer:before{content:"\f15e"}.ion-logo-python:before{content:"\f246"}.ion-logo-reddit:before{content:"\f247"}.ion-logo-rss:before{content:"\f248"}.ion-logo-sass:before{content:"\f249"}.ion-logo-skype:before{content:"\f24a"}.ion-logo-slack:before{content:"\f10b"}.ion-logo-snapchat:before{content:"\f24b"}.ion-logo-steam:before{content:"\f24c"}.ion-logo-tumblr:before{content:"\f24d"}.ion-logo-tux:before{content:"\f2ae"}.ion-logo-twitch:before{content:"\f2af"}.ion-logo-twitter:before{content:"\f2b0"}.ion-logo-usd:before{content:"\f2b1"}.ion-logo-vimeo:before{content:"\f2c4"}.ion-logo-vk:before{content:"\f10d"}.ion-logo-whatsapp:before{content:"\f2c5"}.ion-logo-windows:before{content:"\f32f"}.ion-logo-wordpress:before{content:"\f330"}.ion-logo-xbox:before{content:"\f34c"}.ion-logo-xing:before{content:"\f10f"}.ion-logo-yahoo:before{content:"\f34d"}.ion-logo-yen:before{content:"\f34e"}.ion-logo-youtube:before{content:"\f34f"}.ion-md-add:before{content:"\f273"}.ion-md-add-circle:before{content:"\f272"}.ion-md-add-circle-outline:before{content:"\f158"}.ion-md-airplane:before{content:"\f15a"}.ion-md-alarm:before{content:"\f274"}.ion-md-albums:before{content:"\f275"}.ion-md-alert:before{content:"\f276"}.ion-md-american-football:before{content:"\f277"}.ion-md-analytics:before{content:"\f278"}.ion-md-aperture:before{content:"\f279"}.ion-md-apps:before{content:"\f27a"}.ion-md-appstore:before{content:"\f27b"}.ion-md-archive:before{content:"\f27c"}.ion-md-arrow-back:before{content:"\f27d"}.ion-md-arrow-down:before{content:"\f27e"}.ion-md-arrow-dropdown:before{content:"\f280"}.ion-md-arrow-dropdown-circle:before{content:"\f27f"}.ion-md-arrow-dropleft:before{content:"\f282"}.ion-md-arrow-dropleft-circle:before{content:"\f281"}.ion-md-arrow-dropright:before{content:"\f284"}.ion-md-arrow-dropright-circle:before{content:"\f283"}.ion-md-arrow-dropup:before{content:"\f286"}.ion-md-arrow-dropup-circle:before{content:"\f285"}.ion-md-arrow-forward:before{content:"\f287"}.ion-md-arrow-round-back:before{content:"\f288"}.ion-md-arrow-round-down:before{content:"\f289"}.ion-md-arrow-round-forward:before{content:"\f28a"}.ion-md-arrow-round-up:before{content:"\f28b"}.ion-md-arrow-up:before{content:"\f28c"}.ion-md-at:before{content:"\f28d"}.ion-md-attach:before{content:"\f28e"}.ion-md-backspace:before{content:"\f28f"}.ion-md-barcode:before{content:"\f290"}.ion-md-baseball:before{content:"\f291"}.ion-md-basket:before{content:"\f292"}.ion-md-basketball:before{content:"\f293"}.ion-md-battery-charging:before{content:"\f294"}.ion-md-battery-dead:before{content:"\f295"}.ion-md-battery-full:before{content:"\f296"}.ion-md-beaker:before{content:"\f297"}.ion-md-bed:before{content:"\f160"}.ion-md-beer:before{content:"\f298"}.ion-md-bicycle:before{content:"\f299"}.ion-md-bluetooth:before{content:"\f29a"}.ion-md-boat:before{content:"\f29b"}.ion-md-body:before{content:"\f29c"}.ion-md-bonfire:before{content:"\f29d"}.ion-md-book:before{content:"\f29e"}.ion-md-bookmark:before{content:"\f29f"}.ion-md-bookmarks:before{content:"\f2a0"}.ion-md-bowtie:before{content:"\f2a1"}.ion-md-briefcase:before{content:"\f2a2"}.ion-md-browsers:before{content:"\f2a3"}.ion-md-brush:before{content:"\f2a4"}.ion-md-bug:before{content:"\f2a5"}.ion-md-build:before{content:"\f2a6"}.ion-md-bulb:before{content:"\f2a7"}.ion-md-bus:before{content:"\f2a8"}.ion-md-business:before{content:"\f1a4"}.ion-md-cafe:before{content:"\f2a9"}.ion-md-calculator:before{content:"\f2aa"}.ion-md-calendar:before{content:"\f2ab"}.ion-md-call:before{content:"\f2ac"}.ion-md-camera:before{content:"\f2ad"}.ion-md-car:before{content:"\f2b2"}.ion-md-card:before{content:"\f2b3"}.ion-md-cart:before{content:"\f2b4"}.ion-md-cash:before{content:"\f2b5"}.ion-md-cellular:before{content:"\f164"}.ion-md-chatboxes:before{content:"\f2b6"}.ion-md-chatbubbles:before{content:"\f2b7"}.ion-md-checkbox:before{content:"\f2b9"}.ion-md-checkbox-outline:before{content:"\f2b8"}.ion-md-checkmark:before{content:"\f2bc"}.ion-md-checkmark-circle:before{content:"\f2bb"}.ion-md-checkmark-circle-outline:before{content:"\f2ba"}.ion-md-clipboard:before{content:"\f2bd"}.ion-md-clock:before{content:"\f2be"}.ion-md-close:before{content:"\f2c0"}.ion-md-close-circle:before{content:"\f2bf"}.ion-md-close-circle-outline:before{content:"\f166"}.ion-md-cloud:before{content:"\f2c9"}.ion-md-cloud-circle:before{content:"\f2c2"}.ion-md-cloud-done:before{content:"\f2c3"}.ion-md-cloud-download:before{content:"\f2c6"}.ion-md-cloud-outline:before{content:"\f2c7"}.ion-md-cloud-upload:before{content:"\f2c8"}.ion-md-cloudy:before{content:"\f2cb"}.ion-md-cloudy-night:before{content:"\f2ca"}.ion-md-code:before{content:"\f2ce"}.ion-md-code-download:before{content:"\f2cc"}.ion-md-code-working:before{content:"\f2cd"}.ion-md-cog:before{content:"\f2cf"}.ion-md-color-fill:before{content:"\f2d0"}.ion-md-color-filter:before{content:"\f2d1"}.ion-md-color-palette:before{content:"\f2d2"}.ion-md-color-wand:before{content:"\f2d3"}.ion-md-compass:before{content:"\f2d4"}.ion-md-construct:before{content:"\f2d5"}.ion-md-contact:before{content:"\f2d6"}.ion-md-contacts:before{content:"\f2d7"}.ion-md-contract:before{content:"\f2d8"}.ion-md-contrast:before{content:"\f2d9"}.ion-md-copy:before{content:"\f2da"}.ion-md-create:before{content:"\f2db"}.ion-md-crop:before{content:"\f2dc"}.ion-md-cube:before{content:"\f2dd"}.ion-md-cut:before{content:"\f2de"}.ion-md-desktop:before{content:"\f2df"}.ion-md-disc:before{content:"\f2e0"}.ion-md-document:before{content:"\f2e1"}.ion-md-done-all:before{content:"\f2e2"}.ion-md-download:before{content:"\f2e3"}.ion-md-easel:before{content:"\f2e4"}.ion-md-egg:before{content:"\f2e5"}.ion-md-exit:before{content:"\f2e6"}.ion-md-expand:before{content:"\f2e7"}.ion-md-eye:before{content:"\f2e9"}.ion-md-eye-off:before{content:"\f2e8"}.ion-md-fastforward:before{content:"\f2ea"}.ion-md-female:before{content:"\f2eb"}.ion-md-filing:before{content:"\f2ec"}.ion-md-film:before{content:"\f2ed"}.ion-md-finger-print:before{content:"\f2ee"}.ion-md-fitness:before{content:"\f1ac"}.ion-md-flag:before{content:"\f2ef"}.ion-md-flame:before{content:"\f2f0"}.ion-md-flash:before{content:"\f2f1"}.ion-md-flash-off:before{content:"\f169"}.ion-md-flashlight:before{content:"\f16b"}.ion-md-flask:before{content:"\f2f2"}.ion-md-flower:before{content:"\f2f3"}.ion-md-folder:before{content:"\f2f5"}.ion-md-folder-open:before{content:"\f2f4"}.ion-md-football:before{content:"\f2f6"}.ion-md-funnel:before{content:"\f2f7"}.ion-md-gift:before{content:"\f199"}.ion-md-git-branch:before{content:"\f2fa"}.ion-md-git-commit:before{content:"\f2fb"}.ion-md-git-compare:before{content:"\f2fc"}.ion-md-git-merge:before{content:"\f2fd"}.ion-md-git-network:before{content:"\f2fe"}.ion-md-git-pull-request:before{content:"\f2ff"}.ion-md-glasses:before{content:"\f300"}.ion-md-globe:before{content:"\f301"}.ion-md-grid:before{content:"\f302"}.ion-md-hammer:before{content:"\f303"}.ion-md-hand:before{content:"\f304"}.ion-md-happy:before{content:"\f305"}.ion-md-headset:before{content:"\f306"}.ion-md-heart:before{content:"\f308"}.ion-md-heart-dislike:before{content:"\f167"}.ion-md-heart-empty:before{content:"\f1a1"}.ion-md-heart-half:before{content:"\f1a2"}.ion-md-help:before{content:"\f30b"}.ion-md-help-buoy:before{content:"\f309"}.ion-md-help-circle:before{content:"\f30a"}.ion-md-help-circle-outline:before{content:"\f16d"}.ion-md-home:before{content:"\f30c"}.ion-md-hourglass:before{content:"\f111"}.ion-md-ice-cream:before{content:"\f30d"}.ion-md-image:before{content:"\f30e"}.ion-md-images:before{content:"\f30f"}.ion-md-infinite:before{content:"\f310"}.ion-md-information:before{content:"\f312"}.ion-md-information-circle:before{content:"\f311"}.ion-md-information-circle-outline:before{content:"\f16f"}.ion-md-jet:before{content:"\f315"}.ion-md-journal:before{content:"\f18d"}.ion-md-key:before{content:"\f316"}.ion-md-keypad:before{content:"\f317"}.ion-md-laptop:before{content:"\f318"}.ion-md-leaf:before{content:"\f319"}.ion-md-link:before{content:"\f22e"}.ion-md-list:before{content:"\f31b"}.ion-md-list-box:before{content:"\f31a"}.ion-md-locate:before{content:"\f31c"}.ion-md-lock:before{content:"\f31d"}.ion-md-log-in:before{content:"\f31e"}.ion-md-log-out:before{content:"\f31f"}.ion-md-magnet:before{content:"\f320"}.ion-md-mail:before{content:"\f322"}.ion-md-mail-open:before{content:"\f321"}.ion-md-mail-unread:before{content:"\f172"}.ion-md-male:before{content:"\f323"}.ion-md-man:before{content:"\f324"}.ion-md-map:before{content:"\f325"}.ion-md-medal:before{content:"\f326"}.ion-md-medical:before{content:"\f327"}.ion-md-medkit:before{content:"\f328"}.ion-md-megaphone:before{content:"\f329"}.ion-md-menu:before{content:"\f32a"}.ion-md-mic:before{content:"\f32c"}.ion-md-mic-off:before{content:"\f32b"}.ion-md-microphone:before{content:"\f32d"}.ion-md-moon:before{content:"\f32e"}.ion-md-more:before{content:"\f1c9"}.ion-md-move:before{content:"\f331"}.ion-md-musical-note:before{content:"\f332"}.ion-md-musical-notes:before{content:"\f333"}.ion-md-navigate:before{content:"\f334"}.ion-md-notifications:before{content:"\f338"}.ion-md-notifications-off:before{content:"\f336"}.ion-md-notifications-outline:before{content:"\f337"}.ion-md-nuclear:before{content:"\f339"}.ion-md-nutrition:before{content:"\f33a"}.ion-md-open:before{content:"\f33b"}.ion-md-options:before{content:"\f33c"}.ion-md-outlet:before{content:"\f33d"}.ion-md-paper:before{content:"\f33f"}.ion-md-paper-plane:before{content:"\f33e"}.ion-md-partly-sunny:before{content:"\f340"}.ion-md-pause:before{content:"\f341"}.ion-md-paw:before{content:"\f342"}.ion-md-people:before{content:"\f343"}.ion-md-person:before{content:"\f345"}.ion-md-person-add:before{content:"\f344"}.ion-md-phone-landscape:before{content:"\f346"}.ion-md-phone-portrait:before{content:"\f347"}.ion-md-photos:before{content:"\f348"}.ion-md-pie:before{content:"\f349"}.ion-md-pin:before{content:"\f34a"}.ion-md-pint:before{content:"\f34b"}.ion-md-pizza:before{content:"\f354"}.ion-md-planet:before{content:"\f356"}.ion-md-play:before{content:"\f357"}.ion-md-play-circle:before{content:"\f174"}.ion-md-podium:before{content:"\f358"}.ion-md-power:before{content:"\f359"}.ion-md-pricetag:before{content:"\f35a"}.ion-md-pricetags:before{content:"\f35b"}.ion-md-print:before{content:"\f35c"}.ion-md-pulse:before{content:"\f35d"}.ion-md-qr-scanner:before{content:"\f35e"}.ion-md-quote:before{content:"\f35f"}.ion-md-radio:before{content:"\f362"}.ion-md-radio-button-off:before{content:"\f360"}.ion-md-radio-button-on:before{content:"\f361"}.ion-md-rainy:before{content:"\f363"}.ion-md-recording:before{content:"\f364"}.ion-md-redo:before{content:"\f365"}.ion-md-refresh:before{content:"\f366"}.ion-md-refresh-circle:before{content:"\f228"}.ion-md-remove:before{content:"\f368"}.ion-md-remove-circle:before{content:"\f367"}.ion-md-remove-circle-outline:before{content:"\f176"}.ion-md-reorder:before{content:"\f369"}.ion-md-repeat:before{content:"\f36a"}.ion-md-resize:before{content:"\f36b"}.ion-md-restaurant:before{content:"\f36c"}.ion-md-return-left:before{content:"\f36d"}.ion-md-return-right:before{content:"\f36e"}.ion-md-reverse-camera:before{content:"\f36f"}.ion-md-rewind:before{content:"\f370"}.ion-md-ribbon:before{content:"\f371"}.ion-md-rocket:before{content:"\f179"}.ion-md-rose:before{content:"\f372"}.ion-md-sad:before{content:"\f373"}.ion-md-save:before{content:"\f1a9"}.ion-md-school:before{content:"\f374"}.ion-md-search:before{content:"\f375"}.ion-md-send:before{content:"\f376"}.ion-md-settings:before{content:"\f377"}.ion-md-share:before{content:"\f379"}.ion-md-share-alt:before{content:"\f378"}.ion-md-shirt:before{content:"\f37a"}.ion-md-shuffle:before{content:"\f37b"}.ion-md-skip-backward:before{content:"\f37c"}.ion-md-skip-forward:before{content:"\f37d"}.ion-md-snow:before{content:"\f37e"}.ion-md-speedometer:before{content:"\f37f"}.ion-md-square:before{content:"\f381"}.ion-md-square-outline:before{content:"\f380"}.ion-md-star:before{content:"\f384"}.ion-md-star-half:before{content:"\f382"}.ion-md-star-outline:before{content:"\f383"}.ion-md-stats:before{content:"\f385"}.ion-md-stopwatch:before{content:"\f386"}.ion-md-subway:before{content:"\f387"}.ion-md-sunny:before{content:"\f388"}.ion-md-swap:before{content:"\f389"}.ion-md-switch:before{content:"\f38a"}.ion-md-sync:before{content:"\f38b"}.ion-md-tablet-landscape:before{content:"\f38c"}.ion-md-tablet-portrait:before{content:"\f38d"}.ion-md-tennisball:before{content:"\f38e"}.ion-md-text:before{content:"\f38f"}.ion-md-thermometer:before{content:"\f390"}.ion-md-thumbs-down:before{content:"\f391"}.ion-md-thumbs-up:before{content:"\f392"}.ion-md-thunderstorm:before{content:"\f393"}.ion-md-time:before{content:"\f394"}.ion-md-timer:before{content:"\f395"}.ion-md-today:before{content:"\f17d"}.ion-md-train:before{content:"\f396"}.ion-md-transgender:before{content:"\f397"}.ion-md-trash:before{content:"\f398"}.ion-md-trending-down:before{content:"\f399"}.ion-md-trending-up:before{content:"\f39a"}.ion-md-trophy:before{content:"\f39b"}.ion-md-tv:before{content:"\f17f"}.ion-md-umbrella:before{content:"\f39c"}.ion-md-undo:before{content:"\f39d"}.ion-md-unlock:before{content:"\f39e"}.ion-md-videocam:before{content:"\f39f"}.ion-md-volume-high:before{content:"\f123"}.ion-md-volume-low:before{content:"\f131"}.ion-md-volume-mute:before{content:"\f3a1"}.ion-md-volume-off:before{content:"\f3a2"}.ion-md-walk:before{content:"\f3a4"}.ion-md-wallet:before{content:"\f18f"}.ion-md-warning:before{content:"\f3a5"}.ion-md-watch:before{content:"\f3a6"}.ion-md-water:before{content:"\f3a7"}.ion-md-wifi:before{content:"\f3a8"}.ion-md-wine:before{content:"\f3a9"}.ion-md-woman:before{content:"\f3aa"} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/laravel.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/laravel.css deleted file mode 100644 index bae0c3ab..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/laravel.css +++ /dev/null @@ -1,113 +0,0 @@ -.nav-tabs > li > a { - text-decoration: none; -} - -.navbar-default .navbar-brand { - color: #f4645f; - text-decoration: none; - font-size: 16px; -} - -.menu ul.list li a[data-type='chapter-link'], -.menu ul.list li.chapter .simple { - color: #525252; - border-bottom: 1px dashed rgba(0, 0, 0, 0.1); -} - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5 { - color: #292e31; - font-weight: normal; -} - -.content { - color: #4c555a; -} - -a { - color: #f4645f; - text-decoration: underline; -} -a:hover { - color: #f1362f; -} - -.menu ul.list li:nth-child(2) { - margin-top: 0; -} - -.menu ul.list li.title a { - color: #f4645f; - text-decoration: none; - font-size: 16px; -} - -.menu ul.list li a { - color: #f4645f; - text-decoration: none; -} -.menu ul.list li a.active { - color: #f4645f; - font-weight: bold; -} - -code { - box-sizing: border-box; - display: inline-block; - padding: 0 5px; - background: #f0f2f1; - border-radius: 3px; - color: #b93d6a; - font-size: 13px; - line-height: 20px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.125); -} - -pre { - margin: 0; - padding: 12px 12px; - background: rgba(238, 238, 238, 0.35); - border-radius: 3px; - font-size: 13px; - line-height: 1.5em; - font-weight: 500; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.125); -} - -.dark body { - color: #fafafa; -} -.dark .content h1, -.dark .content h2, -.dark .content h3, -.dark .content h4, -.dark .content h5 { - color: #fafafa; -} - -.dark code { - background: none; -} - -.dark .content { - color: #fafafa; -} - -.dark .menu ul.list li a[data-type='chapter-link'], -.dark .menu ul.list li.chapter .simple { - color: #fafafa; -} - -.dark .menu ul.list li.title a { - color: #fafafa; -} - -.dark .menu ul.list li a { - color: #fafafa; -} -.dark .menu ul.list li a.active { - color: #7fc9ff; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/material.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/material.css deleted file mode 100644 index 84d6c0ea..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/material.css +++ /dev/null @@ -1,131 +0,0 @@ -.menu { - background: none; -} - -a:hover { - text-decoration: none; -} - -/** LINK **/ - -.menu ul.list li a { - text-decoration: none; -} - -.menu ul.list li a:hover, -.menu ul.list li.chapter .simple:hover { - background-color: #f8f9fa; - text-decoration: none; -} - -#book-search-input { - margin-bottom: 0; -} - -.menu ul.list li.divider { - margin-top: 0; - background: #e9ecef; -} - -.menu .title:hover { - background-color: #f8f9fa; -} - -/** CARD **/ - -.card { - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), - 0 1px 5px 0 rgba(0, 0, 0, 0.12); - border-radius: 0.125rem; - border: 0; - margin-top: 1px; -} - -.card-header { - background: none; -} - -/** BUTTON **/ - -.btn { - border-radius: 0.125rem; -} - -/** NAV BAR **/ - -.nav { - border: 0; -} -.nav-tabs > li > a { - border: 0; - border-bottom: 0.214rem solid transparent; - color: rgba(0, 0, 0, 0.54); - margin-right: 0; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:focus, -.nav-tabs > li.active > a:hover { - color: rgba(0, 0, 0, 0.87); - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 0.214rem solid transparent; - border-color: #008cff; - font-weight: bold; -} -.nav > li > a:focus, -.nav > li > a:hover { - background: none; -} - -/** LIST **/ - -.list-group-item:first-child { - border-top-left-radius: 0.125rem; - border-top-right-radius: 0.125rem; -} -.list-group-item:last-child { - border-bottom-left-radius: 0.125rem; - border-bottom-right-radius: 0.125rem; -} - -/** MISC **/ - -.modifier { - border-radius: 0.125rem; -} - -pre[class*='language-'] { - border-radius: 0.125rem; -} - -/** TABLE **/ - -.table-hover > tbody > tr:hover { - background: rgba(0, 0, 0, 0.075); -} - -table.params thead { - background: none; -} -table.params thead td { - color: rgba(0, 0, 0, 0.54); - font-weight: bold; -} - -.dark .menu .title:hover { - background-color: #2d2d2d; -} -.dark .menu ul.list li a:hover, -.dark .menu ul.list li.chapter .simple:hover { - background-color: #2d2d2d; -} -.dark .nav-tabs > li:not(.active) > a { - color: #fafafa; -} -.dark table.params thead { - background: #484848; -} -.dark table.params thead td { - color: #fafafa; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/original.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/original.css deleted file mode 100644 index 8e018149..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/original.css +++ /dev/null @@ -1,51 +0,0 @@ -.navbar-default .navbar-brand, -.menu ul.list li.title { - font-weight: bold; - color: #3c3c3c; - padding-bottom: 5px; -} - -.menu ul.list li a[data-type='chapter-link'], -.menu ul.list li.chapter .simple { - font-weight: bold; - font-size: 14px; -} - -.menu ul.list li a[href='./routes.html'] { - border-bottom: none; -} - -.menu ul.list > li:nth-child(2) { - display: none; -} - -.menu ul.list li.chapter ul.links { - background: #fff; - padding-left: 0; -} - -.menu ul.list li.chapter ul.links li { - border-bottom: 1px solid #ddd; - padding-left: 20px; -} - -.menu ul.list li.chapter ul.links li:last-child { - border-bottom: none; -} - -.menu ul.list li a.active { - color: #337ab7; - font-weight: bold; -} - -#book-search-input { - margin-bottom: 0; - border-bottom: none; -} -.menu ul.list li.divider { - margin: 0; -} - -.dark .menu ul.list li.chapter ul.links { - background: none; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/postmark.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/postmark.css deleted file mode 100644 index ae8be3e9..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/postmark.css +++ /dev/null @@ -1,238 +0,0 @@ -.navbar-default { - background: #ffde00; - border: none; -} - -.navbar-default .navbar-brand { - color: #333; - font-weight: bold; -} - -.menu { - background: #333; - color: #fcfcfc; -} - -.menu ul.list li a { - color: #333; -} - -.menu ul.list li.title { - background: #ffde00; - color: #333; - padding-bottom: 5px; -} - -.menu ul.list li:nth-child(2) { - margin-top: 0; -} - -.menu ul.list li.chapter a, -.menu ul.list li.chapter .simple { - color: white; - text-decoration: none; -} - -.menu ul.list li.chapter ul.links a { - color: #949494; - text-transform: none; - padding-left: 35px; -} - -.menu ul.list li.chapter ul.links a:hover, -.menu ul.list li.chapter ul.links a.active { - color: #ffde00; -} - -.menu ul.list li.chapter ul.links { - padding-left: 0; -} - -.menu ul.list li.divider { - background: rgba(255, 255, 255, 0.07); -} - -#book-search-input input, -#book-search-input input:focus, -#book-search-input input:hover { - color: #949494; -} - -.copyright { - color: #b3b3b3; - background: #272525; -} - -.content { - background: #fcfcfc; -} - -.content a { - color: #007dcc; -} - -.content a:visited { - color: #0165a5; -} - -.menu ul.list li:nth-last-child(2) { - background: none; -} - -.list-group-item:first-child, -.list-group-item:last-child { - border-radius: 0; -} - -.menu ul.list li.title a { - text-decoration: none; - font-weight: bold; -} - -.menu ul.list li.title a:hover { - background: rgba(255, 255, 255, 0.1); -} - -.breadcrumb > li + li:before { - content: '»\00a0'; -} - -.breadcrumb { - padding-bottom: 15px; - border-bottom: 1px solid #e1e4e5; -} - -code { - white-space: nowrap; - max-width: 100%; - background: #f5f5f5; - padding: 2px 5px; - color: #666666; - overflow-x: auto; - border-radius: 0; -} - -pre { - white-space: pre; - margin: 0; - padding: 12px 12px; - font-size: 12px; - line-height: 1.5; - display: block; - overflow: auto; - color: #404040; - background: #f3f3f3; -} - -pre code.hljs { - border: none; - background: inherit; -} - -/* -Atom One Light by Daniel Gamage -Original One Light Syntax theme from https://github.com/atom/one-light-syntax -base: #fafafa -mono-1: #383a42 -mono-2: #686b77 -mono-3: #a0a1a7 -hue-1: #0184bb -hue-2: #4078f2 -hue-3: #a626a4 -hue-4: #50a14f -hue-5: #e45649 -hue-5-2: #c91243 -hue-6: #986801 -hue-6-2: #c18401 -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #383a42; - background: #fafafa; -} - -.hljs-comment, -.hljs-quote { - color: #a0a1a7; - font-style: italic; -} - -.hljs-doctag, -.hljs-keyword, -.hljs-formula { - color: #a626a4; -} - -.hljs-section, -.hljs-name, -.hljs-selector-tag, -.hljs-deletion, -.hljs-subst { - color: #e45649; -} - -.hljs-literal { - color: #0184bb; -} - -.hljs-string, -.hljs-regexp, -.hljs-addition, -.hljs-attribute, -.hljs-meta-string { - color: #50a14f; -} - -.hljs-built_in, -.hljs-class .hljs-title { - color: #c18401; -} - -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-type, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-number { - color: #986801; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-meta, -.hljs-selector-id, -.hljs-title { - color: #4078f2; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-link { - text-decoration: underline; -} - -.dark .content { - background: none; -} -.dark code { - background: none; - color: #e09393; -} -.dark .menu ul.list li.chapter a.active { - color: #ffde00; -} -.dark .menu { - background: #272525; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/prism.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/prism.css deleted file mode 100644 index 46a643b9..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/prism.css +++ /dev/null @@ -1,301 +0,0 @@ -/* PrismJS 1.24.0 -https://prismjs.com/download.html?#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+aspnet+bash+c+csharp+cpp+coffeescript+dart+docker+elm+git+go+graphql+handlebars+haskell+http+ignore+java+json+kotlin+less+markdown+markup-templating+nginx+php+powershell+ruby+rust+sass+scss+sql+swift+typescript+wasm+yaml&plugins=line-highlight+line-numbers+toolbar+copy-to-clipboard */ -/** - * okaidia theme for JavaScript, CSS and HTML - * Loosely based on Monokai textmate theme by http://www.monokai.nl/ - * @author ocodia - */ - -code[class*='language-'], -pre[class*='language-'] { - color: #f8f8f2; - background: none; - text-shadow: 0 1px rgba(0, 0, 0, 0.3); - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -/* Code blocks */ -pre[class*='language-'] { - padding: 1em; - margin: 0.5em 0; - overflow: auto; - border-radius: 0.3em; -} - -:not(pre) > code[class*='language-'], -pre[class*='language-'] { - background: #272822; -} - -/* Inline code */ -:not(pre) > code[class*='language-'] { - padding: 0.1em; - border-radius: 0.3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #8292a2; -} - -.token.punctuation { - color: #f8f8f2; -} - -.token.namespace { - opacity: 0.7; -} - -.token.property, -.token.tag, -.token.constant, -.token.symbol, -.token.deleted { - color: #f92672; -} - -.token.boolean, -.token.number { - color: #ae81ff; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #a6e22e; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string, -.token.variable { - color: #f8f8f2; -} - -.token.atrule, -.token.attr-value, -.token.function, -.token.class-name { - color: #e6db74; -} - -.token.keyword { - color: #66d9ef; -} - -.token.regex, -.token.important { - color: #fd971f; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -pre[data-line] { - position: relative; - padding: 1em 0 1em 3em; -} - -.line-highlight { - position: absolute; - left: 0; - right: 0; - padding: inherit 0; - margin-top: 1em; /* Same as .prism’s padding-top */ - - background: hsla(24, 20%, 50%, 0.08); - background: linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0)); - - pointer-events: none; - - line-height: inherit; - white-space: pre; -} - -@media print { - .line-highlight { - /* - * This will prevent browsers from replacing the background color with white. - * It's necessary because the element is layered on top of the displayed code. - */ - -webkit-print-color-adjust: exact; - color-adjust: exact; - } -} - -.line-highlight:before, -.line-highlight[data-end]:after { - content: attr(data-start); - position: absolute; - top: 0.4em; - left: 0.6em; - min-width: 1em; - padding: 0 0.5em; - background-color: hsla(24, 20%, 50%, 0.4); - color: hsl(24, 20%, 95%); - font: bold 65%/1.5 sans-serif; - text-align: center; - vertical-align: 0.3em; - border-radius: 999px; - text-shadow: none; - box-shadow: 0 1px white; -} - -.line-highlight[data-end]:after { - content: attr(data-end); - top: auto; - bottom: 0.4em; -} - -.line-numbers .line-highlight:before, -.line-numbers .line-highlight:after { - content: none; -} - -pre[id].linkable-line-numbers span.line-numbers-rows { - pointer-events: all; -} -pre[id].linkable-line-numbers span.line-numbers-rows > span:before { - cursor: pointer; -} -pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before { - background-color: rgba(128, 128, 128, 0.2); -} - -pre[class*='language-'].line-numbers { - position: relative; - padding-left: 3.8em; - counter-reset: linenumber; -} - -pre[class*='language-'].line-numbers > code { - position: relative; - white-space: inherit; -} - -.line-numbers .line-numbers-rows { - position: absolute; - pointer-events: none; - top: 0; - font-size: 100%; - left: -3.8em; - width: 3em; /* works for line-numbers below 1000 lines */ - letter-spacing: -1px; - border-right: 1px solid #999; - - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.line-numbers-rows > span { - display: block; - counter-increment: linenumber; -} - -.line-numbers-rows > span:before { - content: counter(linenumber); - color: #999; - display: block; - padding-right: 0.8em; - text-align: right; -} - -div.code-toolbar { - position: relative; -} - -div.code-toolbar > .toolbar { - position: absolute; - top: 0.3em; - right: 0.2em; - transition: opacity 0.3s ease-in-out; - opacity: 0; -} - -div.code-toolbar:hover > .toolbar { - opacity: 1; -} - -/* Separate line b/c rules are thrown out if selector is invalid. - IE11 and old Edge versions don't support :focus-within. */ -div.code-toolbar:focus-within > .toolbar { - opacity: 1; -} - -div.code-toolbar > .toolbar .toolbar-item { - display: inline-block; -} - -div.code-toolbar > .toolbar a { - cursor: pointer; -} - -div.code-toolbar > .toolbar button { - background: none; - border: 0; - color: inherit; - font: inherit; - line-height: normal; - overflow: visible; - padding: 0; - -webkit-user-select: none; /* for button */ - -moz-user-select: none; - -ms-user-select: none; -} - -div.code-toolbar > .toolbar a, -div.code-toolbar > .toolbar button, -div.code-toolbar > .toolbar span { - color: #bbb; - font-size: 0.8em; - padding: 0 0.5em; - background: #f5f2f0; - background: rgba(224, 224, 224, 0.2); - box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); - border-radius: 0.5em; -} - -div.code-toolbar > .toolbar a:hover, -div.code-toolbar > .toolbar a:focus, -div.code-toolbar > .toolbar button:hover, -div.code-toolbar > .toolbar button:focus, -div.code-toolbar > .toolbar span:hover, -div.code-toolbar > .toolbar span:focus { - color: inherit; - text-decoration: none; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/readthedocs.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/readthedocs.css deleted file mode 100644 index c3e9452f..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/readthedocs.css +++ /dev/null @@ -1,117 +0,0 @@ -.navbar-default { - background: #2980b9; - border: none; -} - -.navbar-default .navbar-brand { - color: #fcfcfc; -} - -.menu { - background: #343131; - color: #fcfcfc; -} - -.menu ul.list li a { - color: #fcfcfc; -} - -.menu ul.list li.title { - background: #2980b9; - padding-bottom: 5px; -} - -.menu ul.list li:nth-child(2) { - margin-top: 0; -} - -.menu ul.list li.chapter a, -.menu ul.list li.chapter .simple { - color: #555; - text-transform: uppercase; - text-decoration: none; -} - -.menu ul.list li.chapter ul.links a { - color: #b3b3b3; - text-transform: none; - padding-left: 35px; -} - -.menu ul.list li.chapter ul.links a:hover { - background: #4e4a4a; -} - -.menu ul.list li.chapter a.active, -.menu ul.list li.chapter ul.links a.active { - color: #0099e5; -} - -.menu ul.list li.chapter ul.links { - padding-left: 0; -} - -.menu ul.list li.divider { - background: rgba(255, 255, 255, 0.07); -} - -#book-search-input input, -#book-search-input input:focus, -#book-search-input input:hover { - color: #949494; -} - -.copyright { - color: #b3b3b3; - background: #272525; -} - -.content { - background: #fcfcfc; -} - -.content a { - color: #2980b9; -} - -.content a:hover { - color: #3091d1; -} - -.content a:visited { - color: #9b59b6; -} - -.menu ul.list li:nth-last-child(2) { - background: none; -} - -code { - white-space: nowrap; - max-width: 100%; - background: #fff; - padding: 2px 5px; - color: #e74c3c; - overflow-x: auto; - border-radius: 0; -} - -pre { - white-space: pre; - margin: 0; - padding: 12px 12px; - font-size: 12px; - line-height: 1.5; - display: block; - overflow: auto; - color: #404040; - background: rgba(238, 238, 238, 0.35); -} - -.dark .content { - background: none; -} -.dark code { - background: none; - color: #e09393; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/reset.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/reset.css deleted file mode 100644 index 9a153b52..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/reset.css +++ /dev/null @@ -1,129 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, -body, -div, -span, -applet, -object, -iframe, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -big, -cite, -code, -del, -dfn, -em, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -b, -u, -i, -center, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - font-size: 100%; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { - display: block; -} -body { - line-height: 1; -} -ol, -ul { - list-style: none; -} -blockquote, -q { - quotes: none; -} -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/stripe.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/stripe.css deleted file mode 100644 index 8e41582a..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/stripe.css +++ /dev/null @@ -1,106 +0,0 @@ -.navbar-default .navbar-brand { - color: #0099e5; -} - -.menu ul.list li a[data-type='chapter-link'], -.menu ul.list li.chapter .simple { - color: #939da3; - text-transform: uppercase; -} - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5 { - color: #292e31; - font-weight: normal; -} - -.content { - color: #4c555a; -} - -.menu ul.list li.title { - padding: 5px 0; -} - -a { - color: #0099e5; - text-decoration: none; -} -a:hover { - color: #292e31; - text-decoration: none; -} - -.menu ul.list li:nth-child(2) { - margin-top: 0; -} - -.menu ul.list li.title a, -.navbar a { - color: #0099e5; - text-decoration: none; - font-size: 16px; -} - -.menu ul.list li a.active { - color: #0099e5; -} - -code { - box-sizing: border-box; - display: inline-block; - padding: 0 5px; - background: #fafcfc; - border-radius: 4px; - color: #b93d6a; - font-size: 13px; - line-height: 20px; -} - -pre { - margin: 0; - padding: 12px 12px; - background: #272b2d; - border-radius: 5px; - font-size: 13px; - line-height: 1.5em; - font-weight: 500; -} - -.dark body { - color: #fafafa; -} -.dark .content h1, -.dark .content h2, -.dark .content h3, -.dark .content h4, -.dark .content h5 { - color: #fafafa; -} - -.dark code { - background: none; -} - -.dark .content { - color: #fafafa; -} - -.dark .menu ul.list li a[data-type='chapter-link'], -.dark .menu ul.list li.chapter .simple { - color: #fafafa; -} - -.dark .menu ul.list li.title a { - color: #fafafa; -} - -.dark .menu ul.list li a { - color: #fafafa; -} -.dark .menu ul.list li a.active { - color: #7fc9ff; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/style.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/style.css deleted file mode 100644 index 3287e7cd..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/style.css +++ /dev/null @@ -1,110 +0,0 @@ -@import "./reset.css"; -@import "./bootstrap.min.css"; -@import "./bootstrap-card.css"; -@import "./prism.css"; -@import "./ionicons.min.css"; -@import "./compodoc.css"; -@import "./tablesort.css"; - -.title { - font-weight: bold; -} -/* .getting-started { - display: none; -} */ - -.language-typescript, .token.attr-name { - color: #b6e8ff !important; -} -.token.keyword { - color: rgb(165, 119, 196); -} - -.token.punctuation { - color: #ebca5e; -} - -.token.constant, .token.tag { - color: #58b4ff; -} - -.token.function { - color: #f3d398; -} - -.language-html .token.punctuation.attr-equals{ - color: #fff !important; -} - -.token.tag .token.punctuation { - color: #dadada; -} - -.token.string, .token.attr-value, .token.attr-value .punctuation { - color: #dfa178; -} - -.token.builtin, .token.atrule, .token.class-name { - color: #61d6a0; -} - -.italic { - font-style: italic; -} -.component-link-text { - padding-top: 5px; - text-align: center; - font-size: 14px; -} -div>p { - font-size: 16px; -} - -code { - font-weight: bold; - padding: 2px; -} - -.directive section, .module-graph-container, .card-module>.card-block>p, - nav a[href*="license.html"], - nav a[href*="properties.html"], - nav a[href*="overview.html"], - nav a[href*="index.html"], -.component .tab-pane section[data-compodoc="block-accessors"] { - display: none !important; -} - -.card-module { - min-height: 0; -} - -.warn-container, .info-container { - border-radius: 5px; - width: 100%; - margin-top: 5px; - margin-bottom: 5px; - padding: 10px; -} - -.info-container > span, .warn-container >span { - font-weight: bold; - padding-left: 5px; -} - -.warn-container { - border: 2px solid #ffb600; - background-color: #FFFBF1; -} - -.dark .warn-container { - background-color: #6b6045; -} - -.info-container { - border: 2px solid #0077ff; - background-color: #f1feff; -} - -.dark .info-container { - background-color: #556d6e; -} \ No newline at end of file diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/tablesort.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/tablesort.css deleted file mode 100644 index f7154838..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/tablesort.css +++ /dev/null @@ -1,33 +0,0 @@ -th[role=columnheader]:not(.no-sort) { - cursor: pointer; -} - -th[role=columnheader]:not(.no-sort):after { - content: ''; - float: right; - margin-top: 7px; - border-width: 0 4px 4px; - border-style: solid; - border-color: #404040 transparent; - visibility: visible; - opacity: 1; - -ms-user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; -} - -th[aria-sort=ascending]:not(.no-sort):after { - border-bottom: none; - border-width: 4px 4px 0; -} - -th[aria-sort]:not(.no-sort):after { - visibility: visible; - opacity: 0.4; -} - -th[role=columnheader]:not(.no-sort):hover:after { - visibility: visible; - opacity: 1; -} diff --git a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/vagrant.css b/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/vagrant.css deleted file mode 100644 index f72edb01..00000000 --- a/3.0.0-beta3/docs/reference-docs/openvidu-components-angular/styles/vagrant.css +++ /dev/null @@ -1,130 +0,0 @@ -.navbar-default .navbar-brand { - background: white; - color: #8d9ba8; -} - -.menu .list { - background: #0c5593; -} - -.menu .chapter { - padding: 0 20px; -} - -.menu ul.list li a[data-type='chapter-link'], -.menu ul.list li.chapter .simple { - color: white; - text-transform: uppercase; - border-bottom: 1px solid rgba(255, 255, 255, 0.4); -} - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5 { - color: #292e31; - font-weight: normal; -} - -.content { - color: #4c555a; -} - -a { - color: #0094bf; - text-decoration: underline; -} -a:hover { - color: #f1362f; -} - -.menu ul.list li.title { - background: white; - padding-bottom: 5px; -} - -.menu ul.list li:nth-child(2) { - margin-top: 0; -} - -.menu ul.list li:nth-last-child(2) { - background: none; -} - -.menu ul.list li.title a { - padding: 10px 15px; -} - -.menu ul.list li.title a, -.navbar a { - color: #8d9ba8; - text-decoration: none; - font-size: 16px; - font-weight: 300; -} - -.menu ul.list li a { - color: white; - padding: 10px; - font-weight: 300; - text-decoration: none; -} -.menu ul.list li a.active { - color: white; - font-weight: bold; -} - -.copyright { - color: white; - background: #000; -} - -code { - box-sizing: border-box; - display: inline-block; - padding: 0 5px; - background: rgba(0, 148, 191, 0.1); - border-radius: 3px; - color: #0094bf; - font-size: 13px; - line-height: 20px; -} - -pre { - margin: 0; - padding: 12px 12px; - background: rgba(238, 238, 238, 0.35); - border-radius: 3px; - font-size: 13px; - line-height: 1.5em; - font-weight: 500; -} - -.dark body { - color: #fafafa; -} -.dark .content h1, -.dark .content h2, -.dark .content h3, -.dark .content h4, -.dark .content h5 { - color: #fafafa; -} - -.dark code { - background: none; -} - -.dark .content { - color: #fafafa; -} - -.dark .menu ul.list li.title a, -.dark .navbar a { - color: #8d9ba8; -} - -.dark .menu ul.list li a { - color: #fafafa; -} diff --git a/3.0.0-beta3/docs/releases/index.html b/3.0.0-beta3/docs/releases/index.html deleted file mode 100644 index eab8b935..00000000 --- a/3.0.0-beta3/docs/releases/index.html +++ /dev/null @@ -1,4548 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Releases - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Releases

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    3.0.0-beta3#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Changelog#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Centralized configuration: OpenVidu now automatically manages and synchronizes the configuration of all its components. This means that updating any configuration parameter in multi-node deployments (OpenVidu Elastic and OpenVidu High Availability) is as simple as updating the required file in a single node. OpenVidu handles the distribution and restart of the affected services across all nodes. See how easily you can change the configuration here.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • mediasoup support: -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Call:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • When using it against an OpenVidu Local Deployment, recordings couldn't be accessed from the application's frontend. This is now fixed and OpenVidu Call is able to access recordings.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • There was an error when applying Virtual Backgrounds ("No camera tracks found. Cannot apply background"). This is now fixed.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Docker image openvidu/openvidu-call is now 50% smaller.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu v2 compatibility:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • There was a race condition when multiple participants connected to the Session at the same time that could cause remote streamCreated events to not be triggered. This is now fixed.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Configuration parameter V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET did not allow configuring subbuckets ("openvidu" worked fine, but "openvidu/subbucket" did not). Now it is possible to do so.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • The operation to list recordings (available for REST API, openvidu-java-client, openvidu-node-client) was limited to 1000 recordings. This is now fixed and all recordings are always returned.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AWS deployments: all secrets are now synchronized with AWS Secrets Manager. You can update any secret from the AWS console and restart your cluster for them to have immediate effect in all your nodes. This is also true in reverse: you can update any secret inside your node and after a restart of the cluster, the values in AWS Secrets Manager will be properly synchronized.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • New application tutorials available: iOS, Android, Recording.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Known limitations#

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Version table#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ArtifactVersionInfoLink
                                                                                                                                                                                                    livekit/livekit-serverv1.7.2
                                                                                                                                                                                                    mediasoup3.12.16
                                                                                                                                                                                                    livekit/egressv1.8.2
                                                                                                                                                                                                    livekit/ingressv1.4.2
                                                                                                                                                                                                    MinIO2024.6.13
                                                                                                                                                                                                    Caddy2.8.4
                                                                                                                                                                                                    MongoDB7.0.11
                                                                                                                                                                                                    Redis7.2.5
                                                                                                                                                                                                    Grafana10.3.3
                                                                                                                                                                                                    Prometheus2.50.1
                                                                                                                                                                                                    Promtail / Loki2.8.9
                                                                                                                                                                                                    Mimir2.11.0
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3.0.0-beta2#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Changelog#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Improved mediasoup support: -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Improved OpenVidu Local Deployment: -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Production deployments have a better private IP discovery process when there are multiple valid private IPs in the same host. This will make work more deployments out-of-the-box without the need of manual intervention.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu PRO Evaluation Mode improved. Before a maximum a 2 Rooms of 8 Participants each could be created. Now the upper limit of Participants still apply, but the number of Rooms is unlimited. For example you can have 4 Rooms of 2 Participants each, or 1 Room of 8 Participants.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Minor bug fixes related to OpenVidu Call.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Known limitations#

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Version table#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ArtifactVersionInfoLink
                                                                                                                                                                                                    livekit/livekit-serverv1.6.0
                                                                                                                                                                                                    mediasoup3.12.16
                                                                                                                                                                                                    livekit/egressv1.8.2
                                                                                                                                                                                                    livekit/ingressv1.2.0
                                                                                                                                                                                                    MinIO2024.06.13
                                                                                                                                                                                                    Caddy2.7.6
                                                                                                                                                                                                    MongoDB7.0.11
                                                                                                                                                                                                    Redis7.2.5
                                                                                                                                                                                                    Grafana10.3.3
                                                                                                                                                                                                    Prometheus2.50.1
                                                                                                                                                                                                    Promtail / Loki2.8.9
                                                                                                                                                                                                    Mimir2.11.0
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3.0.0-beta1#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Version table#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ArtifactVersionInfoLink
                                                                                                                                                                                                    livekit/livekit-serverv1.6.0
                                                                                                                                                                                                    mediasoup3.12.16
                                                                                                                                                                                                    livekit/egressv1.8.2
                                                                                                                                                                                                    livekit/ingressv1.2.0
                                                                                                                                                                                                    MinIO2024.06.13
                                                                                                                                                                                                    Caddy2.7.6
                                                                                                                                                                                                    MongoDB7.0.11
                                                                                                                                                                                                    Redis7.2.5
                                                                                                                                                                                                    Grafana10.3.3
                                                                                                                                                                                                    Prometheus2.50.1
                                                                                                                                                                                                    Promtail / Loki2.8.9
                                                                                                                                                                                                    Mimir2.11.0
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/configuration/changing-config/index.html b/3.0.0-beta3/docs/self-hosting/configuration/changing-config/index.html deleted file mode 100644 index 08c50e73..00000000 --- a/3.0.0-beta3/docs/self-hosting/configuration/changing-config/index.html +++ /dev/null @@ -1,4246 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Changing configuration - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    How to change OpenVidu configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The following steps are valid to change any configuration file in any deployment type. Simply just go to one of your Master Nodes, or the only Node in your deployment, and follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Go to one of your Master Nodes (or the only node in your deployment).
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Go to /opt/openvidu/config directory.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Find and change the configuration parameter you want to modify, it could be any file: openvidu.env, master_node.env, livekit.yaml, egress.yaml, etc.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Restart OpenVidu just by executing:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl restart openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notice that you only need to restart OpenVidu in one of the Master Nodes (or the only node in your deployment) to apply the changes to all the nodes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Types of configuration files#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration files can be divided into three types:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. openvidu.env: This file defines configuration parameters used by other services. Such as the domain name, credentials, etc.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. master_node.env and media_node.env (Only in Elastic and High Availability): These files define specific configuration parameters of the node they are placed in. It is very useful when you want to have different parameter values in different nodes.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      <service>.yaml or <service>.env: These files define the configuration of each service. For example, livekit.yaml defines the configuration of the OpenVidu Server, egress.yaml defines the configuration of the Egress Service, etc.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      These files make use of the parameters defined in the openvidu.env, master_node.env, and media_node.env files. For example, any service configuration file can access the DOMAIN_NAME parameter defined in the openvidu.env file by using this syntax:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ${openvidu.DOMAIN_NAME}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can check the OpenVidu Configuration In depth section to learn more about how the configuration system works.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Config files#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These are the configuration files for each kind of deployment:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The single node has all configuration files in the same directory /opt/openvidu/config/:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    |-- /opt/openvidu/config/
                                                                                                                                                                                                    -    |-- openvidu.env
                                                                                                                                                                                                    -    |-- livekit.yaml
                                                                                                                                                                                                    -    |-- egress.yaml
                                                                                                                                                                                                    -    |-- ingress.yaml
                                                                                                                                                                                                    -    |-- caddy.yaml
                                                                                                                                                                                                    -    |-- redis.env
                                                                                                                                                                                                    -    |-- minio.env
                                                                                                                                                                                                    -    |-- mongo.env
                                                                                                                                                                                                    -    |-- dashboard.env
                                                                                                                                                                                                    -    |-- loki.yaml
                                                                                                                                                                                                    -    |-- prometheus.yaml
                                                                                                                                                                                                    -    |-- promtail.yaml
                                                                                                                                                                                                    -    |-- app.env
                                                                                                                                                                                                    -    `-- grafana/
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    -
                                                                                                                                                                                                    |-- /opt/openvidu/config/
                                                                                                                                                                                                    -    |-- cluster/
                                                                                                                                                                                                    -    |   |-- openvidu.env
                                                                                                                                                                                                    -    |   |-- master_node/
                                                                                                                                                                                                    -    |   |   |-- grafana/
                                                                                                                                                                                                    -    |   |   |-- app.env
                                                                                                                                                                                                    -    |   |   |-- caddy.yaml
                                                                                                                                                                                                    -    |   |   |-- dashboard.env
                                                                                                                                                                                                    -    |   |   |-- loki.yaml
                                                                                                                                                                                                    -    |   |   |-- mimir.yaml
                                                                                                                                                                                                    -    |   |   |-- minio.env
                                                                                                                                                                                                    -    |   |   |-- mongo.env
                                                                                                                                                                                                    -    |   |   |-- operator.env
                                                                                                                                                                                                    -    |   |   |-- promtail.yaml
                                                                                                                                                                                                    -    |   |   |-- redis.env
                                                                                                                                                                                                    -    |   |   `-- v2compatibility.env
                                                                                                                                                                                                    -    |   `-- media_node/
                                                                                                                                                                                                    -    |       |-- egress.yaml
                                                                                                                                                                                                    -    |       |-- ingress.yaml
                                                                                                                                                                                                    -    |       |-- livekit.yaml
                                                                                                                                                                                                    -    |       |-- prometheus.yaml
                                                                                                                                                                                                    -    |       `-- promtail.yaml
                                                                                                                                                                                                    -    `-- node/
                                                                                                                                                                                                    -    `-- master_node.env
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    |-- /opt/openvidu/config/
                                                                                                                                                                                                    -    `-- node/
                                                                                                                                                                                                    -        `-- media_node.env
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    -
                                                                                                                                                                                                    |-- /opt/openvidu/config/
                                                                                                                                                                                                    -    |-- cluster/
                                                                                                                                                                                                    -    |   |-- openvidu.env
                                                                                                                                                                                                    -    |   |-- master_node/
                                                                                                                                                                                                    -    |   |   |-- grafana/
                                                                                                                                                                                                    -    |   |   |-- app.env
                                                                                                                                                                                                    -    |   |   |-- caddy.yaml
                                                                                                                                                                                                    -    |   |   |-- dashboard.env
                                                                                                                                                                                                    -    |   |   |-- loki.yaml
                                                                                                                                                                                                    -    |   |   |-- mimir.yaml
                                                                                                                                                                                                    -    |   |   |-- minio.env
                                                                                                                                                                                                    -    |   |   |-- mongo.env
                                                                                                                                                                                                    -    |   |   |-- operator.env
                                                                                                                                                                                                    -    |   |   |-- promtail.yaml
                                                                                                                                                                                                    -    |   |   |-- redis.env
                                                                                                                                                                                                    -    |   |   `-- v2compatibility.env
                                                                                                                                                                                                    -    |   `-- media_node/
                                                                                                                                                                                                    -    |       |-- caddy.yaml
                                                                                                                                                                                                    -    |       |-- egress.yaml
                                                                                                                                                                                                    -    |       |-- ingress.yaml
                                                                                                                                                                                                    -    |       |-- livekit.yaml
                                                                                                                                                                                                    -    |       |-- prometheus.yaml
                                                                                                                                                                                                    -    |       `-- promtail.yaml
                                                                                                                                                                                                    -    `-- node/
                                                                                                                                                                                                    -    `-- master_node.env
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    |-- /opt/openvidu/config/
                                                                                                                                                                                                    -    `-- node/
                                                                                                                                                                                                    -        `-- media_node.env
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Troubleshooting configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After changing the configuration and restarting, you need to make sure that the changes have been applied correctly. Here are some tips to check if something is wrong. All the following commands must be executed in one of the Master Nodes (or the only node in your deployment):

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Execute a docker ps. If you see an openvidu-init container constantly restarting, it means that the configuration file you modified has a syntax error. Check the logs of this container to see the error with:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker logs openvidu-init
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The log is self-explanatory and will tell you what is wrong with the configuration file:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      service 'openvidu': Failed to process config file '/opt/openvidu/config/livekit.yaml': Errors found:
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    *  Error at line 18: Unmatched opening brace at position 7
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl restart openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Execute a docker ps. If you don't see the openvidu-init container, but you see some containers restarting, check the logs of those restarting containers to see what is wrong:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker logs <container_id>
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      If all the containers are running correctly, execute the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      tail -f /var/log/openvidu/nodes_errors.log
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you have an error like: 'No such file or directory' or simply the file is empty, the configuration is correct. If the file exists with content, some nodes may be malfunctioning. Check this file and failing container logs for errors.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      This is how the log file looks when there are Media Nodes with errors:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      [2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.5: Container 'openvidu' error:
                                                                                                                                                                                                      -could not parse config: yaml: unmarshal errors:
                                                                                                                                                                                                      -  line 17: cannot unmarshal !!str `trueee` into bool
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -[2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.4: Container 'openvidu' error:
                                                                                                                                                                                                      -could not parse config: yaml: unmarshal errors:
                                                                                                                                                                                                      -  line 17: cannot unmarshal !!str `trueee` into bool
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      As you can see, the log informs you about which Media Node is failing and the error that is causing the failure, so in this way you can fix the file which is causing the error. Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl restart openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      And again, check the logs until no errors appear.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/configuration/in-depth/index.html b/3.0.0-beta3/docs/self-hosting/configuration/in-depth/index.html deleted file mode 100644 index 970075ab..00000000 --- a/3.0.0-beta3/docs/self-hosting/configuration/in-depth/index.html +++ /dev/null @@ -1,4101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Configuration system in depth - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu configuration system in depth#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu utilizes a powerful and flexible system for configuring services by expanding global parameters defined in the configuration files. This mechanism ensures consistency and simplifies management by allowing global settings to be referenced across multiple service configurations. The variable expansion follows the same interpolation rules as Docker Compose, providing a familiar syntax for those accustomed to Docker.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    How Variable Interpolation Works#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To understand how variable interpolation works in OpenVidu, it is important to consider two main types of configuration files: global configuration files and service configuration files.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Global Configuration Files:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Global parameters are defined in the global configuration files such as openvidu.env, master_node.env, and media_node.env.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • These files contain key-value pairs that define parameters than can be used in service configuration files.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Service Configuration Files:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Each service configuration file can reference these global parameters using a specific syntax.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • The syntax ${openvidu.ENV_VAR} is used to access and interpolate those values from the global configuration files.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • If you are configuring a service of the Master Node which needs a specific variable of the Master Node, you can use ${master_node.ENV_VAR}.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • If you are configuring a service of the Media Node which needs a specific variable of the Media Node, you can use ${media_node.ENV_VAR}.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Interpolation Rules:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • The interpolation follows the Docker Compose specification, which provides robust handling of global variables.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • If a variable is mandatory and not set, the syntax ${VAR:?mandatory} can be used to throw an error if the parameter is not defined, ensuring required configurations are not missed. For more detailed information about the interpolation rules, you can refer to the Docker Compose documentation on variable interpolation.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Example:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Look at this part of the /opt/openvidu/config/media_node/livekit.yaml configuration file in the Master Node of an Elastic deployment:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      openvidu:
                                                                                                                                                                                                      -    license: ${openvidu.OPENVIDU_PRO_LICENSE:?mandatory}
                                                                                                                                                                                                      -    cluster_id: ${openvidu.DOMAIN_NAME:?mandatory}
                                                                                                                                                                                                      -    node:
                                                                                                                                                                                                      -        private_ip: ${media_node.MEDIA_NODE_PRIVATE_IP:?mandatory}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This file uses global variables from the openvidu.env and media_node.env files to set up the license, cluster ID, and private IP address for the LiveKit service. The :?mandatory part means these variables must be defined; otherwise, an error will occur. Since this file is for a Media Node, it uses the media_node variables, allowing each Media Node to have different values for the same variable.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use a variable from the media_node.env file, write it as ${media_node.ENV_VAR}. Similarly, to use a variable from the openvidu.env or master_node.env file, write it as ${openvidu.ENV_VAR} or ${master_node.ENV_VAR} respectively.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Config Files Replication#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In Elastic and High Availability deployments, the configuration files are replicated across all the Master Nodes in the cluster.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This ensures that all nodes have the same configuration, making it easier to manage and maintain the cluster. The global configuration files are placed in the /opt/openvidu/config/cluster/ directory, while the node-specific configuration files are placed in the /opt/openvidu/config/node/ directory.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/configuration/reference/index.html b/3.0.0-beta3/docs/self-hosting/configuration/reference/index.html deleted file mode 100644 index f36436ab..00000000 --- a/3.0.0-beta3/docs/self-hosting/configuration/reference/index.html +++ /dev/null @@ -1,4557 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Configuration reference - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Configuration reference#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    openvidu.env:#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This file defines global configuration parameters used by other services. Such as the domain name, credentials, etc.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ParameterDescription
                                                                                                                                                                                                    DOMAIN_NAMEThe domain name for the deployment. Use this domain name to access. OpenVidu APIs and services.
                                                                                                                                                                                                    LIVEKIT_API_KEYGlobal LiveKit API Key and Secret used for apps to connect to OpenVidu.
                                                                                                                                                                                                    LIVEKIT_API_SECRETGlobal LiveKit API Key and Secret used for apps to connect to OpenVidu.
                                                                                                                                                                                                    MINIO_ACCESS_KEYAccess key for MinIO.
                                                                                                                                                                                                    MINIO_SECRET_KEYSecret key for MinIO.
                                                                                                                                                                                                    MONGO_ADMIN_USERNAMEMongoDB admin username.
                                                                                                                                                                                                    MONGO_ADMIN_PASSWORDMongoDB admin password.
                                                                                                                                                                                                    DASHBOARD_ADMIN_USERNAMEAdmin username for OpenVidu Dashboard
                                                                                                                                                                                                    DASHBOARD_ADMIN_PASSWORDAdmin password for OpenVidu Dashboard
                                                                                                                                                                                                    GRAFANA_ADMIN_USERNAMEAdmin username for Grafana
                                                                                                                                                                                                    GRAFANA_ADMIN_PASSWORDAdmin password for Grafana
                                                                                                                                                                                                    OPENVIDU_PRO_LICENSEPRO OpenVidu Pro license key. Get an OpenVidu Pro License here.
                                                                                                                                                                                                    OPENVIDU_RTC_ENGINEPRO The WebRTC engine to use. Can be pion or mediasoup.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    app.env:#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu Call application.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ParameterDescription
                                                                                                                                                                                                    SERVER_PORTPort where the OpenVidu Call application will be running.
                                                                                                                                                                                                    LIVEKIT_URLThe public URL of the LiveKit server which external clients will use to connect to the OpenVidu Call application.
                                                                                                                                                                                                    LIVEKIT_URL_PRIVATEThe private URL of the LiveKit server which OpenVidu Call backend will use to connect to the LiveKit Server internally.
                                                                                                                                                                                                    LIVEKIT_API_KEYLiveKit API Key for the OpenVidu Call application to connect to the LiveKit server.
                                                                                                                                                                                                    CALL_PRIVATE_ACCESSIf true, only authenticated users can access the OpenVidu Call application.
                                                                                                                                                                                                    CALL_USERUsername for the OpenVidu Call application.
                                                                                                                                                                                                    CALL_SECRETPassword for the OpenVidu Call application.
                                                                                                                                                                                                    CALL_ADMIN_USERAdmin username for the OpenVidu Call application.
                                                                                                                                                                                                    CALL_ADMIN_SECRETAdmin password for the OpenVidu Call application.
                                                                                                                                                                                                    CALL_S3_BUCKETS3 bucket name for OpenVidu Call application. It is used to store recordings.
                                                                                                                                                                                                    CALL_S3_SERVICE_ENDPOINTS3 service endpoint for OpenVidu Call application.
                                                                                                                                                                                                    CALL_S3_ACCESS_KEYS3 access key for OpenVidu Call application.
                                                                                                                                                                                                    CALL_S3_SECRET_KEYS3 secret key for OpenVidu Call application.
                                                                                                                                                                                                    CALL_AWS_REGIONAWS region of the S3 Bucket application.
                                                                                                                                                                                                    CALL_S3_WITH_PATH_STYLE_ACCESSIf true, use path-style access for S3.
                                                                                                                                                                                                    CALL_LOG_LEVELLog level for OpenVidu Call application. Valid values are: error, warn, info, verbose, debug, silly.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    PRO v2compatibility.env#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu V2 Compatibility is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu V2 Compatibility Server.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ParameterDescription
                                                                                                                                                                                                    OPENVIDU_PRO_LICENSEOpenVidu Pro license key. Get an OpenVidu Pro License here.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_SHIM_PORTPort where the OpenVidu V2 Compatibility will be running. By default is 4443
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_SHIM_URLPublic URL used for openvidu v2 applications used by external clients to connect to the OpenVidu V2 Compatibility Server.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_SECRETOpenVidu Secret used by openvidu v2 applications to connect to the OpenVidu deployment.
                                                                                                                                                                                                    V2COMPAT_LIVEKIT_URLLiveKit URL used by external clients to connect to the OpenVidu V2 Compatibility Server using the LiveKit protocol.
                                                                                                                                                                                                    V2COMPAT_LIVEKIT_URL_PRIVATELiveKit URL used by the OpenVidu V2 Compatibility Server to connect to the LiveKit Server internally.
                                                                                                                                                                                                    V2COMPAT_LIVEKIT_API_KEYLiveKit API Key used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server.
                                                                                                                                                                                                    V2COMPAT_LIVEKIT_API_SECRETLiveKit API Secret used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server.
                                                                                                                                                                                                    V2COMPAT_REDIS_HOSTRedis host used by the OpenVidu V2 Compatibility Server to store session data.
                                                                                                                                                                                                    V2COMPAT_REDIS_PORTRedis port used by the OpenVidu V2 Compatibility Server to connect to the Redis server.
                                                                                                                                                                                                    V2COMPAT_REDIS_PASSWORDRedis password used by the OpenVidu V2 Compatibility Server to connect to the Redis server.
                                                                                                                                                                                                    V2COMPAT_REDIS_SENTINEL_HOST_LISTRedis Sentinel host list used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers.
                                                                                                                                                                                                    V2COMPAT_REDIS_SENTINEL_PASSWORDRedis Sentinel password used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers.
                                                                                                                                                                                                    V2COMPAT_REDIS_MASTER_NAMERedis Sentinel master name used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers.
                                                                                                                                                                                                    V2COMPAT_REDIS_DBRedis database used by the OpenVidu V2 Compatibility Server. Default value is 0.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_RECORDING_PATHPath where the OpenVidu V2 Compatibility Server will store recordings locally. By default in the deployments is /opt/openvidu/recordings.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGEWhere to store the recordings. Valid values are:
                                                                                                                                                                                                    • local: Store the recordings in the local filesystem at the path V2COMPAT_OPENVIDU_RECORDING_PATH
                                                                                                                                                                                                    • s3: Store the recordings in the configured S3 bucket
                                                                                                                                                                                                    Default value is local
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_RECORDING_CUSTOM_LAYOUT_URLURL of the custom layout used by the OpenVidu V2 Compatibility Server to generate the recordings.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESSIf true, use path-style access for S3.
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_RECORDING_ZIP_FILESIf true, save individual recordings as zip files
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_RECORDING_RAW_FILESIf true, save individual recordings as files directly
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKETDefault bucket name for recordings
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINTS3 service endpoint for the recordings
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEYAccess key for the recordings S3 bucket
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEYSecret key for the recordings S3 bucket
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_PRO_AWS_REGIONAWS region of the recordings S3 bucket
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOKIf true, the OpenVidu V2 Compatibility Server will send webhooks to V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOK_HEADERSJSON Array list of headers to send in the OpenVidu V2 Webhook events. For example:
                                                                                                                                                                                                    ["Content-Type: application/json"]
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOK_EVENTSComma-separated list of OpenVidu V2 Webhook events to send. All available events are:
                                                                                                                                                                                                    • sessionCreated
                                                                                                                                                                                                    • sessionDestroyed
                                                                                                                                                                                                    • participantJoined
                                                                                                                                                                                                    • participantLeft
                                                                                                                                                                                                    • webrtcConnectionCreated
                                                                                                                                                                                                    • webrtcConnectionDestroyed
                                                                                                                                                                                                    • recordingStatusChanged
                                                                                                                                                                                                    • signalSent
                                                                                                                                                                                                    -

                                                                                                                                                                                                    livekit.yaml:#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    As OpenVidu Server is built on top of LiveKit, the configuration of OpenVidu Server is done in the livekit.yaml file in its own openvidu section in this file. The rest of the configuration is the same as the LiveKit server configuration.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    COMMUNITY OpenVidu Server Configuration:#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    openvidu:
                                                                                                                                                                                                    -    analytics: # (1)
                                                                                                                                                                                                    -        enabled: true # (2)
                                                                                                                                                                                                    -        mongo_url: mongodb://<MONGO_ADMIN_USERNAME>:<MONGO_ADMIN_PASSWORD>@localhost:20000/ # (3)
                                                                                                                                                                                                    -        interval: 10s # (4)
                                                                                                                                                                                                    -        expiration: 768h # (5)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. MongoDB connection string. In OpenVidu Single Node, the MongoDB service is running on the same machine, so you can use localhost as the hostname. The default port in OpenVidu for MongoDB is 20000. MONGO_ADMIN_USERNAME and MONGO_ADMIN_PASSWORD are the credentials to access the MongoDB database.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    PRO OpenVidu Server Configuration:#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before deploying OpenVidu PRO, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    openvidu:
                                                                                                                                                                                                    -    license: <YOUR_OPENVIDU_PRO_LICENSE> # (1)
                                                                                                                                                                                                    -    cluster_id: <YOUR_DOMAIN_NAME> # (2)
                                                                                                                                                                                                    -    analytics: # (3)
                                                                                                                                                                                                    -        enabled: true # (4)
                                                                                                                                                                                                    -        interval: 10s # (5)
                                                                                                                                                                                                    -        expiration: 768h # (6)
                                                                                                                                                                                                    -        mongo_url: <MONGO_URL> # (7)
                                                                                                                                                                                                    -    rtc:
                                                                                                                                                                                                    -        engine: pion # (8)
                                                                                                                                                                                                    -    mediasoup:
                                                                                                                                                                                                    -        debug: "" # (9)
                                                                                                                                                                                                    -        log_level: error # (10)
                                                                                                                                                                                                    -        log_tags: [info, ice, rtp, rtcp, message] # (11)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Specify your OpenVidu Pro license key. If you don't have one, you can request one here.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The cluster ID for the OpenVidu deployment. It is configured by default by OpenVidu Installer with the domain name of the deployment.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. MongoDB URL. This is the connection string to the MongoDB database where the analytics data will be stored.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. The rtc.engine parameter is set to pion by default. This is the WebRTC engine used by OpenVidu. Depending on your requirements, you can use:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • pion
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • mediasoup
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Global toggle to enable debugging logs from Mediasoup. In most debugging cases, using just an asterisk ("*") here is enough, but this can be fine-tuned for specific log levels. More info.
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Default is an empty string.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. Logging level for logs generated by Mediasoup. More info.
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Valid values are: debug, warn, error, none.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Default is error.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. Comma-separated list of log tag names, for debugging. More info.
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Valid values are: info, ice, dtls, rtp, srtp, rtcp, rtx, bwe, score, simulcast, svc, sctp, message.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Default is [info, ice, rtp, rtcp, message].
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Other Services Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu comes with other services configured to work in the deployment. These are the configuration files for each service:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ServiceDescriptionReference documentation
                                                                                                                                                                                                    OpenVidu ServerManage Rooms and Media Streams.
                                                                                                                                                                                                    Ingress ServiceImports video from other sources into OpenVidu rooms.LiveKit Ingress Config
                                                                                                                                                                                                    Egress ServiceExports video from OpenVidu rooms for recording or streaming.LiveKit Egress Config
                                                                                                                                                                                                    Caddy ServerServes OpenVidu services and handles HTTPS.Caddy JSON Structure
                                                                                                                                                                                                    Grafana ServiceUsed for visualizing monitoring data.Grafana Config
                                                                                                                                                                                                    Mimir ServiceService for long-term prometheus storageMimir Config
                                                                                                                                                                                                    Loki ServiceUsed for log aggregation.Loki Config
                                                                                                                                                                                                    Prometheus ServiceUsed for monitoring.Prometheus Config
                                                                                                                                                                                                    Promtail ServiceCollects logs and sends them to Loki.Promtail Config
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/deployment-types/index.html b/3.0.0-beta3/docs/self-hosting/deployment-types/index.html deleted file mode 100644 index bd92056d..00000000 --- a/3.0.0-beta3/docs/self-hosting/deployment-types/index.html +++ /dev/null @@ -1,4341 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Deployment types - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Deployment types#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu offers user-friendly installers that facilitate quick on-premises deployments, so you can self-host your real-time solution in your own infrastructure or any cloud provider.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    There are different deployment options available, depending on your needs:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Type of deploymentOpenVidu
                                                                                                                                                                                                    Local (development)
                                                                                                                                                                                                    OpenVidu
                                                                                                                                                                                                    Single Node
                                                                                                                                                                                                    OpenVidu
                                                                                                                                                                                                    Elastic
                                                                                                                                                                                                    OpenVidu
                                                                                                                                                                                                    High Availability
                                                                                                                                                                                                    OpenVidu EditionCOMMUNITY PROCOMMUNITYPROPRO
                                                                                                                                                                                                    SuitabilityFor local development in your laptopFor applications with medium user loadFor applications with dynamic user load that require scalabilityFor applications where both scalability and fault tolerance are critical
                                                                                                                                                                                                    FeaturesFriendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your networkCustom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observabilitySame benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observabilitySame benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance
                                                                                                                                                                                                    Number of serversYour laptop1 Node1 Master Node +
                                                                                                                                                                                                    N Media Nodes
                                                                                                                                                                                                    4 Master Nodes +
                                                                                                                                                                                                    N Media Nodes
                                                                                                                                                                                                    Installation instructionsInstallInstallInstallInstall
                                                                                                                                                                                                    -


                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Local (development)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run OpenVidu in your local machine, this is the quickest option. It is a Docker Compose setup that includes all the necessary services to run OpenVidu in your LAN, including automated SSL certificates that will be valid across all devices in your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Local (development)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is the simplest production-ready OpenVidu deployment available. It provides all the features you need, but lacks scalability and fault tolerance. But make no mistake about it: it is perfectly suitable for medium-scale production deployments. For most projects OpenVidu Single Node will be enough, at least until your user load gets serious. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community on a sufficiently powerful server!

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is composed of a single OpenVidu Node hosting all the necessary services in a monolithic setup.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Single Node
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is the intermediate OpenVidu deployment. It provides scalability for your video rooms. Suitable for applications with dynamic load in the media plane that require scalability.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is composed of two different types of nodes, one of them running on a cluster of multiple servers and the other running as a single monolithic server:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A single Master Node hosting all the support services in a monolithic setup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Elastic
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is the most complete OpenVidu deployment. It provides scalability for your video rooms and fault tolerance in all its services. Suitable for applications where both scalability and availability are critical.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is composed of two different types of nodes running on two separate clusters:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster. The minimum number of nodes in this cluster is 1, and it is designed to scale up and down dynamically according to workload.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A cluster of Master Nodes hosting all the support services in their high availability format. Your deployment is fault tolerant thanks to this cluster. The minimum number of nodes in this cluster is 4, and it is designed to have a fixed number of nodes at all times.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability cluster -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu High Availability cluster
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Node services#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu is composed of several services that work together to provide a complete videoconferencing solution. Every service runs as a Docker container, coordinated with Docker Compose.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Master Node services#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    SERVICEDESCRIPTION
                                                                                                                                                                                                    OpenVidu DashboardWeb application interface for managing your cluster and visualizing your Rooms.
                                                                                                                                                                                                    Default Application (OpenVidu Call)A fully fledged videoconference web application ready to be used out-of-the-box.
                                                                                                                                                                                                    OpenVidu OperatorModule that supervises the high availability services and updates the loadbalancing configuration dynamically.
                                                                                                                                                                                                    RedisDatabase used to share transient information between Media Nodes and coordinate them. In OpenVidu High Availability this is an instance of a Redis Cluster.
                                                                                                                                                                                                    MongoDBDatabase used to store analytics and monitoring persistent data. In OpenVidu High Availability this is an instance of a MongoDB Replica Set.
                                                                                                                                                                                                    MinioS3 bucket used to store recordings and common node configurations. In OpenVidu High Availability this is an instance of a Minio Multi-Node.
                                                                                                                                                                                                    CaddyReverse proxy used as a loadbalancer to distribute client connections across your nodes and automatically manage your TLS certificate.
                                                                                                                                                                                                    Mimir (observability)Module used to store metrics from Prometheus.
                                                                                                                                                                                                    Promtail (observability)Module used to collect logs from all services and send them to Loki.
                                                                                                                                                                                                    Loki (observability)Module used to store logs.
                                                                                                                                                                                                    Grafana (observability)Module used to visualize logs and metrics in dashboards.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Node services#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    SERVICEDESCRIPTION
                                                                                                                                                                                                    OpenVidu ServerMedia server used to stream real-time video, audio and data. Based on SFUs LiveKit and mediasoup.
                                                                                                                                                                                                    Egress ServerModule used to export media from a Room (for example, recordings or RTMP broadcasting). See Egress.
                                                                                                                                                                                                    Ingress ServerModule used to import media into a Room (for example, an MP4 video or an RTSP stream). See Ingress.
                                                                                                                                                                                                    CaddyReverse proxy used as a loadbalancer to distribute the load generated by the Media Nodes over the Minio, Mimir and Loki cluster.
                                                                                                                                                                                                    Prometheus (observability)Module used to collect metrics from OpenVidu Server and send them to Loki.
                                                                                                                                                                                                    Promtail (observability)Module used to collect logs from all services and send them to Loki.
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/index.html b/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/index.html deleted file mode 100644 index 0d49279a..00000000 --- a/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/index.html +++ /dev/null @@ -1,4361 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic administration on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Elastic Administration: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The deployment of OpenVidu Elastic on AWS is automated using AWS CloudFormation, with Media Nodes managed within an Auto Scaling Group. This group dynamically adjusts the number of instances based on a target average CPU utilization. Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises Elastic documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluster Shutdown and Startup#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Master Node is an EC2 instance, while the Media Nodes are part of an Auto Scaling Group. The process for starting and stopping these components differs. The following sections detail the procedures.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Node. This way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to 0, and click on "Update". -
                                                                                                                                                                                                      - Set Desired Capacity to 0 -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. -

                                                                                                                                                                                                      Wait until the "Instance Management" tab shows that there are no instances in the Auto Scaling Group. -

                                                                                                                                                                                                      - Instance Management -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      It may happen that some instances are still in the "Terminating:Wait" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. -

                                                                                                                                                                                                      After confirming that all Media Node instances are terminated, go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected. -

                                                                                                                                                                                                      - Delete CloudFormation Stack -

                                                                                                                                                                                                      -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Right-click on the instance and select "Stop instance". -
                                                                                                                                                                                                      - Stop instance -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected. -
                                                                                                                                                                                                      - Select CloudFormation Stack -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Right-click on the instance and select "Start instance". -
                                                                                                                                                                                                      - Start instance -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Wait until the instance is running.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to the desired number of Media Nodes, and click on "Update". In this example, we set the desired capacity to 2. -
                                                                                                                                                                                                      - Set Desired Capacity to 2 -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Wait until the "Instance Management" tab shows that there are the desired number of instances in the Auto Scaling Group. -
                                                                                                                                                                                                      - Instance Management -
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Change the instance type#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. However, since the Media Nodes are part of an Auto Scaling Group, the process differs. The following section details the procedures.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping the Master Node.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Shutdown the cluster.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can stop only the Master Node instance to change its instance type, but it is recommended to stop the whole cluster to avoid any issues.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected. -

                                                                                                                                                                                                      - Select CloudFormation Stack -

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Right-click on the instance and select "Instance Settings > Change Instance Type". -
                                                                                                                                                                                                      - Change instance type -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Select the new instance type and click on "Apply".
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Start the cluster.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Launch Template -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Modify template (Create new version)". -
                                                                                                                                                                                                      - Edit Launch Template -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. In the "Instance type" section, select the new instance type and click on "Create template version". -
                                                                                                                                                                                                      - Change instance type -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. -

                                                                                                                                                                                                      In the Launch Template section, select the new version of the launch template we just created at step 5, which is the highest version number.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Then, click on "Update".

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      By configuring "Latest" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Change launch template version

                                                                                                                                                                                                      -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. -

                                                                                                                                                                                                      Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. To configure scaling policies, navigate to the "Automatic scaling" tab within the Auto Scaling Group Dashboard, select the unique "Target tracking scaling" autoscaling policy, and click on "Actions > Edit". -
                                                                                                                                                                                                      - Scaling Policies -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. -

                                                                                                                                                                                                      It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on "Update". -

                                                                                                                                                                                                      - Edit Scaling Policies -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Elastic is by default configured with a "Target tracking scaling" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Fixed Number of Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to the fixed number of Media Nodes you require, and click on "Update". In this example, we set the desired capacity to 2. -
                                                                                                                                                                                                      - Set Fixed Desired Capacity -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Wait until the "Instance Management" tab shows that the Auto Scaling Group has the fixed number of instances running. -
                                                                                                                                                                                                      - Instance Management -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Administration and Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Elastic Administration section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Outputs" tab, click the Link at "ServicesAndCredentials". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Elastic Deployment. -
                                                                                                                                                                                                      - Select Secrets Manager -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on the "Retrieve secret value" button to get the JSON with all the information. -
                                                                                                                                                                                                      - Retrieve Secret Value -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Modify the parameter you want to change and click on "Save". The changes will be applied to the OpenVidu Elastic deployment.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go to the EC2 Console and click on "Reboot instance" in the Master Node instance to apply the changes. -
                                                                                                                                                                                                      - Reboot Instance -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu Elastic deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/elastic/aws/install/index.html b/3.0.0-beta3/docs/self-hosting/elastic/aws/install/index.html deleted file mode 100644 index ce83b6bd..00000000 --- a/3.0.0-beta3/docs/self-hosting/elastic/aws/install/index.html +++ /dev/null @@ -1,4442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic installation on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Elastic Installation: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment in AWS. Deployed services are the same as the On Premises Elastic Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/latest/aws/cf-openvidu-elastic.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/3.0.0/aws/cf-openvidu-elastic.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu Elastic AWS Architecture -
                                                                                                                                                                                                    OpenVidu Elastic AWS Architecture
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (for OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Parameters#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Depending on your needs, you need to fill in the following CloudFormation parameters:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Domain and SSL Certificate Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's Encrypt certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let’s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Self-signed certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You don’t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Custom certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu Elastic deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don’t need to modify this.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    VPC Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduMasterNodeSubnet and OpenViduMediaNodeSubnet parameters specify the subnets where the Master and Media Nodes will be deployed. All of them must be in the previously specified OpenViduVPC.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    (Optional) TURN server configuration with TLS#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Deploying the Stack#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on "Next", specify in "Stack failure options" the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of error, click on "Next" again, and finally "Submit".

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When everything is ready, you will see the following links in the "Outputs" section of CloudFormation:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Troubleshooting Initial CloudFormation Stack Creation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      While deploying the stack, make sure at "Stack failure options" you have selected the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -Disable Rollback on failure -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • /var/log/cloud-init.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      If everything seems fine, check the status and the logs of the installed OpenVidu services in the Master Node and Media Nodes.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Elastic deployment is ready to use. You can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/elastic/index.html b/3.0.0-beta3/docs/self-hosting/elastic/index.html deleted file mode 100644 index 59242df9..00000000 --- a/3.0.0-beta3/docs/self-hosting/elastic/index.html +++ /dev/null @@ -1,3984 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Elastic installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/index.html b/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/index.html deleted file mode 100644 index 9f4d61a3..00000000 --- a/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/index.html +++ /dev/null @@ -1,4278 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic administration on-premises - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Elastic Administration: On-premises#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Elastic on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Elastic deployments.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Starting, stopping, and restarting OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu Elastic deployment, you can use the following commands:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl restart openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking the status of services#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose ps
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS
                                                                                                                                                                                                    -app                        docker.io/openvidu/openvidu-call                   "docker-entrypoint.s…"   app                        12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -caddy                      docker.io/openvidu/openvidu-pro-caddy              "/bin/caddy run --co…"   caddy                      12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -dashboard                  docker.io/openvidu/openvidu-pro-dashboard          "./openvidu-dashboard"   dashboard                  12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -grafana                    docker.io/grafana/grafana                          "/run.sh"                grafana                    11 seconds ago   Up 8 seconds
                                                                                                                                                                                                    -loki                       docker.io/grafana/loki                             "/usr/bin/loki -conf…"   loki                       11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -mimir                      docker.io/grafana/mimir                            "/bin/mimir -config.…"   mimir                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -minio                      docker.io/bitnami/minio                            "/opt/bitnami/script…"   minio                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -mongo                      docker.io/mongo                                    "docker-entrypoint.s…"   mongo                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -openvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        "/bin/server"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -operator                   docker.io/openvidu/openvidu-operator               "/bin/operator"          operator                   12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -promtail                   docker.io/grafana/promtail                         "/usr/bin/promtail -…"   promtail                   11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -redis                      docker.io/redis                                    "docker-entrypoint.s…"   redis                      12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS
                                                                                                                                                                                                    -egress       docker.io/livekit/egress                       "/entrypoint.sh"         egress       53 seconds ago   Up 51 seconds
                                                                                                                                                                                                    -ingress      docker.io/livekit/ingress                      "ingress"                ingress      53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -openvidu     docker.io/openvidu/openvidu-server-pro         "/livekit-server --c…"   openvidu     53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -prometheus   docker.io/prom/prometheus                      "/bin/prometheus --c…"   prometheus   53 seconds ago   Up 51 seconds
                                                                                                                                                                                                    -promtail     docker.io/grafana/promtail                     "/usr/bin/promtail -…"   promtail     53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking logs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs <service-name>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the "Home" section, select "Dashboard", and then click on:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • "OpenVidu > OpenVidu Cluster Nodes Logs": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • "OpenVidu > OpenVidu Cluster Services Logs": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Removing Media Nodes Gracefully#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    #!/bin/bash
                                                                                                                                                                                                    -# Stop OpenVidu, Ingress, and Egress containers gracefully (1)
                                                                                                                                                                                                    -docker container kill --signal=SIGINT openvidu || true
                                                                                                                                                                                                    -docker container kill --signal=SIGINT ingress || true
                                                                                                                                                                                                    -docker container kill --signal=SIGINT egress || true
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -# Wait for the containers to stop (2)
                                                                                                                                                                                                    -while [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == "true" ] || \
                                                                                                                                                                                                    -    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == "true" ] || \
                                                                                                                                                                                                    -    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == "true" ]; do
                                                                                                                                                                                                    -    echo "Waiting for containers to stop..."
                                                                                                                                                                                                    -    sleep 5
                                                                                                                                                                                                    -done
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. This script waits for the containers to stop before exiting.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Removing Media Nodes Forcefully#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Changing the configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Uninstalling OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo su
                                                                                                                                                                                                    -systemctl stop openvidu
                                                                                                                                                                                                    -rm -rf /opt/openvidu/
                                                                                                                                                                                                    -rm /etc/systemd/system/openvidu.service
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/index.html b/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/index.html deleted file mode 100644 index da999ff1..00000000 --- a/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/index.html +++ /dev/null @@ -1,4646 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic installation on-premises - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Elastic Installation: On-premises#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment on-premises. The deployment requires one Master Node and any number of Media Nodes. Media Nodes are elastic and can be scaled up and down according to the workload.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu Elastic On Premises -
                                                                                                                                                                                                    OpenVidu Elastic On Premises
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (For TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates. Provides optional TLS for the TURN server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Prometheus and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prerequisites#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • At least 2 machines, each with a minimum of 4GB RAM, 4 CPU cores, and Linux installed (Ubuntu is recommended). One machine will serve as the Master Node, while the others will function as Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Significant disk space on the Master Node, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Each machine must be assigned a Public IP. Additionally, the machine designated as the Master Node must have a Fully Qualified Domain Name (FQDN) that resolves to its Public IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Master Node)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Node.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ProtocolPorts
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    TCP800.0.0.0/0, ::/0Redirect HTTP traffic to HTTPS and Let's Encrypt validation.
                                                                                                                                                                                                    TCP4430.0.0.0/0, ::/0Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP19350.0.0.0/0, ::/0(Optional), only needed if you want to ingest RTMP streams using Ingress service.
                                                                                                                                                                                                    TCP90000.0.0.0/0, ::/0(Optional), only needed if you want to expose MinIO publicly.
                                                                                                                                                                                                    TCP4443Media Nodes(Optional. Only needed when 'OpenVidu v2 Compatibility' module is used) Media Nodes need access to this port to reach OpenVidu V2 compatibility service
                                                                                                                                                                                                    TCP6080Media Nodes(Optional. Only needed when 'Default App' module is used) Media Nodes need access to this port to reach OpenVidu Call (Default Application).
                                                                                                                                                                                                    TCP3100Media Nodes(Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Loki.
                                                                                                                                                                                                    TCP9009Media Nodes(Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Mimir.
                                                                                                                                                                                                    TCP7000Media NodesMedia Nodes need access to this port to reach Redis Service.
                                                                                                                                                                                                    TCP9100Media NodesMedia Nodes need access to this port to reach MinIO.
                                                                                                                                                                                                    TCP20000Media NodesMedia Nodes need access to this port to reach MongoDB.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Media Nodes)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Protocol
                                                                                                                                                                                                    Ports
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    UDP4430.0.0.0/0, ::/0STUN/TURN over UDP.
                                                                                                                                                                                                    TCP78810.0.0.0/0, ::/0(Optional). Only needed if you want to allow WebRTC over TCP.
                                                                                                                                                                                                    UDP78850.0.0.0/0, ::/0(Optional). Only needed if you want to ingest WebRTC using WHIP.
                                                                                                                                                                                                    UDP50000-600000.0.0.0/0, ::/0WebRTC Media traffic.
                                                                                                                                                                                                    TCP1935Master Node(Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Node needs access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS).
                                                                                                                                                                                                    TCP5349Master Node(Optional). Only needed if you want to expose TURN service with TLS. Master Node needs access to this port to reach TURN service and expose it using TLS (TURNS).
                                                                                                                                                                                                    TCP7880Master NodeLiveKit API. Master Node needs access to load balance LiveKit API and expose it through HTTPS.
                                                                                                                                                                                                    TCP8080Master Node(Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Node needs access to this port to reach WHIP HTTP service.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Guided Installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Node and Media Nodes are correctly configured.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install OpenVidu Elastic, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    docker run --pull always --rm -it \
                                                                                                                                                                                                    -    openvidu/openvidu-installer:latest \
                                                                                                                                                                                                    -    --deployment-type=elastic
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Write the 'Master Node' Private IP: Write the private IP of the machine where you are going to install the Master Node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup(Experimental).

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Firewall Configuration for 'Master Node': These rules are the same as those specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Node) may not appear (Optional ports). Double-check and modify it if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Installation Commands for 'Master Node': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='elastic' \
                                                                                                                                                                                                      -    --node-role='master-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command in your Master Node to install it. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉 OpenVidu Elastic 'Master Node' Installation Finished Successfully! 🎉   <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Master Node will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Firewall Configuration for 'Media Nodes': These rules are the same as those defined previously as with the Master Node. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='elastic' \
                                                                                                                                                                                                      -    --node-role='media-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉 OpenVidu Elastic 'Media Node' Installation Finished Successfully! 🎉    <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials for all services are defined in this file.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Non-interactive installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --private-ip='1.2.3.4' \
                                                                                                                                                                                                    -    --certificate-type='letsencrypt' \
                                                                                                                                                                                                    -    --letsencrypt-email='example@example.io'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --private-ip='1.2.3.4' \
                                                                                                                                                                                                    -    --certificate-type='selfsigned'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -# Optional, only if you want to enable TURN with TLS
                                                                                                                                                                                                    -CERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --private-ip='1.2.3.4' \
                                                                                                                                                                                                    -    --certificate-type='owncert' \
                                                                                                                                                                                                    -    --owncert-private-key="$CERT_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --owncert-public-key="$CERT_PUBLIC_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-private-key="$CERT_TURN_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-public-key="$CERT_TURN_PUBLIC_KEY"
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='media-node' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --master-node-private-ip='1.2.3.4' \
                                                                                                                                                                                                    -    --redis-password='xxxxx'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The --master-node-private-ip is the private IP of the Master Node. Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Some notes about all commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • At the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/faq/index.html b/3.0.0-beta3/docs/self-hosting/faq/index.html deleted file mode 100644 index d3346a72..00000000 --- a/3.0.0-beta3/docs/self-hosting/faq/index.html +++ /dev/null @@ -1,4119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Installation FAQs - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Installation FAQs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Common issues#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Everything looks alright, but I cannot see any remote video.#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    My local video is not showing up on the browser#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Any tips to make easier the development of my WebRTC application?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Test applications in my network with multiple devices.#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Does my app need a server-side?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Caddy certificates are not working. What can I do?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    My commercial certificate is not working. What can I do?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    How can I customize the Caddy configuration?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu does not work for clients behind restrictive firewalls.#

                                                                                                                                                                                                    - - -

                                                                                                                                                                                                    Fundamentals Knowledge#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is a domain name and how can I get one?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is an AWS Elastic IP and how can I create one?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is a VPC and a subnet in AWS?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is a DNS record and how can I create one?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What means each type of certificate in OpenVidu?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is STUN and TURN and why do I need them?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is a Caddy server and why is it used in OpenVidu?#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    What is the "operator" service in OpenVidu?#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/aws/admin/index.html b/3.0.0-beta3/docs/self-hosting/ha/aws/admin/index.html deleted file mode 100644 index 77572d40..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/aws/admin/index.html +++ /dev/null @@ -1,4366 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu High Availability administration on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability Administration: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The deployment of OpenVidu High Availability on AWS is automated using AWS CloudFormation, with 4 EC2 Instances as Master Nodes and any number of Media Nodes managed within an Auto Scaling Group. The Auto Scaling Group of Media Nodes is configured to scale based on the target average CPU utilization.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises High Availability documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluster Shutdown and Startup#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can start and stop the OpenVidu High Availability cluster at any time. The following sections detail the procedures.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Nodes; this way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to 0, and click on "Update". -
                                                                                                                                                                                                      - Set Desired Capacity to 0 -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. -

                                                                                                                                                                                                      Wait until the "Instance Management" tab shows that there are no instances in the Auto Scaling Group. -

                                                                                                                                                                                                      - Instance Management -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      It may happen that some instances are still in the "Terminating:Wait" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. -

                                                                                                                                                                                                      Navigate to the EC2 Dashboard on AWS.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Stop all the Master Nodes instances by selecting them and clicking on "Stop instance". -
                                                                                                                                                                                                      - Stop Master Nodes -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Wait until the instances are stopped.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Start all the Master Nodes instances by selecting them and clicking on "Start instance". -
                                                                                                                                                                                                      - Start Master Nodes -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Wait until the instances are running.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Locate the resource with the logical ID: OpenViduMasterNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Master Nodes selected. -
                                                                                                                                                                                                      - Select CloudFormation Stack -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to the desired number of Media Nodes, and click on "Update". For the Master Nodes auto scaling group, the number of instances must be 4. -
                                                                                                                                                                                                      - Set Desired Capacity to 2 -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Wait until the "Instance Management" tab shows that there are the desired number of instances in the Auto Scaling Group. -
                                                                                                                                                                                                      - Instance Management -
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    23. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to the desired number of Media Nodes, and click on "Update". In this example, we set the desired capacity to 2. -
                                                                                                                                                                                                      - Set Desired Capacity to 2 -
                                                                                                                                                                                                    24. -
                                                                                                                                                                                                    25. Wait until the "Instance Management" tab shows that there are the desired number of instances in the Auto Scaling Group. -
                                                                                                                                                                                                      - Instance Management -
                                                                                                                                                                                                    26. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Change the instance type#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. The following section details the procedures.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping all the Master Nodes and starting them again with the new instance type.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Stop all the Master Nodes instances by selecting them and clicking on "Stop instance". -
                                                                                                                                                                                                      - Stop Master Nodes -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Wait until the instances are stopped.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. For each node you want to change the instance type, select it, and click on "Instance settings > Change instance type". -
                                                                                                                                                                                                      - Change instance type -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Select the new instance type and click on "Change".
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Repeat the process for all the Master Nodes.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Launch Template -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Modify template (Create new version)". -
                                                                                                                                                                                                      - Edit Launch Template -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. In the "Instance type" section, select the new instance type and click on "Create template version". -
                                                                                                                                                                                                      - Change instance type -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. -

                                                                                                                                                                                                      In the Launch Template section, select the new version of the launch template we just created at step 5 which is the highest version number.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Then, click on "Update".

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      By configuring "Latest" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Change launch template version

                                                                                                                                                                                                      -
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. -

                                                                                                                                                                                                      Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. To configure scaling policies, navigate to the "Automatic scaling" tab within the Auto Scaling Group Dashboard, select the unique "Target tracking scaling" autoscaling policy, and click on "Actions > Edit". -
                                                                                                                                                                                                      - Scaling Policies -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. -

                                                                                                                                                                                                      It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on "Update". -

                                                                                                                                                                                                      - Edit Scaling Policies -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu High Availability is by default configured with a "Target tracking scaling" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Fixed Number of Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Resources" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard. -
                                                                                                                                                                                                      - Select Auto Scaling Group -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on "Actions > Edit". -
                                                                                                                                                                                                      - Edit Auto Scaling Group -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Set the "Desired capacity", "Min desired capacity", and "Max desired capacity" to the fixed number of Media Nodes you require, and click on "Update". In this example, we set the desired capacity to 2. -
                                                                                                                                                                                                      - Set Fixed Desired Capacity -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Wait until the "Instance Management" tab shows that the Auto Scaling Group has the fixed number of instances running. -
                                                                                                                                                                                                      - Instance Management -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Administration and Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises High Availability Administration section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Outputs" tab, click the Link at "ServicesAndCredentials". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu High Availability Deployment. -
                                                                                                                                                                                                      - Select Secrets Manager -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on the "Retrieve secret value" button to get the JSON with all the information. -
                                                                                                                                                                                                      - Retrieve Secret Value -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Modify the parameter you want to change and click on "Save". The changes will be applied to the OpenVidu High Availability deployment.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go to the EC2 Console and click on "Reboot instance" in the Master Node instance to apply the changes. -
                                                                                                                                                                                                      - Reboot Instance -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu High Availability deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/aws/install/index.html b/3.0.0-beta3/docs/self-hosting/ha/aws/install/index.html deleted file mode 100644 index 39a9865e..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/aws/install/index.html +++ /dev/null @@ -1,4474 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu High Availability installation on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability Installation: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu High Availability deployment in AWS. Deployed services are the same as the On Premises High Availability Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/latest/aws/cf-openvidu-ha.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/3.0.0/aws/cf-openvidu-ha.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks like.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu High Availability AWS Architecture -
                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu High Availability AWS Architecture with TURN over TLS -
                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture with TURN over TLS
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • An additional Load Balancer is created to route TURN over TLS traffic to the TURN server running on the Media Nodes. It is used to allow users behind restrictive firewalls to connect to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Parameters#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Domain and Load Balancer configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify the domain name and the SSL certificate to use from AWS Certificate Manager.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section might look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Domain and Load Balancer configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Set the DomainName parameter to the domain name you intend to use for your OpenVidu deployment. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the OpenViduCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in DomainName.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu HA Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu HA deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu HA Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest Amazon Linux AMI, so ideally you don’t need to modify this.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    VPC Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduMasterNodeSubnets specifies the subnets where the Master Nodes will be deployed. You can specify a maximum of 4 subnets.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduMediaNodeSubnets specifies the subnets where the Media Nodes will be deployed. There is no limit on the number of subnets you can specify.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It is recommended to deploy in a region with at least 4 availability zones and deploy the Master Nodes in 4 subnets, one in each availability zone. This is to ensure high availability.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    (Optional) TURN server configuration with TLS#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the TurnCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in TurnDomainName.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Volumes Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this section, you need to specify the configuration for the EBS volumes that will be created for the Master Nodes. Master Nodes will host all the recordings and metrics data replicated across all of them. The disk size of the EBS volumes is the same for all Master Nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Volumes Configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The RetainVolumes parameter specifies whether the EBS volumes should be retained when the stack is deleted. If you set this parameter to true, the EBS volumes will not be deleted when the stack is deleted. This is useful if you want to keep the recordings and metrics data after deleting the stack. If you set this parameter to false, the EBS volumes will be deleted when the stack is deleted. In any case, it is recommended to create a snapshot backup policy.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The DiskSize parameter specifies the size of the EBS volumes in GB.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Deploying the Stack#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on "Next", specify in "Stack failure options" the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of error, click on "Next" again, and finally "Submit".

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When everything is ready, you will see the following links in the "Outputs" section of CloudFormation:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Troubleshooting Initial CloudFormation Stack Creation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      While deploying the stack, make sure at "Stack failure options" you have selected the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -Disable Rollback on failure -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • /var/log/cloud-init.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      If everything seems fine, check the status and the logs of the installed OpenVidu services in all the Master Nodes and Media Nodes.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu High Availability deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/index.html b/3.0.0-beta3/docs/self-hosting/ha/index.html deleted file mode 100644 index 339f0fc6..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/index.html +++ /dev/null @@ -1,3985 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu High Availability - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/index.html b/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/index.html deleted file mode 100644 index 817a12f6..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/index.html +++ /dev/null @@ -1,4280 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu High Availability administration on-premises - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability Administration: On-premises#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu High Availability on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu High Availability deployments.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Starting, stopping, and restarting OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu High Availability deployment, you can use the following commands:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl restart openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking the status of services#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose ps
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS
                                                                                                                                                                                                    -app                        docker.io/openvidu/openvidu-call                   "docker-entrypoint.s…"   app                        12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -caddy                      docker.io/openvidu/openvidu-pro-caddy              "/bin/caddy run --co…"   caddy                      12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -dashboard                  docker.io/openvidu/openvidu-pro-dashboard          "./openvidu-dashboard"   dashboard                  12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -grafana                    docker.io/grafana/grafana                          "/run.sh"                grafana                    11 seconds ago   Up 8 seconds
                                                                                                                                                                                                    -loki                       docker.io/grafana/loki                             "/usr/bin/loki -conf…"   loki                       11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -mimir                      docker.io/grafana/mimir                            "/bin/mimir -config.…"   mimir                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -minio                      docker.io/bitnami/minio                            "/opt/bitnami/script…"   minio                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -mongo                      docker.io/mongo                                    "docker-entrypoint.s…"   mongo                      11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -openvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        "/bin/server"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -operator                   docker.io/openvidu/openvidu-operator               "/bin/operator"          operator                   12 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -promtail                   docker.io/grafana/promtail                         "/usr/bin/promtail -…"   promtail                   11 seconds ago   Up 9 seconds
                                                                                                                                                                                                    -redis-sentinel             docker.io/redis                                    "docker-entrypoint.s…"   redis-sentinel             10 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -redis-server               docker.io/redis                                    "docker-entrypoint.s…"   redis-server               10 seconds ago   Up 10 seconds
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS
                                                                                                                                                                                                    -caddy        docker.io/openvidu/openvidu-caddy:main         "/bin/caddy run --co…"   caddy        53 seconds ago   Up 53 seconds
                                                                                                                                                                                                    -egress       docker.io/livekit/egress                       "/entrypoint.sh"         egress       53 seconds ago   Up 51 seconds
                                                                                                                                                                                                    -ingress      docker.io/livekit/ingress                      "ingress"                ingress      53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -openvidu     docker.io/openvidu/openvidu-server-pro         "/livekit-server --c…"   openvidu     53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -prometheus   docker.io/prom/prometheus                      "/bin/prometheus --c…"   prometheus   53 seconds ago   Up 51 seconds
                                                                                                                                                                                                    -promtail     docker.io/grafana/promtail                     "/usr/bin/promtail -…"   promtail     53 seconds ago   Up 52 seconds
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking logs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs <service-name>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the "Home" section, select "Dashboard", and then click on:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • "OpenVidu > OpenVidu Cluster Nodes Logs": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • "OpenVidu > OpenVidu Cluster Services Logs": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Removing Media Nodes Gracefully#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    #!/bin/bash
                                                                                                                                                                                                    -# Stop OpenVidu, Ingress, and Egress containers gracefully (1)
                                                                                                                                                                                                    -docker container kill --signal=SIGINT openvidu || true
                                                                                                                                                                                                    -docker container kill --signal=SIGINT ingress || true
                                                                                                                                                                                                    -docker container kill --signal=SIGINT egress || true
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -# Wait for the containers to stop (2)
                                                                                                                                                                                                    -while [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == "true" ] || \
                                                                                                                                                                                                    -    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == "true" ] || \
                                                                                                                                                                                                    -    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == "true" ]; do
                                                                                                                                                                                                    -    echo "Waiting for containers to stop..."
                                                                                                                                                                                                    -    sleep 5
                                                                                                                                                                                                    -done
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. This script waits for the containers to stop before exiting.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Removing Media Nodes Forcefully#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Changing the configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Uninstalling OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo su
                                                                                                                                                                                                    -systemctl stop openvidu
                                                                                                                                                                                                    -rm -rf /opt/openvidu/
                                                                                                                                                                                                    -rm /etc/systemd/system/openvidu.service
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/index.html b/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/index.html deleted file mode 100644 index 54b4379e..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/index.html +++ /dev/null @@ -1,4702 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic installation on-premises with DNS Load Balancing - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability Installation: On-premises with DNS Load Balancing#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing DNS for load balancing traffic. DNS allows multiple records, even of the same kind, to be registered, enabling the listing of multiple hosts under the same domain name. Such a mechanism allows for the distribution of traffic among the Master Nodes, offering an alternative to Network Load Balancers.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Advantages of DNS Load Balancing:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Simplicity: Easier to configure compared to Network Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Cost: More cost-effective than Network Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Disadvantages of DNS Load Balancing:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Health Checks: Less reliable for health checks compared to Network Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Caching Issues: IP addresses of the Master Nodes can be cached, causing issues if the server's IP changes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • DNS Round Robin: Some clients may not adhere to DNS Round Robin, potentially leading to uneven traffic distribution.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu High Availability Architecture with DNS Load Balancing -
                                                                                                                                                                                                    OpenVidu High Availability Architecture with DNS Load Balancing
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Master Nodes act as Load Balancers, managing the traffic and distributing it among the other Master Nodes and Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Each Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prerequisites#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • All machines must have their own public IP.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to all the public IPs of the Master Nodes. Simply create 4 A records in your DNS provider pointing to the public IPs of the Master Nodes using the same domain name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Master Nodes)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Protocol
                                                                                                                                                                                                    Ports
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    TCP800.0.0.0/0, ::/0Redirect HTTP to HTTPS and Let's Encrypt validation.
                                                                                                                                                                                                    TCP4430.0.0.0/0, ::/0Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP19350.0.0.0/0, ::/0(Optional) For ingesting RTMP streams using Ingress service.
                                                                                                                                                                                                    TCP90000.0.0.0/0, ::/0(Optional) To expose MinIO publicly.
                                                                                                                                                                                                    TCP3000Master Nodes(Optional) For load balancing requests to Grafana (Observability module).
                                                                                                                                                                                                    TCP5000Master NodesFor load balancing requests to OpenVidu Dashboard.
                                                                                                                                                                                                    TCP9101Master NodesFor load balancing requests to MinIO Console.
                                                                                                                                                                                                    TCP7946-7947Master Nodes(Optional) For Mimir and Loki cluster communication (Observability module).
                                                                                                                                                                                                    TCP9095-9096Master Nodes(Optional) For Mimir and Loki cluster communication (Observability module).
                                                                                                                                                                                                    TCP3100Media Nodes(Optional) For Loki (Observability module).
                                                                                                                                                                                                    TCP9009Media Nodes(Optional) For Mimir (Observability module).
                                                                                                                                                                                                    TCP4443Master Nodes, Media Nodes(Optional) For OpenVidu V2 compatibility service.
                                                                                                                                                                                                    TCP6080Master Nodes, Media Nodes(Optional) For OpenVidu Call (Default Application).
                                                                                                                                                                                                    TCP7000-7001Master Nodes, Media NodesFor internal Redis communication
                                                                                                                                                                                                    TCP9100Master Nodes, Media NodesFor internal MinIO communication
                                                                                                                                                                                                    TCP20000Master Nodes, Media NodesFor internal Mongo communication
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Media Nodes)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Protocol
                                                                                                                                                                                                    Ports
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    UDP4430.0.0.0/0, ::/0STUN/TURN over UDP.
                                                                                                                                                                                                    TCP78810.0.0.0/0, ::/0(Optional), only needed if you want to allow WebRTC over TCP.
                                                                                                                                                                                                    UDP78850.0.0.0/0, ::/0(Optional). Only needed if you want to ingest WebRTC using WHIP.
                                                                                                                                                                                                    UDP50000-600000.0.0.0/0, ::/0WebRTC Media traffic.
                                                                                                                                                                                                    TCP1935Master Nodes(Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS).
                                                                                                                                                                                                    TCP5349Master Nodes(Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS).
                                                                                                                                                                                                    TCP7880Master NodesLiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS.
                                                                                                                                                                                                    TCP8080Master Nodes(Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Guided Installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    docker run --pull always --rm -it \
                                                                                                                                                                                                    -    openvidu/openvidu-installer:latest \
                                                                                                                                                                                                    -    --deployment-type=ha
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select No. It means that you are going to use DNS Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check them and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='ha' \
                                                                                                                                                                                                      -    --node-role='master-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉🎉 OpenVidu HA 'Master Node' Installation Finished Successfully! 🎉🎉    <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='ha' \
                                                                                                                                                                                                      -    --node-role='media-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉 OpenVidu HA 'Media Node' Installation Finished Successfully! 🎉         <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Media Node on each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Non-interactive installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --mongo-replica-set-key='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='letsencrypt' \
                                                                                                                                                                                                    -    --letsencrypt-email='example@example.io'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --mongo-replica-set-key='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='selfsigned'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -# Optional, only if you want to enable TURN with TLS
                                                                                                                                                                                                    -CERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --mongo-replica-set-key='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='owncert' \
                                                                                                                                                                                                    -    --owncert-private-key="$CERT_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --owncert-public-key="$CERT_PUBLIC_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-private-key="$CERT_TURN_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-public-key="$CERT_TURN_PUBLIC_KEY"
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='media-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --redis-password='xxxxx'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The argument --turn-domain-name is optional. Define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/index.html b/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/index.html deleted file mode 100644 index 34cec744..00000000 --- a/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/index.html +++ /dev/null @@ -1,4718 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Elastic installation on-premises with Network Load Balancer - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu High Availability Installation: On-premises with Network Load Balancer#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. -There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing a Network Load Balancer in front of the cluster. Network Load Balancing is a method of distributing incoming network traffic across multiple servers. It is a highly available, scalable, and fault-tolerant solution that ensures your OpenVidu deployment is always up and running. Compared to DNS Load Balancing, Network Load Balancing is more reliable for health checks and ensures that traffic is evenly distributed across all nodes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Advantages of Network Load Balancing:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • More control over the load balancing process.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Possibility to use custom health checks to determine the status of the nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Disadvantages of Network Load Balancing:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • More complex to set up than DNS Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Requires a Load Balancer to be deployed in front of the cluster.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • More expensive than DNS Load Balancing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu High Availability Architecture with Network Load Balancer -
                                                                                                                                                                                                    OpenVidu High Availability Architecture with Network Load Balancer
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The Load Balancer must be a Network Load Balancer that supports TCP and UDP traffic.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • The Load Balancer distributes traffic across all Master Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If RTMP or TURN with TLS is enabled, the Load Balancer must also distribute traffic across all Media Nodes. (You can use a different Load Balancer for this purpose)
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prerequisites#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Media Nodes must have a public IP. This is required because Media traffic is sent directly to these nodes. Master Nodes can have private IPs and will be accessed through the Load Balancer.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A Load Balancer that supports TCP and UDP traffic. You can use a hardware load balancer or a software load balancer like HAProxy, Nginx, or AWS Network Load Balancer.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to the Load Balancer. This domain name will be used to access the OpenVidu services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Master Nodes)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Protocol
                                                                                                                                                                                                    Ports
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    TCP7880Load BalancerAllows access to the following to the Load Balancer:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP7946-7947Master Nodes(Optional) For Mimir and Loki cluster communication (Observability module).
                                                                                                                                                                                                    TCP9095-9096Master Nodes(Optional) For Mimir and Loki cluster communication (Observability module).
                                                                                                                                                                                                    TCP3100Media Nodes(Optional) For Loki (Observability module).
                                                                                                                                                                                                    TCP9009Media Nodes(Optional) For Mimir (Observability module).
                                                                                                                                                                                                    TCP4443Media Nodes(Optional) For OpenVidu V2 compatibility service.
                                                                                                                                                                                                    TCP6080Media Nodes(Optional) For OpenVidu Call (Default Application).
                                                                                                                                                                                                    TCP7000-7001Master Nodes, Media NodesFor internal Redis communication
                                                                                                                                                                                                    TCP9100Master Nodes, Media NodesFor internal Minio communication
                                                                                                                                                                                                    TCP20000Master Nodes, Media NodesFor internal Mongo communication
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules (Media Nodes)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Protocol
                                                                                                                                                                                                    Ports
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    UDP4430.0.0.0/0, ::/0STUN/TURN over UDP.
                                                                                                                                                                                                    TCP78810.0.0.0/0, ::/0(Optional), only needed if you want to allow WebRTC over TCP.
                                                                                                                                                                                                    UDP78850.0.0.0/0, ::/0(Optional). Only needed if you want to ingest WebRTC using WHIP.
                                                                                                                                                                                                    UDP50000-600000.0.0.0/0, ::/0WebRTC Media traffic.
                                                                                                                                                                                                    TCP1935Load Balancer(Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS).
                                                                                                                                                                                                    TCP5349Load Balancer(Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS).
                                                                                                                                                                                                    TCP7880Master NodesLiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS.
                                                                                                                                                                                                    TCP8080Master Nodes(Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Guided Installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    docker run --pull always --rm -it \
                                                                                                                                                                                                    -    openvidu/openvidu-installer:latest \
                                                                                                                                                                                                    -    --deployment-type=ha
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select Yes. We will use a Network Load Balancer in front of the cluster.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • (Optional) TURN domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the Load Balancer you will use and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='ha' \
                                                                                                                                                                                                      -    --node-role='master-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉🎉 OpenVidu HA 'Master Node' Installation Finished Successfully! 🎉🎉    <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                      -    --no-tty --install \
                                                                                                                                                                                                      -    --deployment-type='ha' \
                                                                                                                                                                                                      -    --node-role='media-node' \
                                                                                                                                                                                                      -...
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      ->  🎉 OpenVidu HA 'Media Node' Installation Finished Successfully! 🎉         <
                                                                                                                                                                                                      ->                                                                             <
                                                                                                                                                                                                      -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl start openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Load Balancer Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To configure the Load Balancer, you must create a new TCP listener for each port that the Master Nodes use. The Load Balancer should be set up to distribute traffic evenly across all Master Nodes, targeting their private IP addresses. Additionally, optional features like RTMP and TURN with TLS should be directed to use the private IP addresses of the Media Nodes. This ensures that traffic for these services is properly routed to the Media Nodes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Below is an example using NGINX as a Load Balancer:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    events {
                                                                                                                                                                                                    -    worker_connections 10240;
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -stream {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    upstream openvidu_master_nodes {
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_1>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_2>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_3>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_4>:7880;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    # Optional: Only if you want to ingest RTMP
                                                                                                                                                                                                    -    upstream openvidu_media_nodes_rtmp {
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_1>:1935;
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_2>:1935;
                                                                                                                                                                                                    -        # Add more media nodes if needed
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    server {
                                                                                                                                                                                                    -        listen 443 ssl;
                                                                                                                                                                                                    -        server_name openvidu.example.com;
                                                                                                                                                                                                    -        ssl_protocols       TLSv1.2 TLSv1.3;
                                                                                                                                                                                                    -        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;
                                                                                                                                                                                                    -        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_connect_timeout 10s;
                                                                                                                                                                                                    -        proxy_timeout 30s;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_pass openvidu_master_nodes;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    # Optional: Only if you want to ingest RTMP
                                                                                                                                                                                                    -    server {
                                                                                                                                                                                                    -        listen 1935 ssl;
                                                                                                                                                                                                    -        server_name openvidu.example.com;
                                                                                                                                                                                                    -        ssl_protocols       TLSv1.2 TLSv1.3;
                                                                                                                                                                                                    -        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;
                                                                                                                                                                                                    -        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_connect_timeout 10s;
                                                                                                                                                                                                    -        proxy_timeout 30s;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_pass openvidu_media_nodes_rtmp;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and you should configure it in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem and openvidu-key.pem must be valid SSL certificates for your domain.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    events {
                                                                                                                                                                                                    -    worker_connections 10240;
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -stream {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    upstream openvidu_master_nodes {
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_1>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_2>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_3>:7880;
                                                                                                                                                                                                    -        server <MASTER_NODE_IP_4>:7880;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    # Optional: Only if you want to ingest RTMP
                                                                                                                                                                                                    -    upstream openvidu_media_nodes_rtmp {
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_1>:1935;
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_2>:1935;
                                                                                                                                                                                                    -        # Add more media nodes if needed
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    upstream turn_tls {
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_1>:5349;
                                                                                                                                                                                                    -        server <MEDIA_NODE_IP_2>:5349;
                                                                                                                                                                                                    -        # Add more media nodes if needed
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    map $ssl_server_name $targetBackend {
                                                                                                                                                                                                    -        openvidu.example.com openvidu_master_nodes;
                                                                                                                                                                                                    -        turn.example.com turn_tls;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    map $ssl_server_name $targetCert {
                                                                                                                                                                                                    -        openvidu.example.com /etc/nginx/ssl/openvidu-cert.pem;
                                                                                                                                                                                                    -        turn.example.com /etc/nginx/ssl/turn-cert.pem;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    map $ssl_server_name $targetCertKey {
                                                                                                                                                                                                    -        openvidu.example.com /etc/nginx/ssl/openvidu-key.pem;
                                                                                                                                                                                                    -        turn.example.com /etc/nginx/ssl/turn-key.pem;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    server {
                                                                                                                                                                                                    -        listen 443 ssl;
                                                                                                                                                                                                    -        ssl_protocols       TLSv1.2 TLSv1.3;
                                                                                                                                                                                                    -        ssl_certificate     $targetCert;
                                                                                                                                                                                                    -        ssl_certificate_key $targetCertKey;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_connect_timeout 10s;
                                                                                                                                                                                                    -        proxy_timeout 30s;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_pass $targetBackend;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    # Optional: Only if you want to ingest RTMP
                                                                                                                                                                                                    -    server {
                                                                                                                                                                                                    -        listen 1935 ssl;
                                                                                                                                                                                                    -        ssl_protocols       TLSv1.2 TLSv1.3;
                                                                                                                                                                                                    -        ssl_certificate     $targetCert;
                                                                                                                                                                                                    -        ssl_certificate_key $targetCertKey;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_connect_timeout 10s;
                                                                                                                                                                                                    -        proxy_timeout 30s;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        proxy_pass openvidu_media_nodes_rtmp;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and turn.example.com is the domain name you have chosen for your TURN with TLS. Both domains should be configured in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem, openvidu-key.pem, turn-cert.pem, and turn-key.pem must be valid SSL certificates for your domains.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Non-interactive installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install a Master Node, you can use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='master-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --openvidu-pro-license='xxxxx' \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --rtc-engine='pion' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --mongo-replica-set-key='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --external-load-balancer
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --node-role='media-node' \
                                                                                                                                                                                                    -    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \
                                                                                                                                                                                                    -    --enabled-modules='observability,v2compatibility,app' \
                                                                                                                                                                                                    -    --redis-password='xxxxx'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/index.html deleted file mode 100644 index fe128a5a..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/index.html +++ /dev/null @@ -1,4133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create AWS certificate for HA deployment - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Create AWS certificate for OpenVidu HA deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You will need this certificate to be able to deploy the High Availability deployment. This guide is meant to show you how to do it.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prerequisites#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Is important to notice that in your AWS you will need to have access to the Certificate Manager. As well as having access to a domain provider.
                                                                                                                                                                                                    -You will need to have one domain to be able to create and vinculate the certificate.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Creation#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Those are the steps you need to follow to create the AWS certificate, keep in mind that you need a domain.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First go to AWS Certificate Manager and request a new public certificate. The following parameter is the most important. -

                                                                                                                                                                                                    -AWS Certificate Manager view -
                                                                                                                                                                                                    Domain configuration
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to replace yourdesiredname for whatever name you want and yourdomain for the name of the domain that you own.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Next leave the rest of the parameters as they are and click request.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The next page will prompt out the certificate status, here you will need to create a record in your domain provider to validate the status, first you will have status pending.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Here you will need to create a new CNAME record in the domain you own by using as subdomain the CNAME name until the domain name and the CNAME value as the value of that record.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In AWS Certificate Manager you can check the CNAME name and value clicking into the certificate you want.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Create record in Route 53 -
                                                                                                                                                                                                    Create record in Route 53
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to click the button called Create records in Route 53. This will lead you to the next image where you just click Create records and that's it.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Create record page -
                                                                                                                                                                                                    Create record for certificate
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Please verify that you have a new entry in the records table of the specified Hosted Zone in Route 53 with the CNAME of the certificate you just created.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Try to refresh until you reach the Issued status in green.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally when deploying the HA stack in CloudFormation follow these steps

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Load Balancer cofiguration -
                                                                                                                                                                                                    Load balancer configuration
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Those are parameters related to the certificate you just created.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You have to fill field DomainName with the domain name that appears in the certificate that you created, the one that matches yourdesiredname.yourdomain mentioned earlier.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Next for the OpenViduCertificateARN, you can find it at the top of the same page I mentioned earlier, it is called ARN, as you can see in the image below.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -ARN and domain location -
                                                                                                                                                                                                    Domain name and ARN location
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When everything is up and running you will need to create a new record in the Hosted Zone referring to the Load Balancer resource created in the stack.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Create Load Balancer record -
                                                                                                                                                                                                    Create Load Balancer record
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note that Alias is checked.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In subdomain you just have to put the same as you put in yourdesiredname creating the AWS certificate.
                                                                                                                                                                                                    -In Choose endpoint you just have to select Alias to Network Load Balancer, and in Choose Region select your region where the stack is deployed.
                                                                                                                                                                                                    -After selecting the endpoint and region a new field will appear, select there the load balancer that belongs to the stack you have deployed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For the other fields, leave them as they are.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-disable-modules/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-disable-modules/index.html deleted file mode 100644 index 9c221d85..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-disable-modules/index.html +++ /dev/null @@ -1,4006 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Enable and disable modules - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Enable and disable modules#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu allows you to enable or disable modules to customize your deployment. These modules are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • app: The OpenVidu Default App (OpenVidu Call)
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • observability: Grafana, Loki, Mimir, and Promtail observability services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • v2compatibility: OpenVidu V2 Compatibility. (Only available in OpenVidu Pro)
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    These modules are configured in the parameter COMPOSE_PROFILES at:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Elastic / High Availability:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Master Node: /opt/openvidu/config/cluster/node/master_node.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Media Node: /opt/openvidu/config/cluster/node/media_node.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This parameter is one of the parameters that is not replicated per node in the cluster. To enable or disable a module, you need to modify the parameter in all the nodes where you want to apply the changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For example, to enable only v2compatibility and app, the parameter should look like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    COMPOSE_PROFILES=app,v2compatibility
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After modifying the parameter, you need to restart the node to apply the changes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl restart openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/index.html deleted file mode 100644 index 45ebd310..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/index.html +++ /dev/null @@ -1,4133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Enable webhooks - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Enable Webhooks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you need to integrate OpenVidu with other services, you can use webhooks to send notifications about events that occur in your OpenVidu deployment. This guide explains how to enable webhooks.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Server Configuration#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add to the file livekit.yaml the following configuration:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      webhook:
                                                                                                                                                                                                      -    api_key: ${openvidu.LIVEKIT_API_KEY:?mandatory}
                                                                                                                                                                                                      -    urls:
                                                                                                                                                                                                      -    ...
                                                                                                                                                                                                      -        - https://<YOUR_WEBHOOK_URL>
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The file is located at:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/livekit.yaml
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/livekit.yaml
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Make sure the webhook section exists in the file, and if it doesn't, add it as stated in the previous snippet. Then, add the URL where you want to receive the webhook notifications. In this example, <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl restart openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    PRO V2 Compatibility Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using the V2 Compatibility module, you can also enable webhooks for the V2 Compatibility layer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add to the file v2compatibility.env the following parameters:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      V2COMPAT_OPENVIDU_WEBHOOK=true
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=https://<YOUR_WEBHOOK_URL>
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Check in the Configuration Reference all the webhook events that you can receive setting up the parameter V2COMPAT_OPENVIDU_WEBHOOK_EVENTS.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Send Webhooks to a Local Application Server#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When developing locally pointing to a production deployment and webhooks events are required by your application, you will face issues because OpenVidu cannot access your local application server.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To receive webhooks from OpenVidu on your local machine, you need to expose your local application server to the internet. This exposure allows OpenVidu to send webhooks directly to your application server.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The following images illustrate the difference between an unreachable and a reachable local application server:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Unreachable local server -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Unreachable local application server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Reachable local server -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Reachable local application server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Exposing your local application server to the internet is a common practice when developing applications locally. Tools like Ngrok, LocalTunnel, LocalXpose and Zrok can help you achieve this.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These tools provide you with a public URL that forwards requests to your local application server. You can use this URL to receive webhooks from OpenVidu, configuring it in the OpenVidu Server as explained in the previous section.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/index.html deleted file mode 100644 index ba6c8657..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/index.html +++ /dev/null @@ -1,4196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Configuring external S3 for OpenVidu recordings - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Configuring external S3 for OpenVidu recordings#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    By default, OpenVidu uses MinIO for storing recordings. You can configure it to use an external S3 bucket instead. This guide uses AWS S3, but can be adapted for other S3-compatible services.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Global Configuration with openvidu.env#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu.env file defines global parameters used in service configurations. So we can use it to define our S3 configuration details and afterwards use them in the services that need them.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add these variables to openvidu.env:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      RECORDINGS_S3_BUCKET=openvidu-recordings
                                                                                                                                                                                                      -RECORDINGS_S3_ENDPOINT=https://s3.us-east-2.amazonaws.com
                                                                                                                                                                                                      -RECORDINGS_AWS_ACCESS_KEY=<YOUR_AWS_ACCESS_KEY>
                                                                                                                                                                                                      -RECORDINGS_AWS_SECRET_KEY=<YOUR_AWS_ACCESS_SECRET>
                                                                                                                                                                                                      -RECORDINGS_AWS_REGION=us-east-2
                                                                                                                                                                                                      -RECORDINGS_S3_FORCE_PATH_STYLE=false
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/openvidu.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In AWS it is necessary to specify the region in the endpoint URL as you can see in RECORDINGS_S3_ENDPOINT. Check the AWS S3 endpoints documentation for more information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The parameters defined at openvidu.env can be used in other configuration files by using the ${openvidu.VARIABLE_NAME} syntax. If you want to know more about the configuration system of OpenVidu, check the Configuration In-depth section.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Update egress.yaml to use these variables:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      s3:
                                                                                                                                                                                                      -    access_key: ${openvidu.RECORDINGS_AWS_ACCESS_KEY}
                                                                                                                                                                                                      -    secret: ${openvidu.RECORDINGS_AWS_SECRET_KEY}
                                                                                                                                                                                                      -    region: ${openvidu.RECORDINGS_AWS_REGION}
                                                                                                                                                                                                      -    endpoint: ${openvidu.RECORDINGS_S3_ENDPOINT}
                                                                                                                                                                                                      -    bucket: ${openvidu.RECORDINGS_S3_BUCKET}
                                                                                                                                                                                                      -    force_path_style: ${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -The location of the file depends on the type of deployment:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/egress.yaml
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/egress.yaml
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      systemctl restart openvidu
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Additional Configuration for Default App and V2 Compatibility#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If using the Default App (OpenVidu Call) or V2 Compatibility, additional configurations are required.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Default App (OpenVidu Call)#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Update app.env with:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      CALL_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}
                                                                                                                                                                                                      -CALL_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}
                                                                                                                                                                                                      -CALL_S3_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}
                                                                                                                                                                                                      -CALL_S3_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}
                                                                                                                                                                                                      -CALL_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}
                                                                                                                                                                                                      -CALL_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/app.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/app.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    PRO V2 Compatibility#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Update v2compatibility.env with:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGE=s3
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}
                                                                                                                                                                                                      -V2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/v2compatibility.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/v2compatibility.env
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/index.html deleted file mode 100644 index e8fbd792..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/index.html +++ /dev/null @@ -1,4098 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Force traffic through 443 with TLS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Force all traffic including WebRTC to go through 443 with TLS#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In certain scenarios, users may be behind restrictive firewalls or network policies that only permit traffic through port 443 using TLS. By default, OpenVidu is configured to allow traffic through port 443 with TLS if a TURN domain name is specified during the installation process. However, users in less restrictive environments can still utilize other ports to establish WebRTC connections.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In some cases, it is necessary to ensure that all traffic, including WebRTC, is routed through port 443 with TLS due to network policies, security requirements, or other considerations.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To enforce this configuration, OpenVidu must be installed with a TURN domain name, which is an optional step in the installation process. If this was not done initially, you will need to reinstall OpenVidu with a TURN domain name.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once OpenVidu is installed with a TURN domain name, ensure that the following ports are not open or are explicitly closed:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Single Node closed Ports

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    NodePortProtocol
                                                                                                                                                                                                    OpenVidu Server443UDP
                                                                                                                                                                                                    OpenVidu Server50000-60000UDP
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Elastic and High Availability closed Ports

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    NodePortProtocol
                                                                                                                                                                                                    Media Node443UDP
                                                                                                                                                                                                    Media Node50000-60000UDP
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this way, all the traffic will go through port 443 with TLS using the TURN domain name configured in the installation process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Considerations#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Media over UDP using WebRTC does not mean that the media is not encrypted. WebRTC encrypts the media using SRTP and DTLS. WebRTC is designed to be encrypted by default.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Media going through 443 with TLS has a penalty in the media quality and CPU usage. This is because of the TLS roundtrip, TCP being used and media processed twice by the TURN server and the Media Server. This can lead to a worse user experience and higher CPU usage in the Media Server. We recommend using this configuration only if it is strictly necessary.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/how-to-guides/index.html b/3.0.0-beta3/docs/self-hosting/how-to-guides/index.html deleted file mode 100644 index 809317fe..00000000 --- a/3.0.0-beta3/docs/self-hosting/how-to-guides/index.html +++ /dev/null @@ -1,3982 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - How To Guides - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    How To Guides#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu deployments are installed with sane defaults, but you may want to customize your deployment to suit your needs. This section contains guides on how to configure OpenVidu for specific use cases, so you can get the most out of your deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/local/index.html b/3.0.0-beta3/docs/self-hosting/local/index.html deleted file mode 100644 index cb711e13..00000000 --- a/3.0.0-beta3/docs/self-hosting/local/index.html +++ /dev/null @@ -1,4395 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Local Installation - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Local Installation (Development)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First, make sure you have the following prerequisites:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The installation consists of cloning a repository and running a script to configure your local IP address in the deployment. Then, you can start, stop, and manage your deployment with Docker Compose.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To install OpenVidu locally, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Clone the following repository:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Clone the following repository:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/pro
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/pro
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/pro
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu PRO runs locally in evaluation mode for free for development and testing purposes. Some limits apply:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Maximum 8 Participants across all Rooms
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Maximum 5 minutes duration per Room
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For a production environment, you need to create an OpenVidu account to get a license key. -There's a 15 day free trial waiting for you!

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The deployment is ready when you see the following message:

                                                                                                                                                                                                    -
                                                                                                                                                                                                     =========================================
                                                                                                                                                                                                    - 🎉 OpenVidu is ready! 🎉
                                                                                                                                                                                                    - =========================================
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - OpenVidu Server && LiveKit Server URLs:
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -     - From this machine:
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -         - http://localhost:7880
                                                                                                                                                                                                    -         - ws://localhost:7880
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -     - From other devices in your LAN:
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -         - https://xxx-yyy-zzz-www.openvidu-local.dev:7443
                                                                                                                                                                                                    -         - wss://xxx-yyy-zzz-www.openvidu-local.dev:7443
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - =========================================
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - OpenVidu Developer UI (services and passwords):
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -     - http://localhost:7880
                                                                                                                                                                                                    -     - https://xxx-yyy-zzz-www.openvidu-local.dev:7443
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - =========================================
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    By visiting http://localhost:7880 you have the OpenVidu Developer UI available with a summary of the services and passwords deployed. You can access the following services:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    You just need to point your OpenVidu and LiveKit applications to http://localhost:7880 or ws://localhost:7880 and start developing. Check our tutorials if you want a step-by-step guide to develop your first application using OpenVidu.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure your Application to use the Local Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To point your applications to your local OpenVidu Local deployment, check the credentials at http://localhost:7880 or simply check the .env file. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • URL: It must be ws://localhost:7880 or http://localhost:7880 depending on the SDK you are using.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with LiveKit SDK:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: It must be ws://localhost:7880/ or http://localhost:7880/ depending on the SDK you are using.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Applications developed with OpenVidu v2:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • URL: The value in .env of DOMAIN_NAME as a URL. For example, http://localhost:7880
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Password: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you want to use the OpenVidu Local deployment from other devices on your network, follow the instructions in the next section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuring webhooks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To configure webhooks in your local deployment, simply go to the file livekit.yaml and add to the webhooks section the URL where you want to receive the events:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    webhook:
                                                                                                                                                                                                    -    <LIVEKIT_API_KEY>:<LIVEKIT_API_SECRET>:
                                                                                                                                                                                                    -    urls:
                                                                                                                                                                                                    -        - <YOUR_WEBHOOK_URL>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are using the v2compatibility and you want to receive webhooks for OpenVidu v2 applications, you can configure the webhooks in the .env file. For example:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=<YOUR_WEBHOOK_URL>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the events.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your local deployment from other devices on your network#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Testing WebRTC applications can be challenging because devices require a secure context (HTTPS) to access the camera and microphone. When using LiveKit Open Source, this isn't an issue if you access your app from the same computer where the LiveKit Server is running, as localhost is considered a secure context even over plain HTTP. Consider the following architecture:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - Image title -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The simplest way to test your application is:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Run LiveKit Server on your computer.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Connect your app to LiveKit Server through localhost.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Serve both your application client and server from the same computer.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Access your app from localhost in a browser on the same computer.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This setup is straightforward, but what if you need to test your app from multiple devices simultaneously, including real mobile devices? In this case, you must use a secure context (HTTPS), which introduces two challenges:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. LiveKit Server open source does not natively support HTTPS. You'll need a reverse proxy to serve LiveKit Server over HTTPS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Even with HTTPS, your SSL certificate might not be valid for local network addresses. You'll need to accept it in the browser for web apps, and install it on mobile devices.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Local Deployment addresses these issues by providing a magic domain name openvidu-local.dev that resolves to any IP specified as a subdomain and provides a valid wildcard certificate for HTTPS. This is similar to services like nip.io, traefik.me, or localtls.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When using OpenVidu Local Deployment, you can access OpenVidu Server (which is 100% LiveKit compatible) and your app from any device on your local network with a valid HTTPS certificate. The following table shows the URLs to access the deployment and your application locally and from other devices on your network:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    Local accessAccess from devices in your local network
                                                                                                                                                                                                    UsageAccess only from the development machineAccess from any device connected to your local network. In the URLs below, replace xxx-yyy-zzz-www with the local IP address of the development machine, replacing the dots (.) with dashes (-). You can find the configured local IP in the .env file in the LAN_PRIVATE_IP variable
                                                                                                                                                                                                    Application Client (frontend)http://localhost:5080https://xxx-yyy-zzz-www.openvidu-local.dev:5443
                                                                                                                                                                                                    Application Server (backend)http://localhost:6080https://xxx-yyy-zzz-www.openvidu-local.dev:6443
                                                                                                                                                                                                    OpenVidu (LiveKit Compatible) URLhttp://localhost:7880https://xxx-yyy-zzz-www.openvidu-local.dev:7443
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • If you are developing locally, use localhost to access the services, but if you want to test your application from other devices on your network, use the openvidu-local.dev URLs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Replace xxx-yyy-zzz-www with your local IP address. You can find it in the .env file in the LAN_PRIVATE_IP variable.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If the URL isn't working because the IP address is incorrect or the installation script couldn't detect it automatically, you can update the LAN_PRIVATE_IP value in the .env file and restart the deployment with docker compose up.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When developing web applications with this deployment, you can use the following code snippet to dynamically determine the appropriate URLs for the application server and the OpenVidu server based on the browser's current location. This approach allows you to seamlessly run your application on both your development machine and other devices within your local network without needing to manually adjust the URLs in your code.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = "http://localhost:6080";
                                                                                                                                                                                                    -  OPENVIDU_URL = "ws://localhost:7880";
                                                                                                                                                                                                    -} else {
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = "https://" + window.location.hostname + ":6443";
                                                                                                                                                                                                    -  OPENVIDU_URL = "wss://" + window.location.hostname + ":7443";
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    About openvidu-local.dev domain and SSL certificates#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This setup simplifies the configuration of local OpenVidu deployments with SSL, making it easier to develop and test your applications securely on your local network by using the openvidu-local.dev domain and a wildcard SSL certificate valid for *.openvidu-local.dev. However, it’s important to note that these certificates are publicly available and do not provide an SSL certificate for production use.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The HTTPS offered by openvidu-local.dev is intended for development or testing purposes with the only goal of making your local devices trust your application (which is mandatory in WebRTC applications). For any other use case, it should be treated with the same security considerations as plain HTTP.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For production, you should consider deploying a production-grade OpenVidu deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/index.html deleted file mode 100644 index f64bc021..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/index.html +++ /dev/null @@ -1,4270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fault Tolerant - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Fault Tolerance #

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Real-time media is particularly sensitive to downtime events, as they directly affect the user experience in a very disruptive way. OpenVidu is designed from the ground up to be fault tolerant in all its services in case of node downtime, especially in its High Availability deployment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The extent of fault tolerance depends on the OpenVidu deployment type:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Single Node: it is not fault tolerant. Fault tolerance requires a multi-node deployment.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Elastic: fault tolerant only for Media Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu High Availability: fault tolerant for both Media Nodes and Master Nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Fault tolerance in OpenVidu Elastic#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Master Node#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    An OpenVidu Elastic deployment has a single Master Node, so a failure on this node is fatal and any ongoing video Rooms will be interrupted. The service won't be restored until the Master Node is recovered.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can have any number of Media Nodes in an OpenVidu Elastic deployment. Media Nodes are stateless, meaning that they do not store critical information about the Rooms, Egress or Ingress processes they are handling. This means that they can be easily replicated in any other Media Node in case of a failure.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the event of a Media Node failure, there are 3 services affected with the following behaviors:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Active Rooms hosted by the failed Media Node will suffer a temporary interruption of about 5 seconds (this is the time the clients take to realize the Media Node has crashed). After that time has elapsed, the Room will be automatically reconstructed in a healthy Media Node. Every participant and track will be recreated and the Room will be fully operational again.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Active Egress hosted by the failed Media Node will be interrupted. If the node's disk is still accessible, egress output files can still be recovered. See Recovering Egress from node failures.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Active Ingress hosted by the failed Media Node will be interrupted. The participants of the Room will receive the proper events indicating the Ingress participant has left the Room: TrackUnpublished and ParticipantDisconnected. Some famous tools for streaming such as OBS Studio will automatically try to reconnect the stream when they detect a connection loss, so in this case interruption will be minimal and the Ingress tracks will be restored on their own on a healthy Media Node.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Fault tolerance in OpenVidu High Availability#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu High Availability delivers the highest possible degree of fault tolerance. This is achieved by running all of the services in the Master Nodes and the Media Nodes in their High Availability flavour.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    An OpenVidu High Availability deployment runs Master Nodes and Media Nodes in separated groups. Let's see the extent of fault tolerance for each node group:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Master Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The number of Master Nodes in an OpenVidu High Availability deployment is 4. This minimum number of nodes ensures that every service running in the Master Nodes is fault tolerant.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If one Master Node fails, the service won't be affected. Some users may trigger event Reconnecting closely followed by Reconnected, but the service will remain fully operational.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When two or more Master Nodes fail simultaneously, there can be some degradation of the service:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • If two Master Nodes fail, the service will still be operational for the most part. Only active Egress might be affected, as they won't be stored in the Minio storage. See Recovering Egress from node failures.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If three or four Master Nodes fail, the service will be interrupted.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the event of Master Node failures, the service will be automatically restored as soon as the failed node(s) are recovered.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Nodes#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Fault tolerance of Media Nodes in OpenVidu Elastic behaves the same as in OpenVidu High Availability.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Recovering Egress from node failures#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Egress processes can be affected by the crash of a Master Node or a Media Node. To recover Egress from...

                                                                                                                                                                                                    -

                                                                                                                                                                                                    From Master Node failures#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This only applies to OpenVidu High Availability

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If 2 Master Nodes crash, the Egress process won't be able to use the Minio storage. This has different consequences depending on the configured outputs for your Egress process:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • For MP4, OGG or WEBM files, if the Egress is stopped when 2 Master Nodes are down, the output files will not be uploaded to Minio.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • For HLS, the segments will stop being uploaded to Minio. If you are consuming these segments from another process, note that new segments will stop appearing.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In both cases, files are not lost and can be recovered. They will be available in the Egress backup path of the Media Node hosting the Egress process (by default /opt/openvidu/egress_data/home/egress/backup_storage).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    From a Media Node failure#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This applies to both OpenVidu High Availability and OpenVidu Elastic

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If the Media Node hosting an ongoing Egress process crashes, then the Egress process will be immediately interrupted. But as long as the disk of the crashed Media Node is still accessible, you may recover the output files. They will be available in the Media Node at path /opt/openvidu/egress_data/home/egress/tmp.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is possible that if the crashed Egress had MP4 as configured output (which is an option available for Room Composite and Track Composite) the recovered file may not be directly playable and it may require a repair process.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/index.html deleted file mode 100644 index 04c8bf70..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/index.html +++ /dev/null @@ -1,4009 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Production ready - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Production ready#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu is designed to be self-hosted, whether it is on premises or in a cloud provider. It brings to your own managed service advanced capabilities usually reserved only for SaaS solutions. There are two main reasons why you may need to self-host the real-time solution yourself:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Privacy: you can't afford to let your client's data get out of your reach. OpenVidu allows you to meet all your privacy and regulatory requirements: no data at all is sent to any third-party server. Everything is self-contained on your own servers.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leverage your resources: your organization has access to its own infrastructure that can be used to host these services. SaaS solutions generally offer complete freedom from infrastructure management, but this comes with generally high prices that cover both the provider's infrastructure and their service surcharge. OpenVidu allows taking full advantage of your own infrastructure, reducing costs and increasing performance.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is important to mention that when we talk about self-hosting OpenVidu, we don't just mean installing it in bare-metal servers or private VPCs. OpenVidu also supports deployments in the most popular cloud providers, using their native services when possible. AWS is now supported, and others are coming soon. You can learn more about the different options to deploy OpenVidu in the deployment types section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One of OpenVidu's main goals is offering a self-hosted, production-ready live-video platform with all the advanced capabilities typically reserved for SaaS solutions. This includes outstanding performance, scalability, fault tolerance and observability:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Performance

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Learn more about performance

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Scalability

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Learn more about scalability

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Fault Tolerance

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable high-availability cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Learn more about fault tolerance

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Observability

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs, and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Learn more about observability

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/index.html deleted file mode 100644 index 8e5ad671..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/index.html +++ /dev/null @@ -1,4324 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Grafana Stack - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Grafana Stack#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu also provides different Grafana dashboards to monitor metrics from OpenVidu Server and logs from your cluster.

                                                                                                                                                                                                    - - -

                                                                                                                                                                                                    Grafana is available at https://your.domain/grafana/ and can be accessed using your Grafana admin credentials.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Grafana login

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Dashboards can be found in the OpenVidu folder at https://your.domain/grafana/dashboards/f/openvidu-dashboards/openvidu.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Grafana dashboards folder

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Services#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Grafana stack that comes with OpenVidu is composed of the following services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Grafana : Tool for querying, visualizing, alerting on and exploring metrics, logs and traces. It queries different data sources to show data in beautiful dashboards. In OpenVidu, contains all dashboards built from Mimir/Prometheus and Loki data sources to monitor OpenVidu Server and logs from your cluster.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Prometheus : System monitoring and alerting toolkit. It collects and stores metrics from different targets as time series data. In OpenVidu, it collects metrics from OpenVidu Server of each Media Node and sends them to Mimir.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Mimir: Grafana software project that provides multi-tenant, long-term storage for Prometheus metrics. In OpenVidu, it is used to store metrics collected by Prometheus.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Promtail: Agent that ships the contents of local logs to a Loki instance. In OpenVidu, it is used to collect logs from all services in your cluster and send them to Loki.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Loki: Horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. In OpenVidu, it is used to store logs collected by Promtail.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Dashboards#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Server Metrics#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This dashboard provides metrics about OpenVidu Server. It includes charts about active rooms, active participants, published tracks, subscribed tracks, send/receive bytes, packet loss percentage and quality score.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are using OpenVidu PRO and you have more than one Media Node deployed, you will see all metrics from all nodes combined in the same chart.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    OpenVidu Media Nodes Server Metrics#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This dashboard provides the same metrics as the OpenVidu Server Metrics dashboard, but grouped by Media Node.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can select the Media Node you want to see metrics from in the media_node dropdown. You will see different charts in the same panel according to the selected Media Nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Node dropdown

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you add new Media Nodes to your OpenVidu deployment, you will have to refresh the page in order to see the new Media Nodes in the dropdown.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Media Node metrics

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Logs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are using OpenVidu COMMUNITY, this dashboard provides different visualizations for logs from your OpenVidu Single Node deployment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    There is a panel showing all containers logs,

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Single Node logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    another panel to filter logs by room_id and participant_id,

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    and one row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Single Node select services

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Single Node service logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Single Node filter logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Cluster Nodes Logs#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by node.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, there is a panel showing all containers logs from all nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluster logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, there is a row for each selected node, containing all logs, warnings and errors from that node. Besides, each row contains a panel for each selected container, showing all its logs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note that some panels have no data. This is because some containers are running in Master Nodes and others in Media Nodes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluter filter logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Cluster Services Logs#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by service.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, there is a panel to filter logs by room_id and participant_id.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Then, there is a row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluster select services

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Cluster service logs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Limitations#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For now, in OpenVidu High Availability deployments, we have decided to not implement Grafana in High Availability (HA) mode. This decision is based on the fact that Grafana needs a configured HA MySQL or PostgreSQL database to work in HA mode, and we want to keep the deployment as simple as possible.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    There are 4 instances of Grafana in an OpenVidu High Availability deployment, one for each Master Node, but they are not synchronized between them. Therefore, if you make any change (change your admin password, create a new dashboard...) in one Grafana instance and the Master Node suddenly goes down, you will be redirected to another Grafana instance where the changes will not be reflected. That is the reason why we disable user signups and saving dashboard or datasource modifications in Grafana.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    However, all metrics and logs from all nodes are available in all Grafana instances, so you can monitor your OpenVidu cluster without any problem.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/observability/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/observability/index.html deleted file mode 100644 index 5e2a5a25..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/observability/index.html +++ /dev/null @@ -1,3984 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Observability - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Observability #

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Any production software needs to be observable. But in real-time applications this becomes an absolute priority. You must be able to:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Detect and solve networking issues that may prevent your users from connecting to your Rooms.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Monitor the quality of the video and audio streams, that will reflect in your users' experience.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Analyze the load in your hardware to detect bottlenecks and scale your deployment accordingly.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Store historical data to analyze past issues and trends to make future decisions based on them.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu brings everything you need to fulfill these requirements. We collect events, metrics and logs from your deployment and provide OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/index.html deleted file mode 100644 index 811b0d5e..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/index.html +++ /dev/null @@ -1,4268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Dashboard - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Dashboard#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It is a web application designed to provide OpenVidu administrators with a comprehensive view of usage statistics and real-time monitoring of video Rooms. OpenVidu Dashboard is included by default in any OpenVidu deployment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To access OpenVidu Dashboard, go to https://your.domain/dashboard/ and log in using your admin credentials.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Dashboard login

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Views#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Analytics#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Display graphical analytics for client SDKs, connection types, bandwidth usage, unique participants, rooms and egresses created over different time periods (last 24 hours, last 7 days, last 28 days or current month).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Rooms#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Review the total count of active rooms and active participants, along with a roster of currently active rooms and a history of closed rooms within the last 28 days. Detailed information on each room is accessible by clicking on the respective row.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Dashboard rooms

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Room Details#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Retrieve in-depth information about a specific room, including its duration, bandwidth consumption, participants and related events. A chart illustrating the active participants count over time is also provided.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Participant Details#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Obtain detailed insights into each participant, covering their duration, bandwidth usage, average audio and video quality score, information about the client they are connecting with, connection stats, published tracks and related events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    A participant may connect and disconnect from a room multiple times while it remains open. Each instance of connection using the same participant identity is referred to as a participant session. If multiple sessions occur, we will aggregate all participant sessions together and organize them into a timeline at the top of the participant details view. You can easily switch between participant sessions by clicking on each corresponding row:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Dashboard participant sessions

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Egress-Ingress#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Review an overview of all egresses and ingresses, including their duration and status. Detailed information for each egress or ingress can be accessed by clicking on the respective row.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Dashboard egress-ingress

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Egress Details#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access comprehensive details about a specific egress, including its duration, current status, type, associated room, destinations, status timeline and request information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Ingress Details#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Explore detailed information about a specific ingress, including its total duration, status and a list of all associated rooms.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Dashboard ingress

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/performance/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/performance/index.html deleted file mode 100644 index 30e5611c..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/performance/index.html +++ /dev/null @@ -1,4290 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Performant - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Performance #

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu is able to handle up to 2x the load in a single server, doubling the amount of media Tracks that can be transmitted compared to base LiveKit. By not only building upon the giant Open-Source shoulders of LiveKit, but also pushing the bar further, OpenVidu uses the best-in-class technologies to bring considerable performance improvements to the table.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The key element of any WebRTC server solution is the ability to exchange media between participants of a room, in the so-called WebRTC SFU. LiveKit implements its own SFU, and that's where OpenVidu makes a different choice by using mediasoup.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The key points of how this works are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • On the surface, OpenVidu is the same than LiveKit, and for the most part features work equally, such as connection establishment, participant management, and SDK support.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Internally however, mediasoup is used to replace the original WebRTC engine implementation of LiveKit. mediasoup is built with the most efficient technologies and has outstanding low-level optimizations, which translates in a 2x improvement with respect to the original LiveKit Open Source performance.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    About mediasoup integration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Architecture#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit created its own WebRTC SFU, based on the Pion library to route media between participants:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu with Pion WebRTC engine

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu is built by a team of expert WebRTC developers who know all the ins and outs of low-level WebRTC development, so it was possible to replace LiveKit's own implementation with an alternative, and mediasoup was the clear best choice given its fantastic performance characteristics:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu with mediasoup WebRTC engine

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This means that applications built on top of LiveKit will continue to work exactly the same, while the internal WebRTC engine inside the server can be swapped at will and applications can benefit from that change, without having to be rebuilt.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In terms of the signaling protocol, API and SDKs, OpenVidu maintains the original LiveKit implementation. LiveKit's API is very well designed, with a simple but powerful set of concepts, and the amount of SDKs available is very large.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Choice of technology#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Both LiveKit and Pion are written in the Go programming language, and this has some implications for speed and efficiency. While Go is popular for its simplicity, readability, and approach to concurrency, when it comes to performance other alternatives rank higher in common benchmarks.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First and foremost, the two most defining limitations of Go is that it requires a quite heavy runtime that is able to handle all of the low-level features of the language, such as goroutines and memory allocations. Also, speaking of memory management, Go requires a Garbage Collector, which knowledgeable readers will recognize as a hindrance for performance-critical applications.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    mediasoup, on the other hand, focuses all of its efforts on maximum efficiency. It is written in C++, and it is ultra-optimized for the specific task of routing media packets. C++ is a language that provides fully manual management of all resources, and direct access to the hardware, with the benefit of software that is as fast as it can be on any machine.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    We believe that by combining the best of the LiveKit stack with a top-notch WebRTC engine like mediasoup, OpenVidu is the best option for those who need a self-hosted and high-performance real-time solution.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Limitations#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu developers are hard at work with integrating mediasoup as a WebRTC engine within LiveKit, aiming to provide feature parity with the original Pion engine.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Currently there are two client SDK events that are not triggered when using mediasoup:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Benchmarking#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Numerous load tests have been performed to determine the true capabilities of OpenVidu on different hardware. To do so we have developed the tool Openvidu LoadTest: an in development project that aims to improve the precision of load and performance tests in WebRTC systems.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    We have compared OpenVidu using the original Pion WebRTC engine (this is the default LiveKit Open Source implementation) and using mediasoup as WebRTC engine. We tested the performance for both cases in the scenario below.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Results: Conference rooms#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tests increasingly adds Rooms of 8 Participants each, every one sending 1 video Track and 1 audio Track, and subscribing to all remote Tracks.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The following plot shows the number of Participants that can be added to a Room in OpenVidu using Pion and using mediasoup as WebRTC engines:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Pion vs mediasoup. Multiple Conference Rooms

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The conclusion is that for multiple Rooms, mediasoup performs much better than Pion, almost doubling the total number of Participants (and Tracks) that fit in the server.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Below there is the deatiled connection progression for each Participant in each test.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The X axis reflects the point of time in seconds. For each Participant there is a bar indicating its connection status:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • An orange bar indicates that the browser is up, but the connection to the media server is still in progress.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A green bar indicates that the connection is up and running.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • A red bar indicates that the connection has failed, indicating the time that it's down.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CPU load of the server is also shown with a black marked plot (from 0 to 1, representing 0% to 100% CPU load).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Pion connection progression

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with Pion
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Mediasoup connection progression

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with mediasoup
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Benchmarking technical details#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Each participant sending video and audio to the media server uses the following video in loop: Video. The video is in YUV4MPEG2 format and with a 640x480 resolution. The audio is in WAV format: Audio.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • All tests were done using AWS EC2 instances. The media server runs with a m6in.xlarge instance type, an instance type with 4 vCPUs and better network capabilities compared to other instance types.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • The workers running the browsers that act as participants ran in c5.xlarge instances, an instance type with 4 vCPUs with better computing capabilities.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Benchmarking methodology#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Each test begins with no participants on the media server. First, the test controller creates EC2 instances to host the browsers. The controller then sends a request to create a number of participants (this number is known as the batch size). After each browser sends confirmation to the controller that it is connected, the controller sends another request to add more participants (as many participants as the batch size specifies). A participant is considered connected to the room if:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • If the participants sends video and audio, the participant is connected after confirming that both local tracks are being sent correctly.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If the participant acts as viewer (is only receiving video and audio from a different participant), the participant is connected when it confirms that it is receiving at least both tracks from a user in the room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The test stops when it determines that no more users can be added to a room. This happens when a user has 5 failed connections. A connection is considered to have failed when it terminates with a fatal error (in LiveKit this is captured when a Disconnected event occurs) or when the connection times out. A failure in connection can occur when trying to join a room (ending usually in timeout) or during the connection (a Disconnected event is thrown). Each time a failure is communicated to the controller, it will kill that browser and restart it again, effectively restarting the connection (up to 5 times, as mentioned before).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    About OpenVidu LoadTest#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Tools like livekit-cli simulate participants directly using WebRTC SDKs, but we found out that browsers add significant more load that these kind of systems. This makes Openvidu LoadTest give results that are closer to real-world scenarios, as it uses real browsers. Using real browsers also allows for the collection of useful data related to connections, events and WebRTC statistics. On the other hand, tests performed with Openvidu LoadTest are more expensive, as they require real instances to host the browsers.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/production-ready/scalability/index.html b/3.0.0-beta3/docs/self-hosting/production-ready/scalability/index.html deleted file mode 100644 index 4ab4b870..00000000 --- a/3.0.0-beta3/docs/self-hosting/production-ready/scalability/index.html +++ /dev/null @@ -1,4154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Scalable - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Scalability #

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Scalability is a very broad term with implications on many levels. In the case of real-time applications, it usually refers to the number of simultaneous Rooms you can host and the maximum number of participants in each Room, or more accurately, the number of media tracks sent and received in each Room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu offers scalability out-of-the-box for typical videoconferencing use cases, but also for large low-latency live streams with hundreds of viewers. With OpenVidu Elastic and OpenVidu High Availability you can easily scale your deployment to host many simultaneous videoconferences and live streams. And it is also possible to scale automatically with our autoscaling feature, so you can truly adapt your resources to the demand.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Scalability depending on the use case#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Small and medium videoconferences#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu allows you to host multiple small and medium videoconferences (up to 10 participants). The number of simultaneous rooms depends on the deployment used and the power of machines.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Single Node deployment (OpenVidu Community): In this deployment, OpenVidu can manage up to XXX simultaneous videoconferences of 10 participants in a 4 CPU server. If you need more videoconferences at the same time, you can use more powerful server. This is known as vertical scalability. The limit here is usually the maximum computational power available for a single server and the maximum network bandwidth for it.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Elastic and High Availability deployments (OpenVidu Pro): In these deployments, OpenVidu is able to distribute the videoconferences in multiple media servers. This is known as horizontal scalability. In this case, the maximum number of simultaneous videoconferences depends on the number of media server used and the computational power of each of them. Also, the service used to coordinate the media servers (Redis) can be the bottleneck and limit the number of videoconferences. In High Availability deployments, Redis is distributed in 4 master nodes, so it is able to handle more load than in the Elastic deployment (with only one master node).

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Big live streams#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Live streaming is different from a video conference. In a videoconference, usually all participants can publish audio and video. Instead, in a live stream, only one participant can publish audio and video (known as the publisher) and others can view it (known as viewers).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu is able to manage live streams with up to XXX viewers (1 publisher and XXX subscribers) in a single Room hosted in a server with 4 CPUs. To manage more than one live stream simultaneously, an Elastic or High Availability deployment is needed with several media servers.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Big videoconferences and massive live streams (Working on it! 🔨)#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For big videoconferences with many participants (in the order of 100- or even 1000-) and massive live streams with few publishers and thousands of viewers, OpenVidu will offer in the near future two distinct strategies:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Distributing participants of one Room in multiple servers: By connecting multiple media servers between them, OpenVidu will be able to manage Rooms with unlimited number of participants and live streams with unlimited number of viewers.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Only show last speakers: A browser or mobile app is able to show a limited number of participants. A powerful computer can visualize up to 10 simultaneous videoconference participants at the same time with high video quality. To allow big videoconferences, OpenVidu will provide features on its frontend SDKs to show only last speakers in the videoconference.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Autoscaling#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Elastic and OpenVidu High Availability have multiple Media Nodes to handle the load.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Rooms are distributed among the available nodes prioritizing the less-loaded nodes.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It is possible to dynamically add new Media Nodes to the cluster when the load increases.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It is possible to remove Media Nodes from the cluster when the load decreases. If the Media Node is hosting ongoing Rooms, it won't accept new Rooms and will wait until the ongoing Rooms finish before terminating.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When deploying on AWS, OpenVidu will automatically add and remove Media Nodes according to load, thanks to Auto Scaling Groups. When deploying On Premises you are responsible of monitoring the load of your Media Nodes and triggering the addition of new Media Nodes or removal of existing Media Nodes.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/index.html b/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/index.html deleted file mode 100644 index a4d9830f..00000000 --- a/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/index.html +++ /dev/null @@ -1,4156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Single Node administration on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Single Node Administration: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    AWS deployment of OpenVidu Single Node is internally identical to the on-premises deployment, so you can follow the same instructions from the On Premises Single Node for administration and configuration. The only difference is that the deployment is automated with AWS CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    However, there are certain things worth mentioning:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Start and stop OpenVidu through AWS Console#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can start and stop all services as explained in the On Premises Single Node section. But you can also start and stop the EC2 instance directly from the AWS Console. This will stop all services running in the instance and reduce AWS costs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Right-click on the instance you want to start and select "Stop instance".
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Stop instance -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Right-click on the instance you want to start and select "Start instance".
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -Start instance -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Change the instance type#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can change the instance type of the OpenVidu Single Node instance to adapt it to your needs. To do this, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Stop the instance.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Right-click on the instance and select "Instance Settings > Change Instance Type".

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -Change instance type -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Select the new instance type and click on "Apply".

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Administration and Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Single Node Administration section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Select the CloudFormation Stack that you used to deploy OpenVidu Single Node.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. In the "Outputs" tab, click the Link at "ServicesAndCredentials". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Single Node deployment. -
                                                                                                                                                                                                      - Select Secrets Manager -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click on the "Retrieve secret value" button to get the JSON with all the information. -
                                                                                                                                                                                                      - Retrieve Secret Value -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Modify the parameter you want to change and click on "Save". The changes will be applied to the OpenVidu Single Node deployment.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Go to the EC2 Console and click on "Reboot instance" to apply the changes to the Master Node. -
                                                                                                                                                                                                      - Reboot Instance -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The changes will be applied automatically.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/single-node/aws/install/index.html b/3.0.0-beta3/docs/self-hosting/single-node/aws/install/index.html deleted file mode 100644 index da914603..00000000 --- a/3.0.0-beta3/docs/self-hosting/single-node/aws/install/index.html +++ /dev/null @@ -1,4324 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Single Node installation on AWS - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Single Node Installation: AWS#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment in AWS. Deployed services are the same as the On Premises Single Node Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/latest/aws/cf-openvidu-singlenode.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/3.0.0/aws/cf-openvidu-singlenode.yaml
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu Single Node AWS Architecture -
                                                                                                                                                                                                    OpenVidu Single Node AWS Architecture
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Parameters#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Domain and SSL Certificate Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's Encrypt certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let’s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Self-signed certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You don’t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Custom certificates

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance Configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You need to specify some properties for the EC2 instance that will be created.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at InstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don’t need to modify this.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    (Optional) TURN server configuration with TLS#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Deploying the Stack#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on "Next", specify in "Stack failure options" the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of error, click on "Next" again, and finally "Submit".

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When everything is ready, you will see the following links in the "Outputs" section of CloudFormation:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Troubleshooting Initial CloudFormation Stack Creation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      While deploying the stack, make sure at "Stack failure options" you have selected the option "Preserve successfully provisioned resources" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -Disable Rollback on failure -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • /var/log/cloud-init.log
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      If everything seems fine, check the status and the logs of the installed OpenVidu services.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Single Node deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/single-node/index.html b/3.0.0-beta3/docs/self-hosting/single-node/index.html deleted file mode 100644 index 10211c9d..00000000 --- a/3.0.0-beta3/docs/self-hosting/single-node/index.html +++ /dev/null @@ -1,3984 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Single Node - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Single Node installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node is part of the COMMUNITY edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/index.html b/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/index.html deleted file mode 100644 index 60425f8b..00000000 --- a/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/index.html +++ /dev/null @@ -1,4175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Single Node administration on-premises - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Single Node Administration: On-premises#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Single Node on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Single Node deployments.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Starting, stopping, and restarting OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can start, stop, and restart the OpenVidu services using the following commands:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl stop openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo systemctl restart openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking the status of services#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose ps
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    NAME         IMAGE                                        COMMAND                  SERVICE      CREATED          STATUS
                                                                                                                                                                                                    -app          docker.io/openvidu/openvidu-call             "docker-entrypoint.s…"   app          19 seconds ago   Up 16 seconds
                                                                                                                                                                                                    -caddy        docker.io/openvidu/openvidu-caddy            "/bin/caddy run --co…"   caddy        19 seconds ago   Up 16 seconds
                                                                                                                                                                                                    -dashboard    docker.io/openvidu/openvidu-dashboard        "./openvidu-dashboard"   dashboard    19 seconds ago   Up 16 seconds
                                                                                                                                                                                                    -egress       docker.io/livekit/egress                     "/entrypoint.sh"         egress       18 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -grafana      docker.io/grafana/grafana                    "/run.sh"                grafana      18 seconds ago   Up 13 seconds
                                                                                                                                                                                                    -ingress      docker.io/livekit/ingress                    "ingress"                ingress      19 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -loki         docker.io/grafana/loki                       "/usr/bin/loki -conf…"   loki         18 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -minio        docker.io/bitnami/minio                      "/opt/bitnami/script…"   minio        18 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -mongo        docker.io/mongo                              "docker-entrypoint.s…"   mongo        18 seconds ago   Up 15 seconds
                                                                                                                                                                                                    -openvidu     docker.io/openvidu/openvidu-server           "/livekit-server --c…"   openvidu     19 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -prometheus   docker.io/prom/prometheus                    "/bin/prometheus --c…"   prometheus   18 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -promtail     docker.io/grafana/promtail                   "/usr/bin/promtail -…"   promtail     18 seconds ago   Up 14 seconds
                                                                                                                                                                                                    -redis        docker.io/redis                              "docker-entrypoint.s…"   redis        19 seconds ago   Up 15 seconds
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Checking logs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs <service-name>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd /opt/openvidu/
                                                                                                                                                                                                    -docker compose logs
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the "Home" section, select "Dashboard", and then click on "OpenVidu > OpenVidu Logs". All the logs will be displayed there.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Changing the configuration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Uninstalling OpenVidu#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To uninstall OpenVidu, just execute the following commands:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sudo su
                                                                                                                                                                                                    -systemctl stop openvidu
                                                                                                                                                                                                    -rm -rf /opt/openvidu/
                                                                                                                                                                                                    -rm /etc/systemd/system/openvidu.service
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/index.html b/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/index.html deleted file mode 100644 index 59f945df..00000000 --- a/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/index.html +++ /dev/null @@ -1,4414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenVidu Single Node installation on-premises - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    OpenVidu Single Node Installation: On-premises#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment on-premises. It is a deployment based on Docker and Docker Compose, which will automatically configure all the necessary services for OpenVidu to work properly.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -OpenVidu Single Node On Premises Architecture -
                                                                                                                                                                                                    OpenVidu Single Node On Premises Architecture
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    All services are deployed on a single machine, which includes:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenVidu Server (LiveKit compatible).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server and Ingress/Egress services.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prerequisites#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before starting the installation process, make sure you have the following prerequisites:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • A machine with at least 4GB RAM and 4 CPU cores and Linux installed (Ubuntu recommended).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Generous disk space (100GB recommended) if you are going to record your sessions.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • The machine must have a Public IP and an FQDN (Fully Qualified Domain Name) pointing to it.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Port rules#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your machine.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    ProtocolPorts
                                                                                                                                                                                                    Source
                                                                                                                                                                                                    Description
                                                                                                                                                                                                    TCP800.0.0.0/0, ::/0Redirect HTTP traffic to HTTPS and Let's Encrypt validation.
                                                                                                                                                                                                    TCP4430.0.0.0/0, ::/0Allows access to the following:
                                                                                                                                                                                                    • LiveKit API.
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    UDP4430.0.0.0/0, ::/0STUN/TURN server over UDP.
                                                                                                                                                                                                    TCP19350.0.0.0/0, ::/0(Optional), only needed if you want to ingest RTMP streams using Ingress service.
                                                                                                                                                                                                    TCP78810.0.0.0/0, ::/0(Optional), only needed if you want to allow WebRTC over TCP.
                                                                                                                                                                                                    UDP78850.0.0.0/0, ::/0(Optional), only needed if you want to ingest WebRTC using WHIP protocol.
                                                                                                                                                                                                    TCP90000.0.0.0/0, ::/0(Optional), only needed if you want to expose MinIO publicly.
                                                                                                                                                                                                    UDP50000 - 600000.0.0.0/0, ::/0WebRTC Media traffic.
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Guided Installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before the installation, ensure that your machine meets the prerequisites and the port rules. Then, execute the following command on the machine where you want to deploy OpenVidu:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the installation process finishes, you will see the following message:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                    ->                                                                             <
                                                                                                                                                                                                    ->  🎉 OpenVidu Community Installation Finished Successfully! 🎉               <
                                                                                                                                                                                                    ->                                                                             <
                                                                                                                                                                                                    -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Configure your Application to use the Deployment#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • URL: The value in .env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Non-interactive installation#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you want to automate the installation process, you can generate a command with all the parameters needed to install OpenVidu by answering the wizard questions. You can do this by running the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    docker run --pull always --rm -it \
                                                                                                                                                                                                    -    openvidu/openvidu-installer:latest \
                                                                                                                                                                                                    -    --deployment-type=single_node
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is going to generate a command like this, but it may vary depending on the answers you provide. Here are three examples of the command you can run depending on the certificate type you choose:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,app' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='letsencrypt' \
                                                                                                                                                                                                    -    --letsencrypt-email='example@example.io'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,app' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='selfsigned' \
                                                                                                                                                                                                    -    --letsencrypt-email='example@example.io'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -# Optional, only if you want to enable TURN with TLS
                                                                                                                                                                                                    -CERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)
                                                                                                                                                                                                    -CERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \
                                                                                                                                                                                                    -    --no-tty --install \
                                                                                                                                                                                                    -    --domain-name='openvidu.example.io' \
                                                                                                                                                                                                    -    --enabled-modules='observability,app' \
                                                                                                                                                                                                    -    --turn-domain-name='turn.example.io' \
                                                                                                                                                                                                    -    --livekit-api-key='xxxxx' \
                                                                                                                                                                                                    -    --livekit-api-secret='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --dashboard-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --redis-password='xxxxx' \
                                                                                                                                                                                                    -    --minio-access-key='xxxxx' \
                                                                                                                                                                                                    -    --minio-secret-key='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --mongo-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --grafana-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-password='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-user='xxxxx' \
                                                                                                                                                                                                    -    --default-app-admin-password='xxxxx' \
                                                                                                                                                                                                    -    --certificate-type='owncert' \
                                                                                                                                                                                                    -    --owncert-private-key="$CERT_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --owncert-public-key="$CERT_PUBLIC_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-private-key="$CERT_TURN_PRIVATE_KEY" \
                                                                                                                                                                                                    -    --turn-owncert-public-key="$CERT_TURN_PUBLIC_KEY"
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can run that command in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Some notes about the command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack) and app (Default App - OpenVidu Call).
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To start OpenVidu, remember to run:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    systemctl start openvidu
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuration and administration#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Single Node deployment.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/advanced-features/index.html b/3.0.0-beta3/docs/tutorials/advanced-features/index.html deleted file mode 100644 index 26df8c93..00000000 --- a/3.0.0-beta3/docs/tutorials/advanced-features/index.html +++ /dev/null @@ -1,3979 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Advanced Features Tutorials - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Advanced Features Tutorials#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Explore more advanced features of LiveKit! For now, we have implemented a basic recording tutorial and an advanced one, but our tutorials for streaming and ingesting are coming soon.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/index.html b/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/index.html deleted file mode 100644 index ea529773..00000000 --- a/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/index.html +++ /dev/null @@ -1,5135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Advanced Recording Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Advanced Recording Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial improves the basic recording tutorial by doing the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Complete recording metadata: Listen to webhook events and save all necessary metadata in a separate file.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Real time recording status notification: Implement a custom notification system to inform participants about the recording status by listening to webhook events and updating room metadata.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Recording deletion notification: Implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Direct access to recording files: Add an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-advanced-node
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm start
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Limitation: Playing recordings with the S3 strategy from other devices in your local network is not possible due to MinIO not being exposed. To play recordings from other devices, you need to change the environment variable RECORDING_PLAYBACK_STRATEGY to PROXY.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Enhancements#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Refactoring backend#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The backend has been refactored to prevent code duplication and improve readability. The main changes are:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Endpoints have been moved to the controllers folder, creating a controller for each set of related endpoints:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • RoomController for the room creation endpoint.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • RecordingController for the recording endpoints.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • WebhookController for the webhook endpoint.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      The index.js file now simply sets the route for each controller:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      21
                                                                                                                                                                                                      -22
                                                                                                                                                                                                      -23
                                                                                                                                                                                                      app.use("/token", roomController);
                                                                                                                                                                                                      -app.use("/recordings", recordingController);
                                                                                                                                                                                                      -app.use("/livekit/webhook", webhookController);
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      The configuration of environment variables and constants has been moved to the config.js file:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      config.js
                                                                                                                                                                                                       1
                                                                                                                                                                                                      - 2
                                                                                                                                                                                                      - 3
                                                                                                                                                                                                      - 4
                                                                                                                                                                                                      - 5
                                                                                                                                                                                                      - 6
                                                                                                                                                                                                      - 7
                                                                                                                                                                                                      - 8
                                                                                                                                                                                                      - 9
                                                                                                                                                                                                      -10
                                                                                                                                                                                                      -11
                                                                                                                                                                                                      -12
                                                                                                                                                                                                      -13
                                                                                                                                                                                                      -14
                                                                                                                                                                                                      -15
                                                                                                                                                                                                      -16
                                                                                                                                                                                                      -17
                                                                                                                                                                                                      -18
                                                                                                                                                                                                      -19
                                                                                                                                                                                                      export const SERVER_PORT = process.env.SERVER_PORT || 6080;
                                                                                                                                                                                                      -export const APP_NAME = "openvidu-recording-advanced-node";
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -// LiveKit configuration
                                                                                                                                                                                                      -export const LIVEKIT_URL = process.env.LIVEKIT_URL || "http://localhost:7880";
                                                                                                                                                                                                      -export const LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || "devkey";
                                                                                                                                                                                                      -export const LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || "secret";
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -// S3 configuration
                                                                                                                                                                                                      -export const S3_ENDPOINT = process.env.S3_ENDPOINT || "http://localhost:9000";
                                                                                                                                                                                                      -export const S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || "minioadmin";
                                                                                                                                                                                                      -export const S3_SECRET_KEY = process.env.S3_SECRET_KEY || "minioadmin";
                                                                                                                                                                                                      -export const AWS_REGION = process.env.AWS_REGION || "us-east-1";
                                                                                                                                                                                                      -export const S3_BUCKET = process.env.S3_BUCKET || "openvidu";
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -export const RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? "recordings/";
                                                                                                                                                                                                      -export const RECORDINGS_METADATA_PATH = ".metadata/";
                                                                                                                                                                                                      -export const RECORDING_PLAYBACK_STRATEGY = process.env.RECORDING_PLAYBACK_STRATEGY || "S3"; // PROXY or S3
                                                                                                                                                                                                      -export const RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // 5MB
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Operations of the EgressClient and functions related to recording management have been moved to the RecordingService class within the services folder.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After refactoring and implementing the improvements, the backend of the application has the following structure:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    src
                                                                                                                                                                                                    -├── controllers
                                                                                                                                                                                                    -│   ├── recording.controller.js
                                                                                                                                                                                                    -│   ├── room.controller.js
                                                                                                                                                                                                    -│   └── webhook.controller.js
                                                                                                                                                                                                    -├── services
                                                                                                                                                                                                    -│   ├── recording.service.js
                                                                                                                                                                                                    -│   ├── room.service.js
                                                                                                                                                                                                    -│   └── s3.service.js
                                                                                                                                                                                                    -├── config.js
                                                                                                                                                                                                    -├── index.js
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Where room.service.js defines the RoomService class, that contains the logic to manage rooms using the RoomServiceClient.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding room metadata#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to store the recording status in the room metadata, we have to create the room explicitly the first time a user joins it, setting the metadata field with an object that contains the recording status. This object also contains the app name, which is used to identify webhook events related to the application. This is done in the POST /token endpoint:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    room.controller.js
                                                                                                                                                                                                    10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    roomController.post("/", async (req, res) => {
                                                                                                                                                                                                    -    const roomName = req.body.roomName;
                                                                                                                                                                                                    -    const participantName = req.body.participantName;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!roomName || !participantName) {
                                                                                                                                                                                                    -        res.status(400).json({ errorMessage: "roomName and participantName are required" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {
                                                                                                                                                                                                    -        identity: participantName
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -    at.addGrant({ room: roomName, roomJoin: true, roomRecord: true });
                                                                                                                                                                                                    -    const token = await at.toJwt();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Create room if it doesn't exist
                                                                                                                                                                                                    -        const exists = await roomService.exists(roomName); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (!exists) {
                                                                                                                                                                                                    -            await roomService.createRoom(roomName); // (2)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        res.json({ token });
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error creating room.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error creating room" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Check if the room exists.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create the room if it doesn't exist.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After generating the access token with the required permissions, this endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Checks if the room exists by calling the exists method of the RoomService with the roomName as a parameter. This method returns a boolean indicating whether the room obtained from the getRoom method is not null. This other method lists all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter, and returns the first element of the list if it exists:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      30
                                                                                                                                                                                                      -31
                                                                                                                                                                                                      -32
                                                                                                                                                                                                      -33
                                                                                                                                                                                                      -34
                                                                                                                                                                                                      -35
                                                                                                                                                                                                      -36
                                                                                                                                                                                                      -37
                                                                                                                                                                                                      -38
                                                                                                                                                                                                      async getRoom(roomName) {
                                                                                                                                                                                                      -    const rooms = await this.roomClient.listRooms([roomName]); // (1)!
                                                                                                                                                                                                      -    return rooms.length > 0 ? rooms[0] : null; // (2)!
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -async exists(roomName) {
                                                                                                                                                                                                      -    const room = await this.getRoom(roomName);
                                                                                                                                                                                                      -    return room !== null;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. List all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Return the first element of the list if it exists.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Creates the room if it doesn't exist by calling the createRoom method of the RoomService with the roomName as a parameter. This method creates a room with the roomName and sets the metadata field with an object that contains the app name (defined in the config.js file) and the recording status initialized to STOPPED. To achieve this, the method calls the createRoom method of the RoomServiceClient with an object indicating the room name and metadata:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      19
                                                                                                                                                                                                      -20
                                                                                                                                                                                                      -21
                                                                                                                                                                                                      -22
                                                                                                                                                                                                      -23
                                                                                                                                                                                                      -24
                                                                                                                                                                                                      -25
                                                                                                                                                                                                      -26
                                                                                                                                                                                                      -27
                                                                                                                                                                                                      -28
                                                                                                                                                                                                      async createRoom(roomName) {
                                                                                                                                                                                                      -    const roomOptions = {
                                                                                                                                                                                                      -        name: roomName,
                                                                                                                                                                                                      -        metadata: JSON.stringify({
                                                                                                                                                                                                      -            createdBy: APP_NAME, // (1)!
                                                                                                                                                                                                      -            recordingStatus: "STOPPED" // (2)!
                                                                                                                                                                                                      -        })
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -    return this.roomClient.createRoom(roomOptions); // (3)!
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Set the app name.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Set the recording status to STOPPED.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Create the room with the roomOptions object by calling the createRoom method of the RoomServiceClient.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Handling webhook events#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In previous tutorials, we listened to all webhook events and printed them in the console without doing anything else. In this tutorial, we have to first check if the webhook is related to the application and then act accordingly depending on the event type. This is done in the POST /livekit/webhook endpoint:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    webhookController.post("/", async (req, res) => {
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        const webhookEvent = await webhookReceiver.receive(req.body, req.get("Authorization"));
                                                                                                                                                                                                    -        const isWebhookRelatedToMe = await checkWebhookRelatedToMe(webhookEvent); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (isWebhookRelatedToMe) {
                                                                                                                                                                                                    -            console.log(webhookEvent);
                                                                                                                                                                                                    -            const { event: eventType, egressInfo } = webhookEvent; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            switch (eventType) {
                                                                                                                                                                                                    -                case "egress_started": // (3)!
                                                                                                                                                                                                    -                case "egress_updated":
                                                                                                                                                                                                    -                    await notifyRecordingStatusUpdate(egressInfo);
                                                                                                                                                                                                    -                    break;
                                                                                                                                                                                                    -                case "egress_ended": // (4)!
                                                                                                                                                                                                    -                    await handleEgressEnded(egressInfo);
                                                                                                                                                                                                    -                    break;
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error validating webhook event.", error);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    res.status(200).send();
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Check if the webhook is related to the application.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Destructure the event type and egress info from the webhook event.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. If the event type is egress_started or egress_updated, notify the recording status update.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. If the event type is egress_ended, handle the egress ended.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After receiving the webhook event, this endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Checks if the webhook is related to the application by calling the checkWebhookRelatedToMe function with the webhook event as a parameter. This function returns a boolean indicating whether the app name obtained from the metadata field of the room related to the webhook event is equal to the app name defined in the config.js file:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      40
                                                                                                                                                                                                      -41
                                                                                                                                                                                                      -42
                                                                                                                                                                                                      -43
                                                                                                                                                                                                      -44
                                                                                                                                                                                                      -45
                                                                                                                                                                                                      -46
                                                                                                                                                                                                      -47
                                                                                                                                                                                                      -48
                                                                                                                                                                                                      -49
                                                                                                                                                                                                      -50
                                                                                                                                                                                                      -51
                                                                                                                                                                                                      -52
                                                                                                                                                                                                      -53
                                                                                                                                                                                                      -54
                                                                                                                                                                                                      -55
                                                                                                                                                                                                      const checkWebhookRelatedToMe = async (webhookEvent) => {
                                                                                                                                                                                                      -    const { room, egressInfo, ingressInfo } = webhookEvent; // (1)!
                                                                                                                                                                                                      -    let roomInfo = room;
                                                                                                                                                                                                      -    // (2)!
                                                                                                                                                                                                      -    if (!room || !room.metadata) {
                                                                                                                                                                                                      -        const roomName = room?.name ?? egressInfo?.roomName ?? ingressInfo?.roomName; // (3)!
                                                                                                                                                                                                      -        roomInfo = await roomService.getRoom(roomName); // (4)!
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -        if (!roomInfo) {
                                                                                                                                                                                                      -            return false;
                                                                                                                                                                                                      -        }
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const metadata = roomInfo.metadata ? JSON.parse(roomInfo.metadata) : null; // (5)!
                                                                                                                                                                                                      -    return metadata?.createdBy === APP_NAME; // (6)!
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Destructure the room, egress info, and ingress info from the webhook event.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Check if the room and metadata fields exist.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. If the room or metadata fields don't exist, get the room name from the room, egress info, or ingress info.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Get the room info by calling the getRoom method of the RoomService with the roomName as a parameter.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Parse the metadata field of the room info.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      11. Return whether the app name is equal to the app name defined in the config.js file.
                                                                                                                                                                                                      12. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Destructures the event type and egress info from the webhook event.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      If the event type is egress_started or egress_updated, calls the notifyRecordingStatusUpdate function with the egress info as a parameter. This function notifies all participants in the room related to the egress info about the recording status update. See the Notifying recording status update section for more information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      If the event type is egress_ended, calls the handleEgressEnded function with the egress info as a parameter. This function saves the recording metadata in a separate file (see the Saving recording metadata section) and notifies all participants in the room related to the egress info that the recording has been stopped:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      57
                                                                                                                                                                                                      -58
                                                                                                                                                                                                      -59
                                                                                                                                                                                                      -60
                                                                                                                                                                                                      -61
                                                                                                                                                                                                      -62
                                                                                                                                                                                                      -63
                                                                                                                                                                                                      -64
                                                                                                                                                                                                      -65
                                                                                                                                                                                                      const handleEgressEnded = async (egressInfo) => {
                                                                                                                                                                                                      -    try {
                                                                                                                                                                                                      -        await recordingService.saveRecordingMetadata(egressInfo); // (1)!
                                                                                                                                                                                                      -    } catch (error) {
                                                                                                                                                                                                      -        console.error("Error saving recording metadata.", error);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    await notifyRecordingStatusUpdate(egressInfo); // (2)!
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Save the recording metadata.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Notify all participants in the room that the recording has been stopped.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notifying recording status update#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the recording status changes, all participants in the room have to be notified. This is done by updating the metadata field of the room with the new recording status, which will trigger the RoomEvent.RoomMetadataChanged event in the client side. This is implemented in the notifyRecordingStatusUpdate function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    const notifyRecordingStatusUpdate = async (egressInfo) => {
                                                                                                                                                                                                    -    const roomName = egressInfo.roomName; // (1)!
                                                                                                                                                                                                    -    const recordingStatus = recordingService.getRecordingStatus(egressInfo.status); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        await roomService.updateRoomMetadata(roomName, recordingStatus); // (3)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error updating room metadata.", error);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Get the room name from the egress info.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Get the recording status from the egress info status.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Update the room metadata with the new recording status.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After getting the room name from the egress info, this function does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Gets the recording status by calling the getRecordingStatus method of the RecordingService with the egress info status as a parameter. This method returns the recording status based on the egress info status:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getRecordingStatus(egressStatus) {
                                                                                                                                                                                                      -    switch (egressStatus) {
                                                                                                                                                                                                      -        case EgressStatus.EGRESS_STARTING:
                                                                                                                                                                                                      -            return "STARTING";
                                                                                                                                                                                                      -        case EgressStatus.EGRESS_ACTIVE:
                                                                                                                                                                                                      -            return "STARTED";
                                                                                                                                                                                                      -        case EgressStatus.EGRESS_ENDING:
                                                                                                                                                                                                      -            return "STOPPING";
                                                                                                                                                                                                      -        case EgressStatus.EGRESS_COMPLETE:
                                                                                                                                                                                                      -            return "STOPPED";
                                                                                                                                                                                                      -        default:
                                                                                                                                                                                                      -            return "FAILED";
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      We distinguish between the following recording statuses:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • STARTING: The recording is starting.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • STARTED: The recording is active.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • STOPPING: The recording is stopping.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • STOPPED: The recording has stopped.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • FAILED: The recording has failed.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Updates the room metadata with the new recording status by calling the updateRoomMetadata method of the RoomService with the roomName and recordingStatus as parameters. This method updates the metadata field of the room with an object that contains the app name and the new recording status by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      40
                                                                                                                                                                                                      -41
                                                                                                                                                                                                      -42
                                                                                                                                                                                                      -43
                                                                                                                                                                                                      -44
                                                                                                                                                                                                      -45
                                                                                                                                                                                                      -46
                                                                                                                                                                                                      async updateRoomMetadata(roomName, recordingStatus) {
                                                                                                                                                                                                      -    const metadata = {
                                                                                                                                                                                                      -        createdBy: APP_NAME,
                                                                                                                                                                                                      -        recordingStatus // (1)!
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -    return this.roomClient.updateRoomMetadata(roomName, JSON.stringify(metadata)); // (2)!
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Update the recording status.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Update the room metadata with the new metadata by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Saving recording metadata#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the recording ends, the metadata related to the recording has to be saved in a separate file. This is done in the saveRecordingMetadata function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    recording.service.js
                                                                                                                                                                                                    async saveRecordingMetadata(egressInfo) {
                                                                                                                                                                                                    -    const recordingInfo = this.convertToRecordingInfo(egressInfo); // (1)!
                                                                                                                                                                                                    -    const key = this.getMetadataKey(recordingInfo.name); // (2)!
                                                                                                                                                                                                    -    await s3Service.uploadObject(key, recordingInfo); // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Convert the egress info to a recording info object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Get the metadata key from the recording info name.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Upload the recording metadata to the S3 bucket.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Converts the egress info to a recording info object by calling the convertToRecordingInfo method:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      convertToRecordingInfo(egressInfo) {
                                                                                                                                                                                                      -    const file = egressInfo.fileResults[0];
                                                                                                                                                                                                      -    return {
                                                                                                                                                                                                      -        id: egressInfo.egressId,
                                                                                                                                                                                                      -        name: file.filename.split("/").pop(),
                                                                                                                                                                                                      -        roomName: egressInfo.roomName,
                                                                                                                                                                                                      -        roomId: egressInfo.roomId,
                                                                                                                                                                                                      -        startedAt: Number(egressInfo.startedAt) / 1_000_000,
                                                                                                                                                                                                      -        duration: Number(file.duration) / 1_000_000_000,
                                                                                                                                                                                                      -        size: Number(file.size)
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Getting recording metadata

                                                                                                                                                                                                      -

                                                                                                                                                                                                      In this tutorial, we can access detailed information about the recording directly from the metadata file stored in the S3 bucket, without needing to make additional requests. This is made possible by saving all the necessary data retrieved from the egress info object. Compared to the basic recording tutorial, we are now storing additional details such as the recording name, duration and size.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Gets the metadata key from the recordings path and the recordings metadata path, both defined in the config.js file, and the recording name replacing the .mp4 extension with .json:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getMetadataKey(recordingName) {
                                                                                                                                                                                                      -    return RECORDINGS_PATH + RECORDINGS_METADATA_PATH + recordingName.replace(".mp4", ".json");
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Uploads the recording metadata to the S3 bucket by calling the uploadObject method of the S3Service with the key and recordingInfo as parameters. This method uploads an object to the S3 bucket by sending a PutObjectCommand with the key and the stringified object as parameters:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      34
                                                                                                                                                                                                      -35
                                                                                                                                                                                                      -36
                                                                                                                                                                                                      -37
                                                                                                                                                                                                      -38
                                                                                                                                                                                                      -39
                                                                                                                                                                                                      -40
                                                                                                                                                                                                      -41
                                                                                                                                                                                                      -42
                                                                                                                                                                                                      async uploadObject(key, body) {
                                                                                                                                                                                                      -    const params = {
                                                                                                                                                                                                      -        Bucket: S3_BUCKET,
                                                                                                                                                                                                      -        Key: key,
                                                                                                                                                                                                      -        Body: JSON.stringify(body)
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -    const command = new PutObjectCommand(params);
                                                                                                                                                                                                      -    return this.run(command);
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Notifying recording deletion#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When a recording is deleted, all participants in the room have to be notified. This is done by sending a data message to all participants in the room. To achieve this, the DELETE /recordings/:recordingName endpoint has been modified as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.delete("/:recordingName", async (req, res) => {
                                                                                                                                                                                                    -    const { recordingName } = req.params;
                                                                                                                                                                                                    -    const exists = await recordingService.existsRecording(recordingName);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!exists) {
                                                                                                                                                                                                    -        res.status(404).json({ errorMessage: "Recording not found" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        const { roomName } = await recordingService.getRecordingMetadata(recordingName); // (1)!
                                                                                                                                                                                                    -        await recordingService.deleteRecording(recordingName);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Notify to all participants that the recording was deleted
                                                                                                                                                                                                    -        const existsRoom = await roomService.exists(roomName); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (existsRoom) {
                                                                                                                                                                                                    -            await roomService.sendDataToRoom(roomName, { recordingName }); // (3)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        res.json({ message: "Recording deleted" });
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error deleting recording.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error deleting recording" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Get the room name from the recording metadata.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Check if the room exists.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Send a data message to the room indicating that the recording was deleted.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before deleting the recording, we get the room name from the recording metadata. After deleting the recording, we check if the room exists and, if it does, send a data message to the room indicating that the recording was deleted. This is done by calling the sendDataToRoom method of the RoomService with the roomName and an object containing the recordingName as parameters:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    room.service.js
                                                                                                                                                                                                    48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    async sendDataToRoom(roomName, rawData) {
                                                                                                                                                                                                    -    const data = encoder.encode(JSON.stringify(rawData)); // (1)!
                                                                                                                                                                                                    -    const options = {
                                                                                                                                                                                                    -        topic: "RECORDING_DELETED", // (2)!
                                                                                                                                                                                                    -        destinationSids: [] // (3)!
                                                                                                                                                                                                    -    };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        await this.roomClient.sendData(roomName, data, DataPacket_Kind.RELIABLE, options); // (4)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error sending data to room", error);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Encodes the raw data.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Sets the topic to RECORDING_DELETED.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Sets the destination SIDs to an empty array (all participants in the room).
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Encodes the raw data by calling the encode method of the TextEncoder with the stringified raw data as a parameter.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Sets the topic of the data message to RECORDING_DELETED.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Sets the destination SIDs to an empty array, which means that the message will be sent to all participants in the room.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters. The DataPacket_Kind.RELIABLE parameter indicates that the message will be sent reliably.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing recording files directly from the S3 bucket#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this tutorial, we have added an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL. To accomplish this, we have created a new endpoint (GET /recordings/:recordingName/url) to get the recording URL depending on the playback strategy defined in the environment variable RECORDING_PLAYBACK_STRATEGY, whose value can be PROXY or S3:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.get("/:recordingName/url", async (req, res) => {
                                                                                                                                                                                                    -    const { recordingName } = req.params;
                                                                                                                                                                                                    -    const exists = await recordingService.existsRecording(recordingName); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!exists) {
                                                                                                                                                                                                    -        res.status(404).json({ errorMessage: "Recording not found" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If the recording playback strategy is "PROXY", return the endpoint URL
                                                                                                                                                                                                    -    if (RECORDING_PLAYBACK_STRATEGY === "PROXY") {
                                                                                                                                                                                                    -        res.json({ recordingUrl: `/recordings/${recordingName}` }); // (2)!
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // If the recording playback strategy is "S3", return a signed URL to access the recording directly from S3
                                                                                                                                                                                                    -        const recordingUrl = await recordingService.getRecordingUrl(recordingName); // (3)!
                                                                                                                                                                                                    -        res.json({ recordingUrl });
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error getting recording URL.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error getting recording URL" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Check if the recording exists.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Return the GET /recordings/:recordingName endpoint URL if the playback strategy is PROXY.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Create a presigned URL to access the recording directly from the S3 bucket if the playback strategy is S3.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Checks if the recording exists. If it does not exist, it returns a 404 error.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. If the playback strategy is PROXY, it returns the GET /recordings/:recordingName endpoint URL to get the recording file from the backend.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      If the playback strategy is S3, it creates a presigned URL to access the recording directly from the S3 bucket by calling the getRecordingUrl method of the RecordingService with the recordingName as a parameter. This method simply calls the getObjectUrl method of the S3Service with the key of the recording as a parameter:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      78
                                                                                                                                                                                                      -79
                                                                                                                                                                                                      -80
                                                                                                                                                                                                      -81
                                                                                                                                                                                                      -82
                                                                                                                                                                                                      -83
                                                                                                                                                                                                      -84
                                                                                                                                                                                                      -85
                                                                                                                                                                                                      async getObjectUrl(key) {
                                                                                                                                                                                                      -    const params = {
                                                                                                                                                                                                      -        Bucket: S3_BUCKET,
                                                                                                                                                                                                      -        Key: key
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -    const command = new GetObjectCommand(params);
                                                                                                                                                                                                      -    return getSignedUrl(this.s3Client, command, { expiresIn: 86400 }); // 24 hours
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This method creates a presigned URL to access the object in the S3 bucket by calling the getSignedUrl function from the @aws-sdk/s3-request-presigner package, indicating the S3Client, GetObjectCommand and the expiration time in seconds as parameters. In this case, the expiration time is set to 24 hours.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Presigned URLs

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Presigned URLs are URLs that provide access to an S3 object for a limited time. This is useful when you want to share an object with someone for a limited time without providing them with your AWS credentials.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Compared to the proxy strategy, accessing recording files directly from the S3 bucket via presigned URLs is more efficient, as it reduces server load. However, it presents a security risk, as the URL, once generated, can be used by anyone until it expires.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Handling new room events in the client side#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the client side, we have to handle the new room events related to the recording status and the recording deletion. This is done by listening to the RoomEvent.RoomMetadataChanged and RoomEvent.DataReceived events in the joinRoom method:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -    // When recording status changes...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.RoomMetadataChanged, async (metadata) => {
                                                                                                                                                                                                    -        const { recordingStatus } = JSON.parse(metadata);
                                                                                                                                                                                                    -        await updateRecordingInfo(recordingStatus);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // When a message is received...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.DataReceived, async (payload, _participant, _kind, topic) => {
                                                                                                                                                                                                    -        // If the message is a recording deletion notification, remove the recording from the list
                                                                                                                                                                                                    -        if (topic === "RECORDING_DELETED") {
                                                                                                                                                                                                    -            const { recordingName } = JSON.parse(new TextDecoder().decode(payload));
                                                                                                                                                                                                    -            deleteRecordingContainer(recordingName);
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When a new RoomEvent.RoomMetadataChanged event is received, we parse the metadata to get the recording status and update the recording info accordingly. The updateRecordingInfo function has been updated to handle the new recording statuses.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In addition to handling this event, we need to update the recording info in the UI the first time a user joins the room. Once the user has joined, we retrieve the current room metadata and update the UI accordingly. Recordings will be listed unless the recording status is STOPPED or FAILED, to prevent listing recordings twice:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    -89
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -    // Update recording info
                                                                                                                                                                                                    -    const { recordingStatus } = JSON.parse(room.metadata);
                                                                                                                                                                                                    -    await updateRecordingInfo(recordingStatus);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (recordingStatus !== "STOPPED" && recordingStatus !== "FAILED") {
                                                                                                                                                                                                    -        const roomId = await room.getSid();
                                                                                                                                                                                                    -        await listRecordings(room.name, roomId);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When a new RoomEvent.DataReceived event is received, we check if the topic of the message is RECORDING_DELETED. If it is, we decode the payload using a TextDecoder and parse the message to get the recording name. Then, we remove the recording from the list by calling the deleteRecordingContainer function.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/index.html b/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/index.html deleted file mode 100644 index 59169458..00000000 --- a/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/index.html +++ /dev/null @@ -1,5520 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Basic Recording Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Basic Recording Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application, built upon Node.js server and JavaScript client tutorials, and extends them by adding recording capabilities:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Start and stop recording a room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • List all recordings in a room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Play a recording.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Delete a recording.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • List all available recordings and filter them by room name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-basic-node
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm start
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This application consists of two essential backend files under the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • index.js: This file holds the server application and defines the REST API endpoints.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • s3.service.js: This file encapsulates the operations to interact with the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    And the following essential frontend files under the public directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • index.html: This is the client application's main HTML file.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.js: This is the main JavaScript file that interacts with the server application and handles the client application's logic and functionality.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • style.css: This file contains the client application's styling.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • recordings.html: This file defines the HTML for the general recording page.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Backend#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The server application extends the Node.js server tutorial by adding the following REST API endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • POST /recordings/start: Starts the recording of a room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • POST /recordings/stop: Stops the recording of a room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • GET /recordings: Lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • GET /recordings/:recordingName: Retrieves a recording from the S3 bucket and returns it as a stream.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • DELETE /recordings/:recordingName: This endpoint deletes a recording from the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before we dive into the code of each endpoint, let's first see the changes introduced in the index.js file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                     9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    const SERVER_PORT = process.env.SERVER_PORT || 6080;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// LiveKit configuration
                                                                                                                                                                                                    -const LIVEKIT_URL = process.env.LIVEKIT_URL || "http://localhost:7880"; // (1)!
                                                                                                                                                                                                    -const LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || "devkey";
                                                                                                                                                                                                    -const LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || "secret";
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? "recordings/"; // (2)!
                                                                                                                                                                                                    -const RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const app = express();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -app.use(cors());
                                                                                                                                                                                                    -app.use(express.json());
                                                                                                                                                                                                    -app.use(express.raw({ type: "application/webhook+json" }));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// Set the static files location
                                                                                                                                                                                                    -const __filename = fileURLToPath(import.meta.url);
                                                                                                                                                                                                    -const __dirname = path.dirname(__filename);
                                                                                                                                                                                                    -app.use(express.static(path.join(__dirname, "../public"))); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The URL of the LiveKit server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The portion size of the recording that will be sent to the client in each request. This value is set to 5 MB.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Set the public directory as the static files location.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    There are three new environment variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • RECORDINGS_PATH: The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • RECORDING_FILE_PORTION_SIZE: The portion size of the recording that will be sent to the client in each request.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Besides, the index.js file configures the server to serve static files from the public directory.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    It also initializes the EgressClient, which will help interacting with Egress API to manage recordings, and the S3Service, which will help interacting with the S3 bucket:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const egressClient = new EgressClient(LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
                                                                                                                                                                                                    -const s3Service = new S3Service();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The POST /token endpoint has been modified to add the roomRecord permission to the access token, so that participants can start recording a room:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    app.post("/token", async (req, res) => {
                                                                                                                                                                                                    -    const roomName = req.body.roomName;
                                                                                                                                                                                                    -    const participantName = req.body.participantName;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!roomName || !participantName) {
                                                                                                                                                                                                    -        res.status(400).json({ errorMessage: "roomName and participantName are required" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {
                                                                                                                                                                                                    -        identity: participantName
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -    at.addGrant({ roomJoin: true, room: roomName, roomRecord: true }); // (1)!
                                                                                                                                                                                                    -    const token = await at.toJwt();
                                                                                                                                                                                                    -    res.json({ token });
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Add the roomRecord permission to the access token.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's explore the code for each recording feature:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Start recording#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The POST /recordings/start endpoint starts the recording of a room. It receives the room name of the room to record as parameter and returns the recording metadata:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    -89
                                                                                                                                                                                                    -90
                                                                                                                                                                                                    -91
                                                                                                                                                                                                    -92
                                                                                                                                                                                                    -93
                                                                                                                                                                                                    -94
                                                                                                                                                                                                    -95
                                                                                                                                                                                                    -96
                                                                                                                                                                                                    -97
                                                                                                                                                                                                    app.post("/recordings/start", async (req, res) => {
                                                                                                                                                                                                    -    const { roomName } = req.body;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!roomName) {
                                                                                                                                                                                                    -        res.status(400).json({ errorMessage: "roomName is required" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Check if there is already an active recording for this room
                                                                                                                                                                                                    -    if (activeRecording) {
                                                                                                                                                                                                    -        res.status(409).json({ errorMessage: "Recording already started for this room" }); // (2)!
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Use the EncodedFileOutput to save the recording to an MP4 file
                                                                                                                                                                                                    -    // (3)!
                                                                                                                                                                                                    -    const fileOutput = new EncodedFileOutput({
                                                                                                                                                                                                    -        fileType: EncodedFileType.MP4, // (4)!
                                                                                                                                                                                                    -        filepath: `${RECORDINGS_PATH}{room_name}-{room_id}-{time}` // (5)!
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Start a RoomCompositeEgress to record all participants in the room
                                                                                                                                                                                                    -        const egressInfo = await egressClient.startRoomCompositeEgress(roomName, { file: fileOutput }); // (6)!
                                                                                                                                                                                                    -        const recording = {
                                                                                                                                                                                                    -            name: egressInfo.fileResults[0].filename.split("/").pop(), // (7)!
                                                                                                                                                                                                    -            startedAt: Number(egressInfo.startedAt) / 1_000_000
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        res.json({ message: "Recording started", recording }); // (8)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error starting recording.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error starting recording" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. If there is already an active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Use the EncodedFileOutput class to export the recording to an external file.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Define the file type as MP4.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Define the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID and timestamp, respectively. Check out all available filename templates.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Start a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with the roomName and fileOutput as parameters.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Extract the recording name from the fileResults array.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Return the recording metadata to the client.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Check if there is already an active recording for the room. If there is, it returns a 409 error to prevent starting a new recording. To accomplish this, we use the getActiveRecordingByRoom function, which lists all active egresses for a specified room by calling the listEgress method of the EgressClient with the roomName and active parameters, and then returns the egress ID of the first active egress found:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getActiveRecordingByRoom = async (roomName) => {
                                                                                                                                                                                                      -    try {
                                                                                                                                                                                                      -        // List all active egresses for the room
                                                                                                                                                                                                      -        const egresses = await egressClient.listEgress({ roomName, active: true });
                                                                                                                                                                                                      -        return egresses.length > 0 ? egresses[0].egressId : null;
                                                                                                                                                                                                      -    } catch (error) {
                                                                                                                                                                                                      -        console.error("Error listing egresses.", error);
                                                                                                                                                                                                      -        return null;
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Initializes an EncodedFileOutput object to export the recording to an external file. It sets the file type as MP4 and defines the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID, and timestamp, respectively. Check out all available filename templates.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Saving recording metadata

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The EncodedFileOutput class allows you to save the recording metadata to an external file. If you don't explicitly set the disableManifest property to true, the metadata will be saved in the same folder and with the same name as the recording file, but with a .json extension. This metadata file will contain information such as the egress ID, the recording start time, and the name and ID of the room recorded.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      This information may be insufficient depending on your requirements (e.g., you can't get the recording duration). If this is the case, you can follow the steps described in the advanced recording tutorial, where we show how to save all necessary metadata in a separate file listening to webhook events.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Starts a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with roomName and fileOutput as parameters.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Extracts the recording name from the fileResults array.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Returns the recording metadata to the client.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Stop recording#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The POST /recordings/stop endpoint stops the recording of a room. It receives the room name of the room to stop recording as a parameter and returns the updated recording metadata:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post("/recordings/stop", async (req, res) => {
                                                                                                                                                                                                    -    const { roomName } = req.body;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!roomName) {
                                                                                                                                                                                                    -        res.status(400).json({ errorMessage: "roomName is required" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Check if there is an active recording for this room
                                                                                                                                                                                                    -    if (!activeRecording) {
                                                                                                                                                                                                    -        res.status(409).json({ errorMessage: "Recording not started for this room" }); // (2)!
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Stop the egress to finish the recording
                                                                                                                                                                                                    -        const egressInfo = await egressClient.stopEgress(activeRecording); // (3)!
                                                                                                                                                                                                    -        const file = egressInfo.fileResults[0];
                                                                                                                                                                                                    -        const recording = {
                                                                                                                                                                                                    -            name: file.filename.split("/").pop(),
                                                                                                                                                                                                    -            startedAt: Number(egressInfo.startedAt) / 1_000_000,
                                                                                                                                                                                                    -            size: Number(file.size)
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        res.json({ message: "Recording stopped", recording }); // (4)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error stopping recording.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error stopping recording" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. If there is no active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Stop the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Return the updated recording metadata to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Retrieves all active egresses for the room. If there is no active egress for the room, it returns a 409 error to prevent stopping a non-existent recording.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Extracts the egressId from the active egress.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Stops the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Returns the updated recording metadata to the client.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    List recordings#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The GET /recordings endpoint lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get("/recordings", async (req, res) => {
                                                                                                                                                                                                    -    const roomName = req.query.roomName?.toString();
                                                                                                                                                                                                    -    const roomId = req.query.roomId?.toString();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        const keyStart = RECORDINGS_PATH + (roomName ? `${roomName}-` + (roomId ? roomId : "") : ""); // (1)!
                                                                                                                                                                                                    -        const keyEnd = ".mp4.json";
                                                                                                                                                                                                    -        const regex = new RegExp(`^${keyStart}.*${keyEnd}$`); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // List all egress metadata files in the recordings path that match the regex
                                                                                                                                                                                                    -        const payloadKeys = await s3Service.listObjects(RECORDINGS_PATH, regex); // (3)!
                                                                                                                                                                                                    -        const recordings = await Promise.all(payloadKeys.map((payloadKey) => getRecordingInfo(payloadKey))); // (4)!
                                                                                                                                                                                                    -        const sortedRecordings = filterAndSortRecordings(recordings, roomName, roomId); // (5)!
                                                                                                                                                                                                    -        res.json({ recordings: sortedRecordings }); // (6)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error listing recordings.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error listing recordings" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Define the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a regex pattern with the start and end of the key.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. List all Egress metadata files in the recordings path in the S3 bucket that match the regex.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Retrieve the recording metadata for each recording that matches the regex.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Filter the recordings by room name and room ID and sort them by start time.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Return the list of recordings to the client.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Extracts the roomName and roomId query parameters from the request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Defines the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Creates a regex pattern with the start and end of the key.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Lists all Egress metadata files in the recordings path in the S3 bucket that match the regex. To accomplish this, we use the listObjects method of the S3Service with the RECORDINGS_PATH and regex as parameters.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Retrieves the recording metadata for each recording that matches the regex. To accomplish this, we use the getRecordingInfo function, which retrieves the egress metadata file as JSON and the recording file size by calling the getObjectAsJson and getObjectSize methods of the S3Service, respectively. It then extracts the recording name from the recording key and returns the recording metadata:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingInfo = async (payloadKey) => {
                                                                                                                                                                                                      -    // Get the egress metadata file as JSON
                                                                                                                                                                                                      -    const data = await s3Service.getObjectAsJson(payloadKey); // (1)!
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    // Get the recording file size
                                                                                                                                                                                                      -    const recordingKey = payloadKey.replace(".json", "");
                                                                                                                                                                                                      -    const size = await s3Service.getObjectSize(recordingKey); // (2)!
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const recordingName = recordingKey.split("/").pop();
                                                                                                                                                                                                      -    const recording = {
                                                                                                                                                                                                      -        id: data.egress_id,
                                                                                                                                                                                                      -        name: recordingName,
                                                                                                                                                                                                      -        roomName: data.room_name,
                                                                                                                                                                                                      -        roomId: data.room_id,
                                                                                                                                                                                                      -        startedAt: Number(data.started_at) / 1000000,
                                                                                                                                                                                                      -        size: size
                                                                                                                                                                                                      -    };
                                                                                                                                                                                                      -    return recording;
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Get the egress metadata file as JSON.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Get the recording file size.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. -

                                                                                                                                                                                                      Filter the recordings by room name and room ID and sort them by start time. To accomplish this, we use the filterAndSortRecordings function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const filterAndSortRecordings = (recordings, roomName, roomId) => {
                                                                                                                                                                                                      -    let filteredRecordings = recordings;
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (roomName || roomId) {
                                                                                                                                                                                                      -        filteredRecordings = recordings.filter((recording) => {
                                                                                                                                                                                                      -            return (!roomName || recording.roomName === roomName) && (!roomId || recording.roomId === roomId); // (1)!
                                                                                                                                                                                                      -        });
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    return filteredRecordings.sort((a, b) => b.startedAt - a.startedAt); // (2)!
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Filter the recordings by room name and room ID if they are provided.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Sort the recordings by start time in descending order.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. -

                                                                                                                                                                                                      Returns the list of recordings to the client.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Get recording#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The GET /recordings/:recordingName endpoint retrieves a specific portion of a recording from the S3 bucket and returns it as a stream. The server sends the recording file in portions of 5 MB each time the client requests a range of the recording file. This is done to prevent loading the entire recording file into memory and to allow the client to play the recording while it is being downloaded and seek to a specific time:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get("/recordings/:recordingName", async (req, res) => {
                                                                                                                                                                                                    -    const { recordingName } = req.params;
                                                                                                                                                                                                    -    const { range } = req.headers;
                                                                                                                                                                                                    -    const key = RECORDINGS_PATH + recordingName;
                                                                                                                                                                                                    -    const exists = await s3Service.exists(key); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!exists) {
                                                                                                                                                                                                    -        res.status(404).json({ errorMessage: "Recording not found" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the recording file from S3
                                                                                                                                                                                                    -        const { stream, size, start, end } = await getRecordingStream(recordingName, range); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Set the response headers
                                                                                                                                                                                                    -        res.status(206); // (3)!
                                                                                                                                                                                                    -        res.setHeader("Cache-Control", "no-cache"); // (4)!
                                                                                                                                                                                                    -        res.setHeader("Content-Type", "video/mp4"); // (5)!
                                                                                                                                                                                                    -        res.setHeader("Accept-Ranges", "bytes"); // (6)!
                                                                                                                                                                                                    -        res.setHeader("Content-Range", `bytes ${start}-${end}/${size}`); // (7)!
                                                                                                                                                                                                    -        res.setHeader("Content-Length", end - start + 1); // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Pipe the recording file to the response
                                                                                                                                                                                                    -        body.pipe(res).on("finish", () => res.end()); // (9)!
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error getting recording.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error getting recording" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Get the recording file from the S3 bucket.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Set the response status code to 206 Partial Content.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Set the Cache-Control header as no-cache.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Set the Content-Type header as video/mp4.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Set the Accept-Ranges header as bytes.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Set the Content-Range header with the start and end of the recording file and its size.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Set the Content-Length header as the size of the recording file portion.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Pipe the recording file to the response.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Gets the requested range of the recording file by calling the getRecordingStream function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingStream = async (recordingName, range) => {
                                                                                                                                                                                                      -    const key = RECORDINGS_PATH + recordingName;
                                                                                                                                                                                                      -    const size = await s3Service.getObjectSize(key); // (1)!
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    // Get the requested range
                                                                                                                                                                                                      -    const parts = range?.replace(/bytes=/, "").split("-");
                                                                                                                                                                                                      -    const start = range ? parseInt(parts[0], 10) : 0; // (2)!
                                                                                                                                                                                                      -    const endRange = parts[1] ? parseInt(parts[1], 10) : start + RECORDING_FILE_PORTION_SIZE; // (3)!
                                                                                                                                                                                                      -    const end = Math.min(endRange, size - 1); // (4)!
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const stream = await s3Service.getObject(key, { start, end }); // (5)!
                                                                                                                                                                                                      -    return { stream, size, start, end };
                                                                                                                                                                                                      -};
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Get the size of the recording file.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Get the start of the requested range.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Get the end of the requested range or set it to the start plus the established portion size.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Get the minimum between the end of the requested range and the size of the recording file minus one.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Get the recording file from the S3 bucket with the requested range.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function does the following:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Gets the size of the recording file by calling the getObjectSize method of the S3Service with the key as a parameter.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Extracts the start of the requested range from the range header.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Extracts the end of the requested range from the range header. If the end is not provided, it sets the end to the start plus the established portion size.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Gets the minimum between the end of the requested range and the size of the recording file minus one. This is done to prevent requesting a range that exceeds the recording file size.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Gets the recording file from the S3 bucket with the requested range by calling the getObject method of the S3Service with the key and range as parameters.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Sets the response headers:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • Cache-Control: no-cache.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Content-Type: video/mp4.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Accept-Ranges: bytes.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Content-Range: The start and end of the recording file and its size.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • Content-Length: The size of the recording file portion.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Pipes the recording file to the response.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Direct access to S3 bucket

                                                                                                                                                                                                    -

                                                                                                                                                                                                    With this approach, the backend acts as a proxy between the client and S3, which may result in increased server resource usage. To avoid this, it is more efficient to provide the client with a presigned URL, allowing direct access to the recording files from the S3 bucket. In the advanced recording tutorial, we show how to implement this method, along with a discussion of its advantages and disadvantages.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Delete recording#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The DELETE /recordings/:recordingName endpoint deletes a recording from the S3 bucket:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.delete("/recordings/:recordingName", async (req, res) => {
                                                                                                                                                                                                    -    const { recordingName } = req.params;
                                                                                                                                                                                                    -    const key = RECORDINGS_PATH + recordingName;
                                                                                                                                                                                                    -    const exists = await s3Service.exists(key); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!exists) {
                                                                                                                                                                                                    -        res.status(404).json({ errorMessage: "Recording not found" });
                                                                                                                                                                                                    -        return;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Delete the recording file and metadata file from S3
                                                                                                                                                                                                    -        await Promise.all([s3Service.deleteObject(key), s3Service.deleteObject(`${key}.json`)]); // (2)!
                                                                                                                                                                                                    -        res.json({ message: "Recording deleted" });
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.error("Error deleting recording.", error);
                                                                                                                                                                                                    -        res.status(500).json({ errorMessage: "Error deleting recording" });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Delete the recording file and metadata file from the S3 bucket.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Deletes the recording file and metadata file from the S3 bucket by calling the deleteObject method of the S3Service with the key and ${key}.json as a parameter, respectively.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    S3 service#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, let's take a look at the s3.service.js file, which encapsulates the operations to interact with the S3 bucket:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    s3.service.js
                                                                                                                                                                                                    // S3 configuration
                                                                                                                                                                                                    -const S3_ENDPOINT = process.env.S3_ENDPOINT || "http://localhost:9000"; // (1)!
                                                                                                                                                                                                    -const S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || "minioadmin"; // (2)!
                                                                                                                                                                                                    -const S3_SECRET_KEY = process.env.S3_SECRET_KEY || "minioadmin"; // (3)!
                                                                                                                                                                                                    -const AWS_REGION = process.env.AWS_REGION || "us-east-1"; // (4)!
                                                                                                                                                                                                    -const S3_BUCKET = process.env.S3_BUCKET || "openvidu"; // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -export class S3Service {
                                                                                                                                                                                                    -    static instance;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    constructor() {
                                                                                                                                                                                                    -        if (S3Service.instance) {
                                                                                                                                                                                                    -            return S3Service.instance;
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        // (6)!
                                                                                                                                                                                                    -        this.s3Client = new S3Client({
                                                                                                                                                                                                    -            endpoint: S3_ENDPOINT,
                                                                                                                                                                                                    -            credentials: {
                                                                                                                                                                                                    -                accessKeyId: S3_ACCESS_KEY,
                                                                                                                                                                                                    -                secretAccessKey: S3_SECRET_KEY
                                                                                                                                                                                                    -            },
                                                                                                                                                                                                    -            region: AWS_REGION,
                                                                                                                                                                                                    -            forcePathStyle: true
                                                                                                                                                                                                    -        });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        S3Service.instance = this;
                                                                                                                                                                                                    -        return this;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (7)!
                                                                                                                                                                                                    -    async exists(key) {
                                                                                                                                                                                                    -        try {
                                                                                                                                                                                                    -            await this.headObject(key);
                                                                                                                                                                                                    -            return true;
                                                                                                                                                                                                    -        } catch (error) {
                                                                                                                                                                                                    -            return false;
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (8)!
                                                                                                                                                                                                    -    async headObject(key) {
                                                                                                                                                                                                    -        const params = {
                                                                                                                                                                                                    -            Bucket: S3_BUCKET,
                                                                                                                                                                                                    -            Key: key
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        const command = new HeadObjectCommand(params);
                                                                                                                                                                                                    -        return this.run(command);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (9)!
                                                                                                                                                                                                    -    async getObjectSize(key) {
                                                                                                                                                                                                    -        const { ContentLength: size } = await this.headObject(key);
                                                                                                                                                                                                    -        return size;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (10)!
                                                                                                                                                                                                    -    async getObject(key, range) {
                                                                                                                                                                                                    -        const params = {
                                                                                                                                                                                                    -            Bucket: S3_BUCKET,
                                                                                                                                                                                                    -            Key: key,
                                                                                                                                                                                                    -            Range: range ? `bytes=${range.start}-${range.end}` : undefined
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        const command = new GetObjectCommand(params);
                                                                                                                                                                                                    -        const { Body: body } = await this.run(command);
                                                                                                                                                                                                    -        return body;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (11)!
                                                                                                                                                                                                    -    async getObjectAsJson(key) {
                                                                                                                                                                                                    -        const body = await this.getObject(key);
                                                                                                                                                                                                    -        const stringifiedData = await body.transformToString();
                                                                                                                                                                                                    -        return JSON.parse(stringifiedData);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (12)!
                                                                                                                                                                                                    -    async listObjects(prefix, regex) {
                                                                                                                                                                                                    -        const params = {
                                                                                                                                                                                                    -            Bucket: S3_BUCKET,
                                                                                                                                                                                                    -            Prefix: prefix
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        const command = new ListObjectsV2Command(params);
                                                                                                                                                                                                    -        const { Contents: objects } = await this.run(command);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Filter objects by regex and return the keys
                                                                                                                                                                                                    -        return objects?.filter((object) => regex.test(object.Key)).map((payload) => payload.Key) ?? [];
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (13)!
                                                                                                                                                                                                    -    async deleteObject(key) {
                                                                                                                                                                                                    -        const params = {
                                                                                                                                                                                                    -            Bucket: S3_BUCKET,
                                                                                                                                                                                                    -            Key: key
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        const command = new DeleteObjectCommand(params);
                                                                                                                                                                                                    -        return this.run(command);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    // (14)!
                                                                                                                                                                                                    -    async run(command) {
                                                                                                                                                                                                    -        return this.s3Client.send(command);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The URL of the S3 server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The access key of the S3 server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The secret key of the S3 server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The AWS region of the S3 server.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The name of the S3 bucket.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Initialize the S3Client with the provided configuration.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Check if an object exists in the S3 bucket.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Retrieve the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Retrieve the size of an object in the S3 bucket.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. Retrieve a specified range of bytes from an object in the S3 bucket.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. Retrieve an object from the S3 bucket as JSON.
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    23. List objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    24. -
                                                                                                                                                                                                    25. Delete an object from the S3 bucket.
                                                                                                                                                                                                    26. -
                                                                                                                                                                                                    27. Execute an S3 command.
                                                                                                                                                                                                    28. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This file loads environment variables for the S3 configuration:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • S3_ENDPOINT: The URL of the S3 server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • S3_ACCESS_KEY: The access key of the S3 server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • S3_SECRET_KEY: The secret key of the S3 server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AWS_REGION: The AWS region of the S3 server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • S3_BUCKET: The name of the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, it defines the S3Service class as a singleton, which initializes the S3Client with the provided configuration. The class encapsulates the following methods to interact with the S3 bucket:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • exists: Checks if an object exists in the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • headObject: Retrieves the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getObjectSize: Retrieves the size of an object in the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getObject: Retrieves an object from the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getObjectAsJson: Retrieves an object from the S3 bucket as JSON.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • listObjects: Lists objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • deleteObject: Deletes an object from the S3 bucket.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • run: Executes an S3 command.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Frontend#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The client application extends the JavaScript client tutorial by adding recording features, introducing new buttons to facilitate actions such as starting and stopping recording a room, as well as listing, playing and deleting recordings. When these newly introduced buttons are interacted with, the client triggers requests to the REST API endpoints of the server application.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to update the user interface of all participants in the room according to the recording status, the client application subscribes to the RoomEvent.RecordingStatusChanged event, which is triggered when the room changes from being recorded to not being recorded, and vice versa. When this event is triggered, the updateRecordingInfo function is called to update the recording information of the room displayed on the screen. This function is also called when a participant joins the room, using the current value of the room.recording property at that moment. This is done in the joinRoom function of the app.js file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Limitations of the RoomEvent.RecordingStatusChanged event

                                                                                                                                                                                                    -

                                                                                                                                                                                                    By using the RoomEvent.RecordingStatusChanged event, we can only detect when the recording has started or stopped, but not other states like starting, stopping or failed. Additionally, when the recording stops, the event is not triggered until the recorder participant leaves the room, causing a delay of 20 seconds approximately between the stop and when participants are notified.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To overcome these limitations, you can follow the steps described in the advanced recording tutorial, where we implement a custom notification system. This system informs participants about the recording status by listening to webhook events and updating room metadata.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // Disable 'Join' button
                                                                                                                                                                                                    -    document.getElementById("join-button").disabled = true;
                                                                                                                                                                                                    -    document.getElementById("join-button").innerText = "Joining...";
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    room = new LivekitClient.Room();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        addTrack(track, participant.identity);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every new Track destroyed...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        track.detach();
                                                                                                                                                                                                    -        document.getElementById(track.sid)?.remove();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (track.kind === "video") {
                                                                                                                                                                                                    -            removeVideoContainer(participant.identity);
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // When recording status changes...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.RecordingStatusChanged, async (isRecording) => {
                                                                                                                                                                                                    -        await updateRecordingInfo(isRecording);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the room name and participant name from the form
                                                                                                                                                                                                    -        const roomName = document.getElementById("room-name").value;
                                                                                                                                                                                                    -        const userName = document.getElementById("participant-name").value;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await getToken(roomName, userName);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Hide the 'Join room' page and show the 'Room' page
                                                                                                                                                                                                    -        document.getElementById("room-title").innerText = roomName;
                                                                                                                                                                                                    -        document.getElementById("join").hidden = true;
                                                                                                                                                                                                    -        document.getElementById("room").hidden = false;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone();
                                                                                                                                                                                                    -        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;
                                                                                                                                                                                                    -        addTrack(localVideoTrack, userName, true);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Update recording info
                                                                                                                                                                                                    -        await updateRecordingInfo(room.isRecording);
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.log("There was an error connecting to the room:", error.message);
                                                                                                                                                                                                    -        await leaveRoom();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The updateRecordingInfo function updates the recording information of the room by changing the recording button's text and color according to the recording status. It also shows or hides the alert message that informs the user that the room is being recorded. Finally, it updates the recording list by calling the listRecordings function.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This function retrieves all recordings available for the room from the backend and displays their relevant information by invoking the showRecordingList function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function showRecordingList(recordings) {
                                                                                                                                                                                                    -    const recordingsList = document.getElementById("recording-list");
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (recordings.length === 0) {
                                                                                                                                                                                                    -        recordingsList.innerHTML = "<span>There are no recordings available</span>";
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        recordingsList.innerHTML = "";
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    recordings.forEach((recording) => {
                                                                                                                                                                                                    -        const recordingName = recording.name;
                                                                                                                                                                                                    -        const recordingSize = formatBytes(recording.size ?? 0);
                                                                                                                                                                                                    -        const recordingDate = new Date(recording.startedAt).toLocaleString();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        const recordingContainer = document.createElement("div");
                                                                                                                                                                                                    -        recordingContainer.className = "recording-container";
                                                                                                                                                                                                    -        recordingContainer.id = recordingName;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        recordingContainer.innerHTML = `
                                                                                                                                                                                                    -            <i class="fa-solid fa-file-video"></i>
                                                                                                                                                                                                    -            <div class="recording-info">
                                                                                                                                                                                                    -                <p class="recording-name">${recordingName}</p>
                                                                                                                                                                                                    -                <p class="recording-size">${recordingSize}</p>
                                                                                                                                                                                                    -                <p class="recording-date">${recordingDate}</p>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -            <div class="recording-actions">
                                                                                                                                                                                                    -                <button title="Play" class="icon-button" onclick="displayRecording('${recordingName}')">
                                                                                                                                                                                                    -                    <i class="fa-solid fa-play"></i>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -                <button title="Delete" class="icon-button delete-button" onclick="deleteRecording('${recordingName}')">
                                                                                                                                                                                                    -                    <i class="fa-solid fa-trash"></i>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        `;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        recordingsList.append(recordingContainer);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The showRecordingList function creates a new div element for each recording available in the room and appends it to the recording-list container. Each div element contains the recording name, size, and start date, as well as buttons to play and delete the recording.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Recording deletion

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When a recording is deleted, it is removed from the recording list, but only for the user who initiated the deletion. Other users will continue to see the recording in their list until it is refreshed.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the advanced recording tutorial, we show how to implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user clicks the play button, the displayRecording function is called to play the recording. This function opens a dialog window with an embedded video element and sets the source of the video to the get recording endpoint of the server application:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function displayRecording(recordingName) {
                                                                                                                                                                                                    -    const recordingVideoDialog = document.getElementById("recording-video-dialog");
                                                                                                                                                                                                    -    recordingVideoDialog.showModal();
                                                                                                                                                                                                    -    const recordingVideo = document.getElementById("recording-video");
                                                                                                                                                                                                    -    recordingVideo.src = `/recordings/${recordingName}`;
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    94
                                                                                                                                                                                                    -95
                                                                                                                                                                                                    -96
                                                                                                                                                                                                    -97
                                                                                                                                                                                                    <dialog id="recording-video-dialog">
                                                                                                                                                                                                    -    <video id="recording-video" autoplay controls></video>
                                                                                                                                                                                                    -    <button class="btn btn-secondary" id="close-recording-video-dialog" onclick="closeRecording()">Close</button>
                                                                                                                                                                                                    -</dialog>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    General recording page#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The recordings.html file defines the HTML for the general recording page. This page lists all available recordings from all rooms and allows the user to filter them by room name. It also provides buttons to play and delete each recording.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/index.html b/3.0.0-beta3/docs/tutorials/angular-components/index.html deleted file mode 100644 index 367b02b8..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/index.html +++ /dev/null @@ -1,3997 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Angular Components Tutorials - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Angular Components Tutorials#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Angular Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Angular Components
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the following tutorials you can learn how to use each one of the available Angular Components to build your application UI tailored to your needs:

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/index.html deleted file mode 100644 index 1e2174c5..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/index.html +++ /dev/null @@ -1,4793 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Additional panels using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Additional panels using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-additional-panels tutorial demonstrates how to add new panels to the videoconference, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding new videoconference panels is made simple with the AdditionalPanelsDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Additional Panel
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalPanelButtonsDirective and the AdditionalPanelsDirective to add new buttons to the toolbar and new panels to the videoconference. If you want to learn how to add new buttons to the toolbar, you can check the openvidu-toolbar-panel-buttons tutorial.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-additional-panels tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-additional-panels
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <!-- Additional Toolbar Buttons -->
                                                                                                                                                                                                    -      <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleMyPanel('my-panel1')">
                                                                                                                                                                                                    -          <mat-icon>360</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleMyPanel('my-panel2')">
                                                                                                                                                                                                    -          <mat-icon>star</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -      <!-- Additional Panels -->
                                                                                                                                                                                                    -      <div *ovAdditionalPanels id="my-panels">
                                                                                                                                                                                                    -        @if (showExternalPanel) {
                                                                                                                                                                                                    -        <div id="my-panel1">
                                                                                                                                                                                                    -          <h2>NEW PANEL 1</h2>
                                                                                                                                                                                                    -          <p>This is my new additional panel</p>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -        } @if (showExternalPanel2) {
                                                                                                                                                                                                    -        <div id="my-panel2">
                                                                                                                                                                                                    -          <h2>NEW PANEL 2</h2>
                                                                                                                                                                                                    -          <p>This is another new panel</p>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-additional-panels';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Flags to control the visibility of external panels
                                                                                                                                                                                                    -  showExternalPanel: boolean = false; // (5)!
                                                                                                                                                                                                    -  showExternalPanel2: boolean = false; // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  ngOnInit() {
                                                                                                                                                                                                    -    this.subscribeToPanelToggling(); // (7)!
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (8)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Subscribe to panel toggling events
                                                                                                                                                                                                    -  subscribeToPanelToggling() {
                                                                                                                                                                                                    -    this.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => { // (9)!
                                                                                                                                                                                                    -      this.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';
                                                                                                                                                                                                    -      this.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Toggle the visibility of external panels
                                                                                                                                                                                                    -  toggleMyPanel(type: string) { // (10)!
                                                                                                                                                                                                    -    this.panelService.togglePanel(type);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (11)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. getToken method that requests a token to the server application.
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding new panels#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. -In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            [toolbarDisplayRoomName]="false"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Additional Toolbar Buttons -->
                                                                                                                                                                                                    -            <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                                                                                                                                                                                    -                <button mat-icon-button (click)="toggleMyPanel('my-panel1')">
                                                                                                                                                                                                    -                    <mat-icon>360</mat-icon>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -                <button mat-icon-button (click)="toggleMyPanel('my-panel2')">
                                                                                                                                                                                                    -                    <mat-icon>star</mat-icon>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            <!-- Additional Panels -->
                                                                                                                                                                                                    -            <div *ovAdditionalPanels id="my-panels">
                                                                                                                                                                                                    -                @if (showExternalPanel) {
                                                                                                                                                                                                    -                <div id="my-panel1">
                                                                                                                                                                                                    -                    <h2>NEW PANEL 1</h2>
                                                                                                                                                                                                    -                    <p>This is my new additional panel</p>
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -                } @if (showExternalPanel2) {
                                                                                                                                                                                                    -                <div id="my-panel2">
                                                                                                                                                                                                    -                    <h2>NEW PANEL 2</h2>
                                                                                                                                                                                                    -                    <p>This is another new panel</p>
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add new buttons to the toolbar and the *ovAdditionalPanels directive is used to add new panels to the videoconference.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user clicks on the buttons, the toggleMyPanel method is called to toggle the visibility of the new panels. These new panels are handled by the showExternalPanel and showExternalPanel2 flags.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/index.html deleted file mode 100644 index d48048e6..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/index.html +++ /dev/null @@ -1,4687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create admin dashboard using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Create admin dashboard using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-admin-dashboard tutorial demonstrates how to create an admin dashboard to manage the recordings of a videoconference using the OpenVidu Components Angular library.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Admin Login
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Admin Dashboard
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-admin-dashboard tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-admin-dashboard
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-admin-login component to create a login form and the ov-admin-dashboard component to create the admin dashboard.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    @if (logged) {
                                                                                                                                                                                                    -    <ov-admin-dashboard
                                                                                                                                                                                                    -      [recordingsList]="recordings()"
                                                                                                                                                                                                    -      (onLogoutRequested)="onLogoutRequested()"
                                                                                                                                                                                                    -      (onRefreshRecordingsRequested)="onRefreshRecordingsRequested()"
                                                                                                                                                                                                    -      (onLoadMoreRecordingsRequested)="onLoadMoreRecordingsRequested()"
                                                                                                                                                                                                    -      (onRecordingDeleteRequested)="onRecordingDeleteRequested($event)"
                                                                                                                                                                                                    -    ></ov-admin-dashboard>
                                                                                                                                                                                                    -    } @else {
                                                                                                                                                                                                    -    <ov-admin-login (onLoginRequested)="onLoginRequested($event)">
                                                                                                                                                                                                    -    </ov-admin-login>
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  roomName = 'openvidu-admin-dashboard'; // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  logged: boolean = false; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Recordings list to show in the dashboard
                                                                                                                                                                                                    -  // This is a dummy list, you should replace it with your own list from the server
                                                                                                                                                                                                    -  recordings: WritableSignal<RecordingInfo[]> = signal([ // (3)!
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -      id: 'recording1',
                                                                                                                                                                                                    -      roomName: this.roomName,
                                                                                                                                                                                                    -      roomId: 'roomId1',
                                                                                                                                                                                                    -      outputMode: RecordingOutputMode.COMPOSED,
                                                                                                                                                                                                    -      status: RecordingStatus.READY,
                                                                                                                                                                                                    -      filename: 'sampleRecording.mp4',
                                                                                                                                                                                                    -      startedAt: new Date().getTime(),
                                                                                                                                                                                                    -      endedAt: new Date().getTime(),
                                                                                                                                                                                                    -      duration: 0,
                                                                                                                                                                                                    -      size: 100,
                                                                                                                                                                                                    -      location: 'http://localhost:8080/recordings/recording1',
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  ]);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor() {}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  onLoginRequested(credentials: { username: string; password: string }) { // (4)!
                                                                                                                                                                                                    -    console.log(`Login button clicked ${credentials}`);
                                                                                                                                                                                                    -    /**
                                                                                                                                                                                                    -     * WARNING! This code is developed for didactic purposes only.
                                                                                                                                                                                                    -     * The authentication process should be done in the server side.
                                                                                                                                                                                                    -     **/
                                                                                                                                                                                                    -    this.logged = true;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  onLogoutRequested() { // (5)!
                                                                                                                                                                                                    -    console.log('Logout button clicked');
                                                                                                                                                                                                    -    /**
                                                                                                                                                                                                    -     * WARNING! This code is developed for didactic purposes only.
                                                                                                                                                                                                    -     * The authentication process should be done in the server side.
                                                                                                                                                                                                    -     **/
                                                                                                                                                                                                    -    this.logged = false;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  onRefreshRecordingsRequested() { // (6)!
                                                                                                                                                                                                    -    console.log('Refresh recording clicked');
                                                                                                                                                                                                    -    /**
                                                                                                                                                                                                    -     * WARNING! This code is developed for didactic purposes only.
                                                                                                                                                                                                    -     * The authentication process should be done in the server side.
                                                                                                                                                                                                    -     **/
                                                                                                                                                                                                    -    // Getting the recordings from the server
                                                                                                                                                                                                    -    this.recordings.update(() => [
                                                                                                                                                                                                    -      {
                                                                                                                                                                                                    -        id: 'recording1',
                                                                                                                                                                                                    -        roomName: this.title,
                                                                                                                                                                                                    -        roomId: 'roomId1',
                                                                                                                                                                                                    -        outputMode: RecordingOutputMode.COMPOSED,
                                                                                                                                                                                                    -        status: RecordingStatus.READY,
                                                                                                                                                                                                    -        filename: 'sampleRecording1.mp4',
                                                                                                                                                                                                    -        startedAt: new Date().getTime(),
                                                                                                                                                                                                    -        endedAt: new Date().getTime(),
                                                                                                                                                                                                    -        duration: 0,
                                                                                                                                                                                                    -        size: 100,
                                                                                                                                                                                                    -        location: 'http://localhost:8080/recordings/recording1',
                                                                                                                                                                                                    -      },
                                                                                                                                                                                                    -    ]);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  onLoadMoreRecordingsRequested() { // (7)!
                                                                                                                                                                                                    -    console.log('Load more recordings clicked');
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  onRecordingDeleteRequested(recording: RecordingDeleteRequestedEvent) { // (8)!
                                                                                                                                                                                                    -    console.log(`Delete recording clicked ${recording.recordingId}`);
                                                                                                                                                                                                    -    /**
                                                                                                                                                                                                    -     * WARNING! This code is developed for didactic purposes only.
                                                                                                                                                                                                    -     * The authentication process should be done in the server side.
                                                                                                                                                                                                    -     **/
                                                                                                                                                                                                    -    // Deleting the recording from the server
                                                                                                                                                                                                    -    this.recordings.update((recordings) =>
                                                                                                                                                                                                    -      recordings.filter((rec) => rec.id !== recording.recordingId)
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    console.log(this.recordings());
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. roomName: OpenVidu Room name.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. onRecordingDeleteRequested method that fires when the delete recording button is clicked.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: OpenVidu Room name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onRecordingDeleteRequested method that fires when the delete recording button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/index.html deleted file mode 100644 index d33892fb..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/index.html +++ /dev/null @@ -1,4720 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom activities panel using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom activities panel using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-activities-panel tutorial demonstrates how to customize the activities panel, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default activities panel is made simple with the ActivitiesPanelDirective, which offers a straightforward way to replace and adapt the ActivitiesPanelComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Activities Panel
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-activities-panel tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-activities-panel
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -        <!-- Custom activities panel -->
                                                                                                                                                                                                    -        <div *ovActivitiesPanel id="my-panel">
                                                                                                                                                                                                    -            <h3>ACTIVITIES</h3>
                                                                                                                                                                                                    -            <div>CUSTOM ACTIVITIES</div>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-activities-panel';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (6)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing chat panel#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial uses the *ovActivitiesPanel directive with the aim of replacing the default activities panel with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Custom activities panel -->
                                                                                                                                                                                                    -            <div *ovActivitiesPanel id="my-panel">
                                                                                                                                                                                                    -                <h3>ACTIVITIES</h3>
                                                                                                                                                                                                    -                <div>CUSTOM ACTIVITIES</div>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/index.html deleted file mode 100644 index e2ba4c83..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/index.html +++ /dev/null @@ -1,4797 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom chat panel using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom chat panel using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-chat-panel tutorial demonstrates how to customize the chat panel, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default chat panel is made simple with the ChatPanelDirective, which offers a straightforward way to replace and adapt the ChatPanelComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Chat Panel
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-chat-panel tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-chat-panel
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import {
                                                                                                                                                                                                    -  DataPacket_Kind,
                                                                                                                                                                                                    -  DataPublishOptions,
                                                                                                                                                                                                    -  DataTopic,
                                                                                                                                                                                                    -  ParticipantService,
                                                                                                                                                                                                    -  RemoteParticipant,
                                                                                                                                                                                                    -  Room,
                                                                                                                                                                                                    -  RoomEvent,
                                                                                                                                                                                                    -  OpenViduComponentsModule,
                                                                                                                                                                                                    -} from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      [toolbarDisplayRoomName]="false"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      (onRoomCreated)="onRoomCreated($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <!-- Chat Panel -->
                                                                                                                                                                                                    -      <div *ovChatPanel id="my-panel">
                                                                                                                                                                                                    -        <h3>Chat</h3>
                                                                                                                                                                                                    -        <div>
                                                                                                                                                                                                    -          <ul>
                                                                                                                                                                                                    -            @for (msg of messages; track msg) {
                                                                                                                                                                                                    -            <li>{{ msg }}</li>
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -          </ul>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -        <input value="Hello" #input />
                                                                                                                                                                                                    -        <button (click)="send(input.value)">Send</button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-chat-panel';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  messages: string[] = []; // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (6)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  /**
                                                                                                                                                                                                    -   * Handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    -   *
                                                                                                                                                                                                    -   * @param room - The Room object that was created.
                                                                                                                                                                                                    -   */
                                                                                                                                                                                                    -  onRoomCreated(room: Room) { // (7)!
                                                                                                                                                                                                    -    // Set up an event listener for the RoomEvent.DataReceived event.
                                                                                                                                                                                                    -    room.on(RoomEvent.DataReceived, ( // (8)!
                                                                                                                                                                                                    -      payload: Uint8Array,
                                                                                                                                                                                                    -      participant?: RemoteParticipant,
                                                                                                                                                                                                    -      _?: DataPacket_Kind,
                                                                                                                                                                                                    -      topic?: string
                                                                                                                                                                                                    -    ) => {
                                                                                                                                                                                                    -      // Check if the received data topic is related to chat messages.
                                                                                                                                                                                                    -      if (topic === DataTopic.CHAT) {
                                                                                                                                                                                                    -        // Decode the payload from Uint8Array to a string and parse it as JSON.
                                                                                                                                                                                                    -        const { message } = JSON.parse(new TextDecoder().decode(payload));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get the participant's name or default to 'Unknown' if not available.
                                                                                                                                                                                                    -        const participantName = participant?.name || 'Unknown';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Add the received message to the messages array.
                                                                                                                                                                                                    -        this.messages.push(message);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Log the received message and the participant's name to the console.
                                                                                                                                                                                                    -        console.log(`Message received from ${participantName}:`, message);
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Function to send a chat message
                                                                                                                                                                                                    -  async send(message: string): Promise<void> { // (9)!
                                                                                                                                                                                                    -    const strData = JSON.stringify({ message });
                                                                                                                                                                                                    -    const data: Uint8Array = new TextEncoder().encode(strData);
                                                                                                                                                                                                    -    const options: DataPublishOptions = { topic: DataTopic.CHAT };
                                                                                                                                                                                                    -    await this.participantService.publishData(data, options);
                                                                                                                                                                                                    -    this.messages.push(message);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (10)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. messages array that stores the chat messages.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. send method that sends a chat message.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. getToken method that requests a token to the server application.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • messages array that stores the chat messages.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • send method that sends a chat message.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing chat panel#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial uses the *ovChatPanel directive with the aim of replacing the default chat panel with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -            (onRoomCreated)="onRoomCreated($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Chat Panel -->
                                                                                                                                                                                                    -            <div *ovChatPanel id="my-panel">
                                                                                                                                                                                                    -                <h3>Chat</h3>
                                                                                                                                                                                                    -                <div>
                                                                                                                                                                                                    -                    <ul>
                                                                                                                                                                                                    -                        @for (msg of messages; track msg) {
                                                                                                                                                                                                    -                        <li>{{ msg }}</li>
                                                                                                                                                                                                    -                        }
                                                                                                                                                                                                    -                    </ul>
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -                <input value="Hello" #input />
                                                                                                                                                                                                    -                <button (click)="send(input.value)">Send</button>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/index.html deleted file mode 100644 index 2013d18f..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/index.html +++ /dev/null @@ -1,4812 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom layout using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom layout using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-layout tutorial demonstrates how to replace the default layout of the OpenVidu Components Angular library with a custom layout.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default layout is made simple with the LayoutDirective, which offers a straightforward way to customize the LayoutComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Layout
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-layout tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-layout
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantModel, ParticipantService } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -      <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -      <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      >
                                                                                                                                                                                                    -        <!-- Custom Layout for Video Streams -->
                                                                                                                                                                                                    -        <div *ovLayout>
                                                                                                                                                                                                    -          <div class="container">
                                                                                                                                                                                                    -            <!-- Local Participant's Tracks -->
                                                                                                                                                                                                    -            @for (track of localParticipant.tracks; track track) {
                                                                                                                                                                                                    -            <div
                                                                                                                                                                                                    -              class="item"
                                                                                                                                                                                                    -              [ngClass]="{
                                                                                                                                                                                                    -                hidden:
                                                                                                                                                                                                    -                  track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                                                                                                                                                                    -              }"
                                                                                                                                                                                                    -            >
                                                                                                                                                                                                    -              <ov-stream [track]="track"></ov-stream>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            <!-- Remote Participants' Tracks -->
                                                                                                                                                                                                    -            @for (track of remoteParticipants | tracks; track track) {
                                                                                                                                                                                                    -            <div
                                                                                                                                                                                                    -              class="item"
                                                                                                                                                                                                    -              [ngClass]="{
                                                                                                                                                                                                    -                hidden:
                                                                                                                                                                                                    -                  track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                                                                                                                                                                    -              }"
                                                                                                                                                                                                    -            >
                                                                                                                                                                                                    -              <ov-stream [track]="track"></ov-stream>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -          </div>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -      </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: `
                                                                                                                                                                                                    -    /* css styles */
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, NgClass],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnInit, OnDestroy {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-layout';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Participant-related properties
                                                                                                                                                                                                    -  localParticipant!: ParticipantModel; // (5)!
                                                                                                                                                                                                    -  remoteParticipants!: ParticipantModel[]; // (6)!
                                                                                                                                                                                                    -  localParticipantSubs!: Subscription; // (7)!
                                                                                                                                                                                                    -  remoteParticipantsSubs!: Subscription; // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient,   private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  ngOnInit() {
                                                                                                                                                                                                    -    // Subscribe to participants' updates
                                                                                                                                                                                                    -    this.subscribeToParticipants();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  ngOnDestroy() {
                                                                                                                                                                                                    -    // Unsubscribe from participant updates to prevent memory leaks
                                                                                                                                                                                                    -    this.localParticipantSubs?.unsubscribe();
                                                                                                                                                                                                    -    this.remoteParticipantsSubs?.unsubscribe();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (9)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Subscribe to updates for local and remote participants
                                                                                                                                                                                                    -  private subscribeToParticipants() { // (10)!
                                                                                                                                                                                                    -    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {
                                                                                                                                                                                                    -      if (p) this.localParticipant = p;
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {
                                                                                                                                                                                                    -      this.remoteParticipants = participants;
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (11)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. localParticipant: Local participant model.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. getToken method that requests a token to the server application.
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding custom buttons to the toolbar#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovLayout that allows you to customize the default layout of the videoconference. -In this tutorial, we are creating a very basic layout just for demonstration purposes.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Custom Layout for Video Streams -->
                                                                                                                                                                                                    -            <div *ovLayout>
                                                                                                                                                                                                    -                <div class="container">
                                                                                                                                                                                                    -                    <!-- Local Participant's Tracks -->
                                                                                                                                                                                                    -                    @for (track of localParticipant.tracks; track track) {
                                                                                                                                                                                                    -                    <div
                                                                                                                                                                                                    -                        class="item"
                                                                                                                                                                                                    -                        [ngClass]="{
                                                                                                                                                                                                    -                            hidden:
                                                                                                                                                                                                    -                                track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                                                                                                                                                                    -                        }"
                                                                                                                                                                                                    -                    >
                                                                                                                                                                                                    -                        <ov-stream [track]="track"></ov-stream>
                                                                                                                                                                                                    -                    </div>
                                                                                                                                                                                                    -                    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                    <!-- Remote Participants' Tracks -->
                                                                                                                                                                                                    -                    @for (track of remoteParticipants | tracks; track track) {
                                                                                                                                                                                                    -                    <div
                                                                                                                                                                                                    -                        class="item"
                                                                                                                                                                                                    -                        [ngClass]="{
                                                                                                                                                                                                    -                            hidden:
                                                                                                                                                                                                    -                                track.isAudioTrack && !track.participant.onlyHasAudioTracks
                                                                                                                                                                                                    -                        }"
                                                                                                                                                                                                    -                    >
                                                                                                                                                                                                    -                        <ov-stream [track]="track"></ov-stream>
                                                                                                                                                                                                    -                    </div>
                                                                                                                                                                                                    -                    }
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnInit, OnDestroy {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovLayout directive is used to customize the layout of the videoconference. The layout is divided into two sections: one for the local participant's tracks and another for the remote participants' tracks.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The repeater directive @for is used to iterate over the tracks of the local participant and the remote participants and display them in the layout using the ov-stream component.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/index.html deleted file mode 100644 index fbd4e2b1..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/index.html +++ /dev/null @@ -1,4741 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom panels using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom panels using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-panels tutorial demonstrates how to replace the default panels with a custom ones, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the videoconference panels is made simple with the PanelDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Panels
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-panels tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-panels
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -      <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -      <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      >
                                                                                                                                                                                                    -        <!-- Custom Panels -->
                                                                                                                                                                                                    -        <ov-panel *ovPanel>
                                                                                                                                                                                                    -          <!-- Custom Chat Panel -->
                                                                                                                                                                                                    -          <div *ovChatPanel id="my-chat-panel">This is my custom chat panel</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -          <!-- Custom Participants Panel -->
                                                                                                                                                                                                    -          <div *ovParticipantsPanel id="my-participants-panel">
                                                                                                                                                                                                    -            This is my custom participants panel
                                                                                                                                                                                                    -          </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -          <!-- Custom Activities Panel -->
                                                                                                                                                                                                    -          <div *ovActivitiesPanel id="my-activities-panel">
                                                                                                                                                                                                    -            This is my custom activities panel
                                                                                                                                                                                                    -          </div>
                                                                                                                                                                                                    -        </ov-panel>
                                                                                                                                                                                                    -      </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-panels';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (6)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the panels#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. -In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Custom Panels -->
                                                                                                                                                                                                    -            <ov-panel *ovPanel>
                                                                                                                                                                                                    -                <!-- Custom Chat Panel -->
                                                                                                                                                                                                    -                <div *ovChatPanel id="my-chat-panel">This is my custom chat panel</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                <!-- Custom Participants Panel -->
                                                                                                                                                                                                    -                <div *ovParticipantsPanel id="my-participants-panel">
                                                                                                                                                                                                    -                    This is my custom participants panel
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                <!-- Custom Activities Panel -->
                                                                                                                                                                                                    -                <div *ovActivitiesPanel id="my-activities-panel">
                                                                                                                                                                                                    -                    This is my custom activities panel
                                                                                                                                                                                                    -                </div>
                                                                                                                                                                                                    -            </ov-panel>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovPanel directive is used to replace the default videoconference panels with custom ones. The *ovChatPanel, *ovParticipantsPanel, and *ovActivitiesPanel directives are used to replace the default chat, participants, and activities panels with custom ones.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/index.html deleted file mode 100644 index a670d3bb..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/index.html +++ /dev/null @@ -1,4737 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom participants panel item element using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom participants panel item element using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item-element tutorial demonstrates how to replace the default participant item element inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default participant item element is made simple with the ParticipantsPanelItemElementsDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item Element
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-participant-panel-item-element tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item-element
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import {
                                                                                                                                                                                                    -  ParticipantModel,
                                                                                                                                                                                                    -    ParticipantService,
                                                                                                                                                                                                    -  OpenViduComponentsModule
                                                                                                                                                                                                    -} from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <!-- Participant Panel Item Elements -->
                                                                                                                                                                                                    -      <div *ovParticipantPanelItemElements="let participant">
                                                                                                                                                                                                    -        <!-- Leave Button for Local Participant -->
                                                                                                                                                                                                    -        @if (participant.isLocal) {
                                                                                                                                                                                                    -        <button (click)="leaveSession()">Leave</button>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-participant-panel-item-element';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Function to leave the session
                                                                                                                                                                                                    -  async leaveSession() { // (6)!
                                                                                                                                                                                                    -    await this.openviduService.disconnectRoom();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (7)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. getToken method that requests a token to the server application.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing participant item element#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Participant Panel Item Elements -->
                                                                                                                                                                                                    -            <div *ovParticipantPanelItemElements="let participant">
                                                                                                                                                                                                    -                <!-- Leave Button for Local Participant -->
                                                                                                                                                                                                    -                @if (participant.isLocal) {
                                                                                                                                                                                                    -                <button (click)="leaveSession()">Leave</button>
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItemElements directive is used to replace the default participant item element, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The *ovParticipantPanelItemElements directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/index.html deleted file mode 100644 index fd2812b4..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/index.html +++ /dev/null @@ -1,4759 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom participants panel item using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom participants panel item using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item tutorial demonstrates how to replace the default participant item inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default participant item is made simple with the ParticipantsPanelItemDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-participant-panel-item tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import {
                                                                                                                                                                                                    -  ParticipantModel,
                                                                                                                                                                                                    -    ParticipantService,
                                                                                                                                                                                                    -  OpenViduComponentsModule
                                                                                                                                                                                                    -} from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -        <!-- Participant Panel Items -->
                                                                                                                                                                                                    -        <div *ovParticipantPanelItem="let participant" style="display: flex">
                                                                                                                                                                                                    -            <p>{{ participant.name }}</p>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            <!-- More Options Menu -->
                                                                                                                                                                                                    -            <button mat-icon-button [matMenuTriggerFor]="menu">
                                                                                                                                                                                                    -                <mat-icon>more_vert</mat-icon>
                                                                                                                                                                                                    -            </button>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            <!-- Menu Content -->
                                                                                                                                                                                                    -            <mat-menu #menu="matMenu">
                                                                                                                                                                                                    -                <button mat-menu-item>Button 1</button>
                                                                                                                                                                                                    -                <button mat-menu-item>Button 2</button>
                                                                                                                                                                                                    -            </mat-menu>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -    imports: [
                                                                                                                                                                                                    -    OpenViduComponentsModule,
                                                                                                                                                                                                    -    MatIconButton,
                                                                                                                                                                                                    -    MatMenuTrigger,
                                                                                                                                                                                                    -    MatIcon,
                                                                                                                                                                                                    -    MatMenu,
                                                                                                                                                                                                    -    MatMenuItem,
                                                                                                                                                                                                    -  ],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-participant-panel-item';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (6)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing participant item#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Participant Panel Items -->
                                                                                                                                                                                                    -            <div *ovParticipantPanelItem="let participant" style="display: flex">
                                                                                                                                                                                                    -                <p>{{ participant.name }}</p>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                <!-- More Options Menu -->
                                                                                                                                                                                                    -                <button mat-icon-button [matMenuTriggerFor]="menu">
                                                                                                                                                                                                    -                    <mat-icon>more_vert</mat-icon>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                <!-- Menu Content -->
                                                                                                                                                                                                    -                <mat-menu #menu="matMenu">
                                                                                                                                                                                                    -                    <button mat-menu-item>Button 1</button>
                                                                                                                                                                                                    -                    <button mat-menu-item>Button 2</button>
                                                                                                                                                                                                    -                </mat-menu>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [
                                                                                                                                                                                                    -        OpenViduComponentsModule,
                                                                                                                                                                                                    -        MatIconButton,
                                                                                                                                                                                                    -        MatMenuTrigger,
                                                                                                                                                                                                    -        MatIcon,
                                                                                                                                                                                                    -        MatMenu,
                                                                                                                                                                                                    -        MatMenuItem,
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItem directive is used to replace the default participant item inside of the participants panel with a custom one. The *ovParticipantPanelItem directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/index.html deleted file mode 100644 index 61b2f6c5..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/index.html +++ /dev/null @@ -1,4774 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom participants panel using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom participants panel using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-participants-panel tutorial demonstrates how to customize the participants panel, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Replacing the default participants panel is made simple with the ParticipantsPanelDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-participants-panel tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participants-panel
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import {
                                                                                                                                                                                                    -  ParticipantModel,
                                                                                                                                                                                                    -    ParticipantService,
                                                                                                                                                                                                    -  OpenViduComponentsModule
                                                                                                                                                                                                    -} from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <!-- Custom Participants Panel -->
                                                                                                                                                                                                    -      <div *ovParticipantsPanel id="my-panel">
                                                                                                                                                                                                    -        <ul id="local">
                                                                                                                                                                                                    -          <li>{{ localParticipant.name }}</li>
                                                                                                                                                                                                    -        </ul>
                                                                                                                                                                                                    -        <ul id="remote">
                                                                                                                                                                                                    -          @for (p of remoteParticipants; track p) {
                                                                                                                                                                                                    -          <li>{{ p.name }}</li>
                                                                                                                                                                                                    -          }
                                                                                                                                                                                                    -        </ul>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnInit, OnDestroy {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-participants-panel';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Participant-related properties
                                                                                                                                                                                                    -  localParticipant!: ParticipantModel; // (5)!
                                                                                                                                                                                                    -  remoteParticipants!: ParticipantModel[]; // (6)!
                                                                                                                                                                                                    -  localParticipantSubs!: Subscription; // (7)!
                                                                                                                                                                                                    -  remoteParticipantsSubs!: Subscription; // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  ngOnInit() {
                                                                                                                                                                                                    -    // Subscribe to participants' updates
                                                                                                                                                                                                    -    this.subscribeToParticipants();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  ngOnDestroy() {
                                                                                                                                                                                                    -    // Unsubscribe from participant updates to prevent memory leaks
                                                                                                                                                                                                    -    this.localParticipantSubs?.unsubscribe();
                                                                                                                                                                                                    -    this.remoteParticipantsSubs?.unsubscribe();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (9)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Subscribe to updates for local and remote participants
                                                                                                                                                                                                    -  private subscribeToParticipants() { // (10)!
                                                                                                                                                                                                    -    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {
                                                                                                                                                                                                    -      if (p) this.localParticipant = p;
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {
                                                                                                                                                                                                    -      this.remoteParticipants = participants;
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (11)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. localParticipant: Local participant model.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. getToken method that requests a token to the server application.
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing participants panel#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial uses the *ovParticipantsPanel directive with the aim of replacing the default participant panel with a custom one.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <!-- Custom Participants Panel -->
                                                                                                                                                                                                    -      <div *ovParticipantsPanel id="my-panel">
                                                                                                                                                                                                    -        <ul id="local">
                                                                                                                                                                                                    -          <li>{{ localParticipant.name }}</li>
                                                                                                                                                                                                    -        </ul>
                                                                                                                                                                                                    -        <ul id="remote">
                                                                                                                                                                                                    -          @for (p of remoteParticipants; track p) {
                                                                                                                                                                                                    -          <li>{{ p.name }}</li>
                                                                                                                                                                                                    -          }
                                                                                                                                                                                                    -        </ul>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnInit, OnDestroy{
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/index.html deleted file mode 100644 index 3d536ba7..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/index.html +++ /dev/null @@ -1,4728 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom stream using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom stream using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-stream tutorial demonstrates how to replace the default video stream with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the video stream component is made simple with the StreamDirective, which offers a straightforward way to replace and adapt the StreamComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Stream
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-stream tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-stream
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -      <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      >
                                                                                                                                                                                                    -        <!-- Display Video Streams -->
                                                                                                                                                                                                    -        <div *ovStream="let track">
                                                                                                                                                                                                    -          <!-- Video Stream Component -->
                                                                                                                                                                                                    -          <ov-stream [track]="track" [displayParticipantName]="false"></ov-stream>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -          <!-- Display Participant's Name -->
                                                                                                                                                                                                    -          <p>{{ track.participant.name }}</p>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -      </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-stream';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (6)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the video stream#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The *ovStream directive is used to replace the default video stream with a custom one and allows you to customize the video stream component to your needs. It provides a way to access the video stream track and the participant name.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <!-- Display Video Streams -->
                                                                                                                                                                                                    -            <div *ovStream="let track">
                                                                                                                                                                                                    -                <!-- Video Stream Component -->
                                                                                                                                                                                                    -                <ov-stream [track]="track" [displayParticipantName]="false"></ov-stream>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                <!-- Display Participant's Name -->
                                                                                                                                                                                                    -                <p>{{ track.participant.name }}</p>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovStream directive provides access to the ParticipantTrackPublication object, which contains the video stream track and the participant name.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The track object is passed to the ov-stream component to display the video stream. The track.participant.name object is used to display the participant's name.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/index.html deleted file mode 100644 index b47b0720..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/index.html +++ /dev/null @@ -1,4734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom toolbar using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom toolbar using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-custom-toolbar tutorial demonstrates how to replace the default toolbar with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the toolbar is made simple with the ToolbarDirective, which offers a straightforward way to replace and adapt the ToolbarComponent to your needs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom Toolbar
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-toolbar tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-toolbar
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <div *ovToolbar style="text-align: center;">
                                                                                                                                                                                                    -        <button (click)="toggleVideo()">Toggle Video</button>
                                                                                                                                                                                                    -        <button (click)="toggleAudio()">Toggle Audio</button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-toolbar';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Toggles the camera on and off.
                                                                                                                                                                                                    -  async toggleVideo() { // (6)!
                                                                                                                                                                                                    -    const isCameraEnabled = this.participantService.isMyCameraEnabled();
                                                                                                                                                                                                    -    await this.participantService.setCameraEnabled(!isCameraEnabled);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Toggles the microphone on and off.
                                                                                                                                                                                                    -  async toggleAudio() { // (7)!
                                                                                                                                                                                                    -    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();
                                                                                                                                                                                                    -    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (8)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. getToken method that requests a token to the server application.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the toolbar#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The *ov-toolbar directive allows you to replace the default toolbar with a custom one. This directive is applied to a div element that contains the custom toolbar elements.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <div *ovToolbar style="text-align: center;">
                                                                                                                                                                                                    -        <button (click)="toggleVideo()">Toggle Video</button>
                                                                                                                                                                                                    -        <button (click)="toggleAudio()">Toggle Audio</button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ov-toolbar directive is applied to a div element that contains two buttons. These buttons are used to toggle the camera and microphone on and off.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/index.html deleted file mode 100644 index f52ea9dc..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/index.html +++ /dev/null @@ -1,4716 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Custom UI using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Custom UI using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Creating a unique and intuitive user interface (UI) is essential for ensuring a great user experience. OpenVidu Components Angular allows for flexibility in UI customization to fit your application's design requirements.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Custom UI
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-custom-ui tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-ui
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-custom-ui';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (6)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Customizing the UI#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To customize the appearance of OpenVidu Components, simply redefine the necessary CSS variables in your styles.scss file. For instance, to change the primary color used throughout your application, you would update the --ov-primary-color variable as shown below:

                                                                                                                                                                                                    -

                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -  --ov-primary-color: #yourNewColor; /* Replace #yourNewColor with your chosen hex color code */
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  /* Others variables ... */
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -Once you redefine a variable, the new style will automatically apply to all components in the OpenVidu UI that use that variable.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The library also allows you to customize shape of buttons, panels and videos customization, the background color personalization of panels, buttons and videoconference and also you can change the text color.

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    You can replace the branding logo with your own. Just modify the src/assets/images/logo.png file with your own logo.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/index.html deleted file mode 100644 index 1147925e..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/index.html +++ /dev/null @@ -1,4773 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Add toggle hand feature using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Add toggle hand feature using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-toggle-hand tutorial demonstrates how to add a toggle hand feature to the OpenVidu Components Angular library.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The toggle hand feature allows participants to raise and lower their hand during a videoconference. This feature is useful for participants to signal that they want to speak or ask a question.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalButtonsDirective, the StreamDirective and the ParticipantsPanelItemElementsDirective to create a custom toolbar button, a custom stream component element and a custom participant panel item element. Check the openvidu-toolbar-buttons and the openvidu-custom-stream tutorials documentation for learning more about these directives.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Toggle Hand
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-toggle-hand tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toggle-hand
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      app/models/participant-app.model.ts: Contains the ParticipantAppModel class that extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import {
                                                                                                                                                                                                    -  ParticipantModel,
                                                                                                                                                                                                    -  ParticipantService,
                                                                                                                                                                                                    -  OpenViduComponentsModule
                                                                                                                                                                                                    -} from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -enum DataTopicApp {
                                                                                                                                                                                                    -  HAND_TOGGLE = 'handToggle'
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <!-- OpenVidu Video Conference Component -->
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [prejoin]="true"
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      (onRoomCreated)="handleRemoteHand($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <div *ovToolbarAdditionalButtons>
                                                                                                                                                                                                    -        <button toolbar-btn mat-icon-button (click)="handleLocalHand()" [class.active-btn]="hasHandRaised">
                                                                                                                                                                                                    -          <mat-icon matTooltip="Toggle hand">front_hand</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -      <div *ovStream="let track" style="height: 100%">
                                                                                                                                                                                                    -        <ov-stream [track]="track"></ov-stream>
                                                                                                                                                                                                    -        @if (track.participant.hasHandRaised) {
                                                                                                                                                                                                    -        <mat-icon @inOutHandAnimation id="hand-notification">front_hand</mat-icon>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -      <div *ovParticipantPanelItemElements="let participant">
                                                                                                                                                                                                    -        @if (participant.hasHandRaised) {
                                                                                                                                                                                                    -        <mat-icon>front_hand</mat-icon>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule, MatIconButton, MatIcon]
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-toggle-hand';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Whether the local participant has raised their hand.
                                                                                                                                                                                                    -  hasHandRaised: boolean = false; // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (6)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Handles the reception of a remote hand-raising event.
                                                                                                                                                                                                    -  handleRemoteHand(room: Room) { // (7)!
                                                                                                                                                                                                    -    // Subscribe to hand toggling events from other participants
                                                                                                                                                                                                    -    room.on(RoomEvent.DataReceived, (payload: Uint8Array, participant?: RemoteParticipant, _?: DataPacket_Kind, topic?: string) => { // (8)!
                                                                                                                                                                                                    -      if (topic === DataTopicApp.HAND_TOGGLE) {
                                                                                                                                                                                                    -        const p = this.participantService.getRemoteParticipantBySid(participant.sid); // (9)!
                                                                                                                                                                                                    -        if (p) {
                                                                                                                                                                                                    -          (<ParticipantAppModel>p).toggleHandRaised(); // (10)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        this.participantService.updateRemoteParticipants(); // (11)!
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Handles the local hand-raising event.
                                                                                                                                                                                                    -  async handleLocalHand() {  // (12)!
                                                                                                                                                                                                    -    // Get local participant with ParticipantService
                                                                                                                                                                                                    -    const participant = <ParticipantAppModel>this.participantService.getLocalParticipant(); // (13)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Toggle the participant hand with the method we wil add in our ParticipantAppModel
                                                                                                                                                                                                    -    participant.toggleHandRaised(); // (14)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Refresh the local participant object for others component and services
                                                                                                                                                                                                    -    this.participantService.updateLocalParticipant(); // (15)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Send a signal with the new value to others participant using the openvidu-browser signal
                                                                                                                                                                                                    -    const strData = JSON.stringify({});
                                                                                                                                                                                                    -    const data: Uint8Array = new TextEncoder().encode(strData);
                                                                                                                                                                                                    -    const options: DataPublishOptions = { topic: DataTopicApp.HAND_TOGGLE };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    await this.participantService.publishData(data, options); // (16)!
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (17)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    21. updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    22. -
                                                                                                                                                                                                    23. handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    24. -
                                                                                                                                                                                                    25. getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    26. -
                                                                                                                                                                                                    27. toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    28. -
                                                                                                                                                                                                    29. updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    30. -
                                                                                                                                                                                                    31. publishData method that sends a signal to other participants.
                                                                                                                                                                                                    32. -
                                                                                                                                                                                                    33. getToken method that requests a token to the server application.
                                                                                                                                                                                                    34. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • publishData method that sends a signal to other participants.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ParticipantAppModel class extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      import { ParticipantModel, ParticipantProperties } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Represents a participant in the application, with the ability to raise their hand.
                                                                                                                                                                                                    -  export class ParticipantAppModel extends ParticipantModel {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Indicates whether the participant has raised their hand.
                                                                                                                                                                                                    -    hasHandRaised: boolean;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    //  Creates a new instance of ParticipantAppModel.
                                                                                                                                                                                                    -    constructor(props: ParticipantProperties) {
                                                                                                                                                                                                    -      super(props);
                                                                                                                                                                                                    -      this.hasHandRaised = false;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Toggles the participant's hand raised status.
                                                                                                                                                                                                    -    toggleHandRaised() {
                                                                                                                                                                                                    -      this.hasHandRaised = !this.hasHandRaised;
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/index.html deleted file mode 100644 index 0bc8d3fb..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/index.html +++ /dev/null @@ -1,4745 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Add toolbar buttons using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Add toolbar buttons using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-toolbar-buttons tutorial demonstrates how to add custom buttons to the central part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Toolbar Buttons
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-toolbar-buttons tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-buttons
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';
                                                                                                                                                                                                    -import { MatIconButton } from '@angular/material/button';
                                                                                                                                                                                                    -import { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <div *ovToolbarAdditionalButtons style="text-align: center;">
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleVideo()">
                                                                                                                                                                                                    -          <mat-icon>videocam</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleAudio()">
                                                                                                                                                                                                    -          <mat-icon>mic</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-toolbar-buttons';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Toggles the camera on and off.
                                                                                                                                                                                                    -  async toggleVideo() { // (6)!
                                                                                                                                                                                                    -    const isCameraEnabled = this.participantService.isMyCameraEnabled();
                                                                                                                                                                                                    -    await this.participantService.setCameraEnabled(!isCameraEnabled);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Toggles the microphone on and off.
                                                                                                                                                                                                    -  async toggleAudio() { // (7)!
                                                                                                                                                                                                    -    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();
                                                                                                                                                                                                    -    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (8)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. getToken method that requests a token to the server application.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding additional buttons to the toolbar#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalButtons that allows you to add custom buttons to the toolbar.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -    <ov-videoconference
                                                                                                                                                                                                    -      [token]="token"
                                                                                                                                                                                                    -      [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -      (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -    >
                                                                                                                                                                                                    -      <div *ovToolbarAdditionalButtons style="text-align: center;">
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleVideo()">
                                                                                                                                                                                                    -          <mat-icon>videocam</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -        <button mat-icon-button (click)="toggleAudio()">
                                                                                                                                                                                                    -          <mat-icon>mic</mat-icon>
                                                                                                                                                                                                    -        </button>
                                                                                                                                                                                                    -      </div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalButtons directive is used to add two buttons to the toolbar. The mat-icon-button component from Angular Material is used to create the buttons. The toggleVideo and toggleAudio methods are called when the buttons are clicked.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/index.html b/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/index.html deleted file mode 100644 index 173ade99..00000000 --- a/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/index.html +++ /dev/null @@ -1,4730 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Add toolbar panel buttons using Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Add toolbar panel buttons using Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The openvidu-toolbar-panel-buttons tutorial demonstrates how to add custom buttons to the right part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalPanelButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenVidu Components - Toolbar Panel Buttons
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -git clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the openvidu-toolbar-panel-buttons tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-panel-buttons
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng new your-project-name
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Add Angular Material to your project

                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      ng add @angular/material
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Install OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install openvidu-components-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Import and use OpenVidu Components Angular

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. Add the component to your template file.
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      7. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      8. -
                                                                                                                                                                                                      9. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                      10. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // Other imports ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -import { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const config: OpenViduComponentsConfig = {
                                                                                                                                                                                                    -    production: true,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -bootstrapApplication(AppComponent, {
                                                                                                                                                                                                    -    providers: [
                                                                                                                                                                                                    -        importProvidersFrom(
                                                                                                                                                                                                    -            OpenViduComponentsModule.forRoot(config)
                                                                                                                                                                                                    -            // Other imports ...
                                                                                                                                                                                                    -        ),
                                                                                                                                                                                                    -        provideAnimations(),
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -}).catch((err) => console.error(err));
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';
                                                                                                                                                                                                    -import { MatIconButton } from '@angular/material/button';
                                                                                                                                                                                                    -import { OpenViduComponentsModule } from 'openvidu-components-angular';
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -  selector: 'app-root',
                                                                                                                                                                                                    -  template:`
                                                                                                                                                                                                    -      <ov-videoconference
                                                                                                                                                                                                    -        [token]="token"
                                                                                                                                                                                                    -        [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -        [toolbarDisplayRoomName]="false"
                                                                                                                                                                                                    -        (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -      >
                                                                                                                                                                                                    -        <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                                                                                                                                                                                    -          <button mat-icon-button (click)="onButtonClicked()">
                                                                                                                                                                                                    -            <mat-icon>star</mat-icon>
                                                                                                                                                                                                    -          </button>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -      </ov-videoconference>
                                                                                                                                                                                                    -  `,
                                                                                                                                                                                                    -  styles: [''],
                                                                                                                                                                                                    -  standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -  // For local development, leave these variables empty
                                                                                                                                                                                                    -  // For production, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  APPLICATION_SERVER_URL = '';  // (1)!
                                                                                                                                                                                                    -  LIVEKIT_URL = ''; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The name of the room to join.
                                                                                                                                                                                                    -  roomName = 'openvidu-toolbar-panel-buttons';  // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // The token used to join the room.
                                                                                                                                                                                                    -  token!: string; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -    this.configureUrls();
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  private configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.APPLICATION_SERVER_URL =
                                                                                                                                                                                                    -          'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from local development
                                                                                                                                                                                                    -    if (!this.LIVEKIT_URL) {
                                                                                                                                                                                                    -      if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -      } else {
                                                                                                                                                                                                    -        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -      }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Requests a token to join the room with the given participant name.
                                                                                                                                                                                                    -  async onTokenRequested(participantName: string) { // (5)!
                                                                                                                                                                                                    -    const { token } = await this.getToken(this.roomName, participantName);
                                                                                                                                                                                                    -    this.token = token;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Method to handle button click
                                                                                                                                                                                                    -  onButtonClicked() { // (6)!
                                                                                                                                                                                                    -    alert('button clicked');
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  // Retrieves a token to join the room with the given name and participant name.
                                                                                                                                                                                                    -  getToken(roomName: string, participantName: string): Promise<any> { // (7)!
                                                                                                                                                                                                    -    // Requesting token to the server application
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. getToken method that requests a token to the server application.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • getToken method that requests a token to the server application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    :root {
                                                                                                                                                                                                    -    /* Basic colors */
                                                                                                                                                                                                    -    --ov-background-color: #303030; // Background color
                                                                                                                                                                                                    -    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Text colors */
                                                                                                                                                                                                    -    --ov-text-primary-color: #ffffff; // Text color over primary background
                                                                                                                                                                                                    -    --ov-text-surface-color: #1d1d1d; // Text color over surface background
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Action colors */
                                                                                                                                                                                                    -    --ov-primary-action-color: #273235; // Primary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.
                                                                                                                                                                                                    -    --ov-accent-action-color: #0089ab; // Color for highlighted elements
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Status colors */
                                                                                                                                                                                                    -    --ov-error-color: #eb5144; // Error color
                                                                                                                                                                                                    -    --ov-warn-color: #ffba53; // Warning color
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    /* Radius */
                                                                                                                                                                                                    -    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons
                                                                                                                                                                                                    -    --ov-leave-button-radius: 10px; // Radius for leave button
                                                                                                                                                                                                    -    --ov-video-radius: 5px; // Radius for videos
                                                                                                                                                                                                    -    --ov-surface-radius: 5px; // Radius for surfaces
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding custom buttons to the toolbar#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalPanelButtons that allows you to add custom buttons to the toolbar. This directive can be used to add buttons to the right part of the toolbar.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    @Component({
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    template: `
                                                                                                                                                                                                    -        <ov-videoconference
                                                                                                                                                                                                    -            [token]="token"
                                                                                                                                                                                                    -            [livekitUrl]="LIVEKIT_URL"
                                                                                                                                                                                                    -            [toolbarDisplayRoomName]="false"
                                                                                                                                                                                                    -            (onTokenRequested)="onTokenRequested($event)"
                                                                                                                                                                                                    -        >
                                                                                                                                                                                                    -            <div *ovToolbarAdditionalPanelButtons style="text-align: center;">
                                                                                                                                                                                                    -                <button mat-icon-button (click)="onButtonClicked()">
                                                                                                                                                                                                    -                    <mat-icon>star</mat-icon>
                                                                                                                                                                                                    -                </button>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -        </ov-videoconference>
                                                                                                                                                                                                    -    `,
                                                                                                                                                                                                    -    styles: [''],
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent {
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add a custom button to the right part of the toolbar and is displayed as a star icon, and the onButtonClicked method is called when the button is clicked.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/android/index.html b/3.0.0-beta3/docs/tutorials/application-client/android/index.html deleted file mode 100644 index 7e30b91d..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/android/index.html +++ /dev/null @@ -1,5091 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Android Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Android Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built for Android, using Kotlin, that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit Android Kotlin SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Android project has been generated with Android Studio. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the app/src/main/java directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • MainActivity.kt: This file defines the main activity of the application, which allows the user to join a video call room by providing a room name and a user name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • RoomLayoutActivity.kt: Activity responsible for managing the video call room, including publishing and subscribing to video and audio tracks.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • PaticipantAdapter.kt and ParticipantViewHolder.kt: These files define the Adapter and ViewHolder for the RecyclerView that displays the participants video tracks in the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Urls.kt: Object that contains the URLs of the application server and the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • ConfigureUrlsActivity.kt: Activity that allows the user to configure the URLs of the application server and the LiveKit server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The activity layout files are located in the app/src/main/res/layout directory.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use LiveKit in an Android application, you need to add the LiveKit Android Kotlin SDK as a dependency in the build.gradle.kts file. This dependecy provides the necessary classes and methods to interact with the LiveKit server:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    build.gradle.kts
                                                                                                                                                                                                    dependencies {
                                                                                                                                                                                                    -    implementation 'io.livekit:livekit-android:2.5.0'
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You will also need JitPack as a repository in the settings.gradle.kts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    settings.gradle.kts
                                                                                                                                                                                                    dependencyResolutionManagement {
                                                                                                                                                                                                    -    //...
                                                                                                                                                                                                    -    repositories {
                                                                                                                                                                                                    -        google()
                                                                                                                                                                                                    -        mavenCentral()
                                                                                                                                                                                                    -        maven("https://jitpack.io")
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Android specific requirements#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to be able to test the application on an Android device, the application must ask for the necessary permissions to access the device's camera and microphone.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    First, you need to add the following permissions to the AndroidManifest.xml file located in the app/src/main directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                     9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    <uses-permission android:name="android.permission.INTERNET" />
                                                                                                                                                                                                    -<uses-permission android:name="android.permission.CAMERA" />
                                                                                                                                                                                                    -<uses-permission android:name="android.permission.RECORD_AUDIO" />
                                                                                                                                                                                                    -<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, the app need to request these permissions when the user joins the video call room. This is done in the RoomLayoutActivity.kt file by calling the requestNeededPermissions method in the onCreate method:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun requestNeededPermissions(onHasPermissions: () -> Unit) {
                                                                                                                                                                                                    -    val requestPermissionLauncher =
                                                                                                                                                                                                    -        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grants ->
                                                                                                                                                                                                    -            var hasDenied = false
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Check if any permissions weren't granted
                                                                                                                                                                                                    -            for (grant in grants.entries) {
                                                                                                                                                                                                    -                if (!grant.value) {
                                                                                                                                                                                                    -                    Toast.makeText(this, "Missing permission: ${grant.key}", Toast.LENGTH_SHORT)
                                                                                                                                                                                                    -                        .show()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                    hasDenied = true
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            if (!hasDenied) {
                                                                                                                                                                                                    -                onHasPermissions()
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Assemble the needed permissions to request
                                                                                                                                                                                                    -    val neededPermissions =
                                                                                                                                                                                                    -        listOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA).filter {
                                                                                                                                                                                                    -            ContextCompat.checkSelfPermission(
                                                                                                                                                                                                    -                this, it
                                                                                                                                                                                                    -            ) == PackageManager.PERMISSION_DENIED
                                                                                                                                                                                                    -        }.toTypedArray()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (neededPermissions.isNotEmpty()) {
                                                                                                                                                                                                    -        requestPermissionLauncher.launch(neededPermissions)
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        onHasPermissions()
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuring URLs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Urls.kt file defines an object that contains the following URLs required for the application:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. In case you are running OpenVidu locally, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter the URLs when the application starts. This configuration is managed in the ConfigureUrlsActivity.kt file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    When the user clicks the Save button, the onSaveUrls() method is called, which saves the URLs in the Urls object and finishes the activity, returning to the MainActivity:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    ConfigureUrlsActivity.kt
                                                                                                                                                                                                    24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    private fun onSaveUrls() {
                                                                                                                                                                                                    -    val serverUrl = binding.serverUrl.text.toString()
                                                                                                                                                                                                    -    val livekitUrl = binding.livekitUrl.text.toString()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (serverUrl.isNotEmpty() && livekitUrl.isNotEmpty()) {
                                                                                                                                                                                                    -        Urls.livekitUrl = binding.livekitUrl.text.toString()
                                                                                                                                                                                                    -        Urls.applicationServerUrl = binding.serverUrl.text.toString()
                                                                                                                                                                                                    -        finish()
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show()
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before joining a room, the user must provide a room name and a user name. After the user specifies them, when they click the Join button, the navigateToRoomLayoutActivity() method of the MainActivity.kt file is called, which simply set the values of the participant name and room name in the intent and starts the RoomLayoutActivity:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    MainActivity.kt
                                                                                                                                                                                                    33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    private fun navigateToRoomLayoutActivity() {
                                                                                                                                                                                                    -    binding.joinButton.isEnabled = false
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    val participantName = binding.participantName.text.toString()
                                                                                                                                                                                                    -    val roomName = binding.roomName.text.toString()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (participantName.isNotEmpty() && roomName.isNotEmpty()) {
                                                                                                                                                                                                    -        val intent = Intent(this, RoomLayoutActivity::class.java)
                                                                                                                                                                                                    -        intent.putExtra("participantName", participantName)
                                                                                                                                                                                                    -        intent.putExtra("roomName", roomName)
                                                                                                                                                                                                    -        startActivity(intent)
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show()
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    binding.joinButton.isEnabled = true
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the RoomLayoutActivity.kt file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    data class TrackInfo( // (1)!
                                                                                                                                                                                                    -    val track: VideoTrack,
                                                                                                                                                                                                    -    val participantIdentity: String,
                                                                                                                                                                                                    -    val isLocal: Boolean = false
                                                                                                                                                                                                    -)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -class RoomLayoutActivity : AppCompatActivity() {
                                                                                                                                                                                                    -    private lateinit var binding: ActivityRoomLayoutBinding // (2)!
                                                                                                                                                                                                    -    private lateinit var participantAdapter: ParticipantAdapter // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    private lateinit var room: Room // (4)!
                                                                                                                                                                                                    -    private val participantTracks: MutableList<TrackInfo> = mutableListOf() // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    private val client = HttpClient(CIO) { // (6)!
                                                                                                                                                                                                    -        expectSuccess = true
                                                                                                                                                                                                    -        install(ContentNegotiation) {
                                                                                                                                                                                                    -            json()
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. TrackInfo data class, which groups a video track with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The binding object for the activity layout.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The adapter for the RecyclerView that displays the participants' video tracks.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. A list of TrackInfo objects, which represent the video tracks of the participants in the room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. The HTTP client used to make requests to the application server.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The RoomLayoutActivity.kt file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantTracks: A list of TrackInfo objects, which represent the video tracks of the participants in the room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the activity is created, the onCreate method is called. This method initializes the activity layout, create a Room object, initializes the RecyclerView and request needed permissions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    override fun onCreate(savedInstanceState: Bundle?) {
                                                                                                                                                                                                    -    super.onCreate(savedInstanceState)
                                                                                                                                                                                                    -    binding = ActivityRoomLayoutBinding.inflate(layoutInflater)
                                                                                                                                                                                                    -    setContentView(binding.root)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    binding.loader.visibility = View.VISIBLE
                                                                                                                                                                                                    -    binding.leaveButton.setOnClickListener {
                                                                                                                                                                                                    -        leaveRoom()
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Create Room object
                                                                                                                                                                                                    -    room = LiveKit.create(applicationContext)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    initRecyclerView()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Check for audio and camera permissions before connecting to the room
                                                                                                                                                                                                    -    requestNeededPermissions { connectToRoom() }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the application check if the user has granted permissions, the connectToRoom() method is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun connectToRoom() {
                                                                                                                                                                                                    -    // Get the room name and participant name from the intent
                                                                                                                                                                                                    -    val participantName = intent.getStringExtra("participantName") ?: "Participant1" // (1)!
                                                                                                                                                                                                    -    val roomName = intent.getStringExtra("roomName") ?: "Test Room"
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    binding.roomName.text = roomName // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    lifecycleScope.launch {
                                                                                                                                                                                                    -        // Specify the actions when events take place in the room
                                                                                                                                                                                                    -        launch {
                                                                                                                                                                                                    -            room.events.collect { event ->
                                                                                                                                                                                                    -                when (event) {
                                                                                                                                                                                                    -                    // On every new Track received...
                                                                                                                                                                                                    -                    is RoomEvent.TrackSubscribed -> onTrackSubscribed(event) // (3)!
                                                                                                                                                                                                    -                    // On every new Track destroyed...
                                                                                                                                                                                                    -                    is RoomEvent.TrackUnsubscribed -> onTrackUnsubscribed(event) // (4)!
                                                                                                                                                                                                    -                    else -> {}
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        try {
                                                                                                                                                                                                    -            // Get token from your application server with the room name and participant name
                                                                                                                                                                                                    -            val token = getToken(roomName, participantName) // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -            room.connect(Urls.livekitUrl, token) // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Publish your camera and microphone
                                                                                                                                                                                                    -            val localParticipant = room.localParticipant
                                                                                                                                                                                                    -            localParticipant.setMicrophoneEnabled(true) // (7)!
                                                                                                                                                                                                    -            localParticipant.setCameraEnabled(true)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Add local video track to the participantTracks list
                                                                                                                                                                                                    -            launch {
                                                                                                                                                                                                    -                localParticipant::videoTrackPublications.flow
                                                                                                                                                                                                    -                    .collect { publications ->
                                                                                                                                                                                                    -                        val videoTrack = publications.firstOrNull()?.second as? VideoTrack
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                        if (videoTrack != null) {
                                                                                                                                                                                                    -                            participantTracks.add( // (8)!
                                                                                                                                                                                                    -                                0,
                                                                                                                                                                                                    -                                TrackInfo(videoTrack, participantName, true)
                                                                                                                                                                                                    -                            )
                                                                                                                                                                                                    -                            participantAdapter.notifyItemInserted(0)
                                                                                                                                                                                                    -                        }
                                                                                                                                                                                                    -                    }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            binding.loader.visibility = View.GONE
                                                                                                                                                                                                    -        } catch (e: Exception) {
                                                                                                                                                                                                    -            println("There was an error connecting to the room: ${e.message}")
                                                                                                                                                                                                    -            Toast.makeText(this@RoomLayoutActivity, "Failed to join room", Toast.LENGTH_SHORT)
                                                                                                                                                                                                    -                .show()
                                                                                                                                                                                                    -            leaveRoom()
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Get the room name and participant name from the intent.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Set the room title in the layout.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Event handling for when a track is destroyed.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Publish your camera and microphone.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Add local video track to the participantTracks list
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The connectToRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. It retrieves the room name and participant name from the intent.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Set the room title in the layout.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the participantTracks list if it is a video track and notify the Adapter that a new item has been inserted.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackSubscribed(event: RoomEvent.TrackSubscribed) {
                                                                                                                                                                                                      -    val track = event.track
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    // If the track is a video track, add it to the participantTracks list
                                                                                                                                                                                                      -    if (track is VideoTrack) {
                                                                                                                                                                                                      -        participantTracks.add(TrackInfo(track, event.participant.identity!!.value))
                                                                                                                                                                                                      -        participantAdapter.notifyItemInserted(participantTracks.size - 1)
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the video track from the participantTracks list and notify the Adapter that an item has been removed.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackUnsubscribed(event: RoomEvent.TrackUnsubscribed) {
                                                                                                                                                                                                      -    val track = event.track
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    // If the track is a video track, remove it from the participantTracks list
                                                                                                                                                                                                      -    if (track is VideoTrack) {
                                                                                                                                                                                                      -        val index = participantTracks.indexOfFirst { it.track.sid == track.sid }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -        if (index != -1) {
                                                                                                                                                                                                      -            participantTracks.removeAt(index)
                                                                                                                                                                                                      -            participantAdapter.notifyItemRemoved(index)
                                                                                                                                                                                                      -        }
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -private suspend fun getToken(roomName: String, participantName: String): String {
                                                                                                                                                                                                      -    val response = client.post(Urls.applicationServerUrl + "token") {
                                                                                                                                                                                                      -        contentType(ContentType.Application.Json)
                                                                                                                                                                                                      -        setBody(TokenRequest(participantName, roomName))
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -    return response.body<TokenResponse>().token
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This method sends a POST request using Ktor Client to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It publishes the camera and microphone tracks to the room using setMicrophoneEnabled() and setCameraEnabled() methods from room.localParticipant.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. It adds the local video track to the participantTracks list.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to display the video tracks of the participants in the room, the RoomLayoutActivity uses a RecyclerView with a custom Adapter and ViewHolder. This allows the application to load and display the video tracks dynamically as they are received.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Whenever a new video track is added to the participantTracks list, the ParticipantAdapter is notified that a new item has been inserted. The ParticipantAdapter then updates the RecyclerView to display the new video track by calling the render method of the ParticipantViewHolder:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    ParticipantViewHolder.kt
                                                                                                                                                                                                    12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    fun render(trackInfo: TrackInfo, room: Room) {
                                                                                                                                                                                                    -    val participantIdentity = if (trackInfo.isLocal) {
                                                                                                                                                                                                    -        trackInfo.participantIdentity + " (You)"
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        trackInfo.participantIdentity
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    binding.identity.text = participantIdentity // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Only initialize the renderer once
                                                                                                                                                                                                    -    if (!used) {
                                                                                                                                                                                                    -        room.initVideoRenderer(binding.renderer) // (2)!
                                                                                                                                                                                                    -        used = true
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    trackInfo.track.addRenderer(binding.renderer) // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Set the participant identity in the layout.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Initialize the video renderer for the participant.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Add the video track to the renderer.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The render method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It sets the participant identity in the layout.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It initializes the video renderer for the participant. This is done only once for each participant.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It adds the video track to the renderer.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    room.disconnect() // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    client.close() // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Go back to the previous activity.
                                                                                                                                                                                                    -    finish() // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -override fun onDestroy() { // (4)!
                                                                                                                                                                                                    -    super.onDestroy()
                                                                                                                                                                                                    -    leaveRoom()
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Close the HTTP client.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Finish the activity and go back to the previous activity.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Call the leaveRoom() method when the activity is destroyed.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It closes the HTTP client.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It finishes the activity and goes back to the previous activity.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The onDestroy() lifecycle method is used to ensure that the user leaves the room when the activity is destroyed.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/angular/index.html b/3.0.0-beta3/docs/tutorials/application-client/angular/index.html deleted file mode 100644 index 14ceb156..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/angular/index.html +++ /dev/null @@ -1,5005 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Angular Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Angular Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Angular that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Angular project has been created using the Angular CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.component.css: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Angular application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install livekit-client
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    type TrackInfo = { // (1)!
                                                                                                                                                                                                    -    trackPublication: RemoteTrackPublication;
                                                                                                                                                                                                    -    participantIdentity: string;
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// When running OpenVidu locally, leave these variables empty
                                                                                                                                                                                                    -// For other deployment type, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -var APPLICATION_SERVER_URL = ''; // (2)!
                                                                                                                                                                                                    -var LIVEKIT_URL = ''; // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({ // (4)!
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [ReactiveFormsModule, AudioComponent, VideoComponent],
                                                                                                                                                                                                    -    templateUrl: './app.component.html',
                                                                                                                                                                                                    -    styleUrl: './app.component.css',
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnDestroy {
                                                                                                                                                                                                    -    roomForm = new FormGroup({ // (5)!
                                                                                                                                                                                                    -        roomName: new FormControl('Test Room', Validators.required),
                                                                                                                                                                                                    -        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    room = signal<Room | undefined>(undefined); // (6)!
                                                                                                                                                                                                    -    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (7)!
                                                                                                                                                                                                    -    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    constructor(private httpClient: HttpClient) {
                                                                                                                                                                                                    -        this.configureUrls();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    configureUrls() {
                                                                                                                                                                                                    -        // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -        if (!APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -            if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -                APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -            } else {
                                                                                                                                                                                                    -                APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -        if (!LIVEKIT_URL) {
                                                                                                                                                                                                    -            if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -                LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -            } else {
                                                                                                                                                                                                    -                LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the application server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The URL of the LiveKit server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. The room object, which represents the video call room.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. The local video track, which represents the user's camera.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    const room = new Room();
                                                                                                                                                                                                    -    this.room.set(room); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    this.room.on(
                                                                                                                                                                                                    -        RoomEvent.TrackSubscribed,
                                                                                                                                                                                                    -        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!
                                                                                                                                                                                                    -            this.remoteTracksMap.update((map) => {
                                                                                                                                                                                                    -                map.set(publication.trackSid, {
                                                                                                                                                                                                    -                    trackPublication: publication,
                                                                                                                                                                                                    -                    participantIdentity: participant.identity,
                                                                                                                                                                                                    -                });
                                                                                                                                                                                                    -                return map;
                                                                                                                                                                                                    -            });
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every new Track destroyed...
                                                                                                                                                                                                    -    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!
                                                                                                                                                                                                    -        this.remoteTracksMap.update((map) => {
                                                                                                                                                                                                    -            map.delete(publication.trackSid);
                                                                                                                                                                                                    -            return map;
                                                                                                                                                                                                    -        });
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the room name and participant name from the form
                                                                                                                                                                                                    -        const roomName = this.roomForm.value.roomName!; // (4)!
                                                                                                                                                                                                    -        const participantName = this.roomForm.value.participantName!;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await this.getToken(roomName, participantName); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone(); // (7)!
                                                                                                                                                                                                    -        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);
                                                                                                                                                                                                    -    } catch (error: any) {
                                                                                                                                                                                                    -        console.log(
                                                                                                                                                                                                    -            'There was an error connecting to the room:',
                                                                                                                                                                                                    -            error?.error?.errorMessage || error?.message || error
                                                                                                                                                                                                    -        );
                                                                                                                                                                                                    -        await this.leaveRoom();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Publish your camera and microphone.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the "Join room" page and showing the "Room" layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It retrieves the room name and participant name from the form.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async getToken(roomName: string, participantName: string): Promise<string> {
                                                                                                                                                                                                      -    const response = await lastValueFrom(
                                                                                                                                                                                                      -        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })
                                                                                                                                                                                                      -    );
                                                                                                                                                                                                      -    return response.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video and Audio Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    <div id="layout-container">
                                                                                                                                                                                                    -    @if (localTrack()) {
                                                                                                                                                                                                    -    <video-component
                                                                                                                                                                                                    -        [track]="localTrack()!"
                                                                                                                                                                                                    -        [participantIdentity]="roomForm.value.participantName!"
                                                                                                                                                                                                    -        [local]="true"
                                                                                                                                                                                                    -    ></video-component>
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {
                                                                                                                                                                                                    -        @if (remoteTrack.trackPublication.kind === 'video') {
                                                                                                                                                                                                    -        <video-component
                                                                                                                                                                                                    -            [track]="remoteTrack.trackPublication.videoTrack!"
                                                                                                                                                                                                    -            [participantIdentity]="remoteTrack.participantIdentity"
                                                                                                                                                                                                    -        ></video-component>
                                                                                                                                                                                                    -        } @else {
                                                                                                                                                                                                    -        <audio-component [track]="remoteTrack.trackPublication.audioTrack!" hidden></audio-component>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                     3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    // (1)!
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -    selector: 'video-component',
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [],
                                                                                                                                                                                                    -    templateUrl: './video.component.html',
                                                                                                                                                                                                    -    styleUrl: './video.component.css',
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class VideoComponent implements AfterViewInit, OnDestroy {
                                                                                                                                                                                                    -    videoElement = viewChild<ElementRef<HTMLVideoElement>>('videoElement'); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!
                                                                                                                                                                                                    -    participantIdentity = input.required<string>(); // (4)!
                                                                                                                                                                                                    -    local = input(false); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngAfterViewInit() {
                                                                                                                                                                                                    -        if (this.videoElement()) {
                                                                                                                                                                                                    -            this.track().attach(this.videoElement()!.nativeElement); // (6)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngOnDestroy() {
                                                                                                                                                                                                    -        this.track().detach(); // (7)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the video element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The participant identity associated with the video track.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Detach the video track when the component is destroyed.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                     3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    // (1)!
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -    selector: 'audio-component',
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [],
                                                                                                                                                                                                    -    templateUrl: './audio.component.html',
                                                                                                                                                                                                    -    styleUrl: './audio.component.css',
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AudioComponent implements AfterViewInit, OnDestroy {
                                                                                                                                                                                                    -    audioElement = viewChild<ElementRef<HTMLAudioElement>>('audioElement'); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngAfterViewInit() {
                                                                                                                                                                                                    -        if (this.audioElement()) {
                                                                                                                                                                                                    -            this.track().attach(this.audioElement()!.nativeElement); // (4)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngOnDestroy() {
                                                                                                                                                                                                    -        this.track().detach(); // (5)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Detach the audio track when the component is destroyed.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await this.room()?.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Reset all variables
                                                                                                                                                                                                    -    this.room.set(undefined); // (2)!
                                                                                                                                                                                                    -    this.localTrack.set(undefined);
                                                                                                                                                                                                    -    this.remoteTracksMap.set(new Map());
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@HostListener('window:beforeunload') // (3)!
                                                                                                                                                                                                    -async ngOnDestroy() {
                                                                                                                                                                                                    -    // On window closed or component destroyed, leave the room
                                                                                                                                                                                                    -    await this.leaveRoom();
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Reset all variables.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Call the leaveRoom() method when the user closes the browser window or navigates to another page.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It resets all variables.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The window.onbeforeunload event and the ngOnDestroy() lifecycle hook are used to ensure that the user leaves the room when the browser window is closed or the component is destroyed.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/electron/index.html b/3.0.0-beta3/docs/tutorials/application-client/electron/index.html deleted file mode 100644 index c7f4fd1c..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/electron/index.html +++ /dev/null @@ -1,4822 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Electron Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Electron Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Electron that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Electron project has been created using electron-forge. As an Electron application, the code is divided into two main parts, the main process and the renderer process. The most important files are located within the src/ directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • index.js: This file is the entry point (main process) for the Electron application. It creates the main window and loads the index.html file.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.js: This file constitutes the renderer process code, responsible for the application UI and logic. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Electron application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install livekit-client
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    1
                                                                                                                                                                                                    -2
                                                                                                                                                                                                    -3
                                                                                                                                                                                                    -4
                                                                                                                                                                                                    -5
                                                                                                                                                                                                    -6
                                                                                                                                                                                                    -7
                                                                                                                                                                                                    const { Room, RoomEvent } = require("livekit-client"); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// Configure these constants with correct URLs depending on your deployment
                                                                                                                                                                                                    -const APPLICATION_SERVER_URL = "http://localhost:6080/"; // (2)!
                                                                                                                                                                                                    -const LIVEKIT_URL = "ws://localhost:7880/"; // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -var room; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import the Room and RoomEvent classes from the livekit-client package.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the application server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The URL of the LiveKit server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You should configure APPLICATION_SERVER_URL and LIVEKIT_URL constants with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                     9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // Disable 'Join' button
                                                                                                                                                                                                    -    document.getElementById("join-button").disabled = true;
                                                                                                                                                                                                    -    document.getElementById("join-button").innerText = "Joining...";
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    room = new Room(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        // (2)!
                                                                                                                                                                                                    -        addTrack(track, participant.identity);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every new Track destroyed...
                                                                                                                                                                                                    -    room.on(RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        // (3)!
                                                                                                                                                                                                    -        track.detach();
                                                                                                                                                                                                    -        document.getElementById(track.sid)?.remove();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (track.kind === "video") {
                                                                                                                                                                                                    -            removeVideoContainer(participant.identity);
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the room name and participant name from the form
                                                                                                                                                                                                    -        const roomName = document.getElementById("room-name").value; // (4)!
                                                                                                                                                                                                    -        const userName = document.getElementById("participant-name").value;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await getToken(roomName, userName); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Hide the 'Join room' page and show the 'Room' page
                                                                                                                                                                                                    -        document.getElementById("room-title").innerText = roomName; // (7)!
                                                                                                                                                                                                    -        document.getElementById("join").hidden = true;
                                                                                                                                                                                                    -        document.getElementById("room").hidden = false;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone(); // (8)!
                                                                                                                                                                                                    -        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;
                                                                                                                                                                                                    -        addTrack(localVideoTrack, userName, true);
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.log("There was an error connecting to the room:", error.message);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Hide the "Join room" page and show the "Room" page.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Publish your camera and microphone.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      59
                                                                                                                                                                                                      -60
                                                                                                                                                                                                      -61
                                                                                                                                                                                                      -62
                                                                                                                                                                                                      -63
                                                                                                                                                                                                      -64
                                                                                                                                                                                                      -65
                                                                                                                                                                                                      -66
                                                                                                                                                                                                      -67
                                                                                                                                                                                                      -68
                                                                                                                                                                                                      -69
                                                                                                                                                                                                      -70
                                                                                                                                                                                                      -71
                                                                                                                                                                                                      -72
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {
                                                                                                                                                                                                      -    const element = track.attach(); // (1)!
                                                                                                                                                                                                      -    element.id = track.sid;
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    /* If the track is a video track, we create a container and append the video element to it
                                                                                                                                                                                                      -    with the participant's identity */
                                                                                                                                                                                                      -    if (track.kind === "video") {
                                                                                                                                                                                                      -        const videoContainer = createVideoContainer(participantIdentity, local);
                                                                                                                                                                                                      -        videoContainer.append(element);
                                                                                                                                                                                                      -        appendParticipantData(videoContainer, participantIdentity + (local ? " (You)" : ""));
                                                                                                                                                                                                      -    } else {
                                                                                                                                                                                                      -        document.getElementById("layout-container").append(element);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {
                                                                                                                                                                                                      -    const videoContainer = document.createElement("div");
                                                                                                                                                                                                      -    videoContainer.id = `camera-${participantIdentity}`;
                                                                                                                                                                                                      -    videoContainer.className = "video-container";
                                                                                                                                                                                                      -    const layoutContainer = document.getElementById("layout-container");
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (local) {
                                                                                                                                                                                                      -        layoutContainer.prepend(videoContainer);
                                                                                                                                                                                                      -    } else {
                                                                                                                                                                                                      -        layoutContainer.append(videoContainer);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    return videoContainer;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -function appendParticipantData(videoContainer, participantIdentity) {
                                                                                                                                                                                                      -    const dataElement = document.createElement("div");
                                                                                                                                                                                                      -    dataElement.className = "participant-data";
                                                                                                                                                                                                      -    dataElement.innerHTML = `<p>${participantIdentity}</p>`;
                                                                                                                                                                                                      -    videoContainer.prepend(dataElement);
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {
                                                                                                                                                                                                      -    const videoContainer = document.getElementById(`camera-${participantIdentity}`);
                                                                                                                                                                                                      -    videoContainer?.remove();
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It retrieves the room name and participant name from the form.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async function getToken(roomName, participantName) {
                                                                                                                                                                                                      -    const response = await fetch(APPLICATION_SERVER_URL + "token", {
                                                                                                                                                                                                      -        method: "POST",
                                                                                                                                                                                                      -        headers: {
                                                                                                                                                                                                      -            "Content-Type": "application/json"
                                                                                                                                                                                                      -        },
                                                                                                                                                                                                      -        body: JSON.stringify({
                                                                                                                                                                                                      -            roomName,
                                                                                                                                                                                                      -            participantName
                                                                                                                                                                                                      -        })
                                                                                                                                                                                                      -    });
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (!response.ok) {
                                                                                                                                                                                                      -        const error = await response.json();
                                                                                                                                                                                                      -        throw new Error(`Failed to get token: ${error.errorMessage}`);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const token = await response.json();
                                                                                                                                                                                                      -    return token.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It updates the UI to hide the "Join room" page and show the "Room" layout.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    -89
                                                                                                                                                                                                    -90
                                                                                                                                                                                                    -91
                                                                                                                                                                                                    -92
                                                                                                                                                                                                    -93
                                                                                                                                                                                                    async function leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await room.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Remove all HTML elements inside the layout container
                                                                                                                                                                                                    -    removeAllLayoutElements(); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Back to 'Join room' page
                                                                                                                                                                                                    -    document.getElementById("join").hidden = false; // (3)!
                                                                                                                                                                                                    -    document.getElementById("room").hidden = true;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Enable 'Join' button
                                                                                                                                                                                                    -    document.getElementById("join-button").disabled = false;
                                                                                                                                                                                                    -    document.getElementById("join-button").innerText = "Join!";
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// (4)!
                                                                                                                                                                                                    -window.onbeforeunload = () => {
                                                                                                                                                                                                    -    room?.disconnect();
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Show the "Join room" page and hide the "Room" layout.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It shows the "Join room" page and hides the "Room" layout.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/index.html b/3.0.0-beta3/docs/tutorials/application-client/index.html deleted file mode 100644 index 9f342330..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/index.html +++ /dev/null @@ -1,4002 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Application Client Tutorials - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Application Client Tutorials#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Every application client below shares the same core functionality:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Users request a LiveKit token to any application server to connect to a room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Users may publish their camera, microphone and screen-share.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Users automatically subscribe to all media published by other users.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Users may leave the room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    - - - - -

                                                                                                                                                                                                    Every application client below is interchangeable with the others, because:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • All of them are compatible with each other, meaning that participants are able to join the same LiveKit room from any of the client applications.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • All of them are compatible with any application server, meaning that they can request a LiveKit token from any of the server applications.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/ionic/index.html b/3.0.0-beta3/docs/tutorials/application-client/ionic/index.html deleted file mode 100644 index bd8f49bf..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/ionic/index.html +++ /dev/null @@ -1,5213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ionic Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Ionic Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Ionic, using Angular and Capacitor, that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Ionic project has been created using the Ionic CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • app.component.scss: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Ionic application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install livekit-client
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    type TrackInfo = { // (1)!
                                                                                                                                                                                                    -    trackPublication: RemoteTrackPublication;
                                                                                                                                                                                                    -    participantIdentity: string;
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// When running OpenVidu locally and launching app in web browser, leave these variables empty
                                                                                                                                                                                                    -// For other deployment type or when launching app in a mobile device, configure them with correct URLs
                                                                                                                                                                                                    -// If you leave them empty when launching app in a mobile device, the user will be prompted to enter the URLs
                                                                                                                                                                                                    -var APPLICATION_SERVER_URL = ''; // (2)!
                                                                                                                                                                                                    -var LIVEKIT_URL = ''; // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@Component({ // (4)!
                                                                                                                                                                                                    -    selector: 'app-root',
                                                                                                                                                                                                    -    templateUrl: 'app.component.html',
                                                                                                                                                                                                    -    styleUrl: 'app.component.scss',
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [
                                                                                                                                                                                                    -        IonApp,
                                                                                                                                                                                                    -        VideoComponent,
                                                                                                                                                                                                    -        AudioComponent,
                                                                                                                                                                                                    -        ReactiveFormsModule,
                                                                                                                                                                                                    -        IonHeader,
                                                                                                                                                                                                    -        IonToolbar,
                                                                                                                                                                                                    -        IonTitle,
                                                                                                                                                                                                    -        IonButtons,
                                                                                                                                                                                                    -        IonButton,
                                                                                                                                                                                                    -        IonIcon,
                                                                                                                                                                                                    -        IonContent,
                                                                                                                                                                                                    -        IonList,
                                                                                                                                                                                                    -        IonItem,
                                                                                                                                                                                                    -        IonInput,
                                                                                                                                                                                                    -        IonFooter,
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AppComponent implements OnDestroy {
                                                                                                                                                                                                    -    roomForm = new FormGroup({ // (5)!
                                                                                                                                                                                                    -        roomName: new FormControl('Test Room', Validators.required),
                                                                                                                                                                                                    -        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    urlsForm = new FormGroup({ // (6)!
                                                                                                                                                                                                    -        serverUrl: new FormControl(APPLICATION_SERVER_URL, Validators.required),
                                                                                                                                                                                                    -        livekitUrl: new FormControl(LIVEKIT_URL, Validators.required),
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    room = signal<Room | undefined>(undefined); // (7)!
                                                                                                                                                                                                    -    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (8)!
                                                                                                                                                                                                    -    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (9)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    settingUrls = signal(false); // (10)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    constructor(private httpClient: HttpClient, private platform: Platform) {
                                                                                                                                                                                                    -        this.configureUrls();
                                                                                                                                                                                                    -        addIcons({
                                                                                                                                                                                                    -            logoGithub,
                                                                                                                                                                                                    -            book,
                                                                                                                                                                                                    -            settings,
                                                                                                                                                                                                    -        });
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    configureUrls() {
                                                                                                                                                                                                    -        const mobileMode = this.platform.is('hybrid');
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // If URLs are not configured and app is launched in a mobile device,
                                                                                                                                                                                                    -        // prompt the user to configure them
                                                                                                                                                                                                    -        if (mobileMode) {
                                                                                                                                                                                                    -            if (!APPLICATION_SERVER_URL || !LIVEKIT_URL) {
                                                                                                                                                                                                    -                this.settingUrls.set(true);
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            // If APPLICATION_SERVER_URL is not configured and app is not launched in a mobile device,
                                                                                                                                                                                                    -            // use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -            if (!APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -                if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -                    APPLICATION_SERVER_URL = 'http://localhost:6080/';
                                                                                                                                                                                                    -                } else {
                                                                                                                                                                                                    -                    APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // If LIVEKIT_URL is not configured and app is not launched in a mobile device,
                                                                                                                                                                                                    -            // use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -            if (!LIVEKIT_URL) {
                                                                                                                                                                                                    -                if (window.location.hostname === 'localhost') {
                                                                                                                                                                                                    -                    LIVEKIT_URL = 'ws://localhost:7880/';
                                                                                                                                                                                                    -                } else {
                                                                                                                                                                                                    -                    LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the application server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The URL of the LiveKit server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. The urlsForm object, which is a form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. The room object, which represents the video call room.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. The local video track, which represents the user's camera.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    19. A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.
                                                                                                                                                                                                    20. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • urlsForm: A form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • settingUrls: A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuring URLs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally and launching the app in a web browser, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type or when launching the app in a mobile device, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In case you are running OpenVidu locally and launching the app in a mobile device, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you leave them empty and app is launched in a mobile device, the user will be prompted to enter the URLs when the application starts:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    const room = new Room();
                                                                                                                                                                                                    -    this.room.set(room); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    this.room.on(
                                                                                                                                                                                                    -        RoomEvent.TrackSubscribed,
                                                                                                                                                                                                    -        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!
                                                                                                                                                                                                    -            this.remoteTracksMap.update((map) => {
                                                                                                                                                                                                    -                map.set(publication.trackSid, {
                                                                                                                                                                                                    -                    trackPublication: publication,
                                                                                                                                                                                                    -                    participantIdentity: participant.identity,
                                                                                                                                                                                                    -                });
                                                                                                                                                                                                    -                return map;
                                                                                                                                                                                                    -            });
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every new Track destroyed...
                                                                                                                                                                                                    -    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!
                                                                                                                                                                                                    -        this.remoteTracksMap.update((map) => {
                                                                                                                                                                                                    -            map.delete(publication.trackSid);
                                                                                                                                                                                                    -            return map;
                                                                                                                                                                                                    -        });
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the room name and participant name from the form
                                                                                                                                                                                                    -        const roomName = this.roomForm.value.roomName!; // (4)!
                                                                                                                                                                                                    -        const participantName = this.roomForm.value.participantName!;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await this.getToken(roomName, participantName); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone(); // (7)!
                                                                                                                                                                                                    -        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);
                                                                                                                                                                                                    -    } catch (error: any) {
                                                                                                                                                                                                    -        console.log(
                                                                                                                                                                                                    -            'There was an error connecting to the room:',
                                                                                                                                                                                                    -            error?.error?.errorMessage || error?.message || error
                                                                                                                                                                                                    -        );
                                                                                                                                                                                                    -        await this.leaveRoom();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Publish your camera and microphone.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the "Join room" page and showing the "Room" layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It retrieves the room name and participant name from the form.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async getToken(roomName: string, participantName: string): Promise<string> {
                                                                                                                                                                                                      -    const response = await lastValueFrom(
                                                                                                                                                                                                      -        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })
                                                                                                                                                                                                      -    );
                                                                                                                                                                                                      -    return response.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video and Audio Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    <div id="layout-container">
                                                                                                                                                                                                    -    @if (localTrack()) {
                                                                                                                                                                                                    -    <video-component
                                                                                                                                                                                                    -        [track]="localTrack()!"
                                                                                                                                                                                                    -        [participantIdentity]="roomForm.value.participantName!"
                                                                                                                                                                                                    -        [local]="true"
                                                                                                                                                                                                    -    ></video-component>
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {
                                                                                                                                                                                                    -        @if (remoteTrack.trackPublication.kind === 'video') {
                                                                                                                                                                                                    -        <video-component
                                                                                                                                                                                                    -            [track]="remoteTrack.trackPublication.videoTrack!"
                                                                                                                                                                                                    -            [participantIdentity]="remoteTrack.participantIdentity"
                                                                                                                                                                                                    -        ></video-component>
                                                                                                                                                                                                    -        } @else {
                                                                                                                                                                                                    -        <audio-component [track]="remoteTrack.trackPublication.audioTrack!" hidden></audio-component>
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                     3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    // (1)!
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -    selector: "video-component",
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [],
                                                                                                                                                                                                    -    templateUrl: "./video.component.html",
                                                                                                                                                                                                    -    styleUrl: "./video.component.css"
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class VideoComponent implements AfterViewInit, OnDestroy {
                                                                                                                                                                                                    -    videoElement = viewChild<ElementRef<HTMLVideoElement>>("videoElement"); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!
                                                                                                                                                                                                    -    participantIdentity = input.required<string>(); // (4)!
                                                                                                                                                                                                    -    local = input(false); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngAfterViewInit() {
                                                                                                                                                                                                    -        if (this.videoElement()) {
                                                                                                                                                                                                    -            this.track().attach(this.videoElement()!.nativeElement); // (6)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngOnDestroy() {
                                                                                                                                                                                                    -        this.track().detach(); // (7)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the video element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The participant identity associated with the video track.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Detach the video track when the component is destroyed.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                     3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    // (1)!
                                                                                                                                                                                                    -@Component({
                                                                                                                                                                                                    -    selector: "audio-component",
                                                                                                                                                                                                    -    standalone: true,
                                                                                                                                                                                                    -    imports: [],
                                                                                                                                                                                                    -    templateUrl: "./audio.component.html",
                                                                                                                                                                                                    -    styleUrl: "./audio.component.css"
                                                                                                                                                                                                    -})
                                                                                                                                                                                                    -export class AudioComponent implements AfterViewInit, OnDestroy {
                                                                                                                                                                                                    -    audioElement = viewChild<ElementRef<HTMLAudioElement>>("audioElement"); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngAfterViewInit() {
                                                                                                                                                                                                    -        if (this.audioElement()) {
                                                                                                                                                                                                    -            this.track().attach(this.audioElement()!.nativeElement); // (4)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ngOnDestroy() {
                                                                                                                                                                                                    -        this.track().detach(); // (5)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Detach the audio track when the component is destroyed.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await this.room()?.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Reset all variables
                                                                                                                                                                                                    -    this.room.set(undefined); // (2)!
                                                                                                                                                                                                    -    this.localTrack.set(undefined);
                                                                                                                                                                                                    -    this.remoteTracksMap.set(new Map());
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -async ngOnDestroy() { // (3)!
                                                                                                                                                                                                    -    // On window closed or component destroyed, leave the room
                                                                                                                                                                                                    -    await this.leaveRoom();
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Reset all variables.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Call the leaveRoom() method when the component is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It resets all variables.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ngOnDestroy() lifecycle hook is used to ensure that the user leaves the room when the component is destroyed.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Specific mobile requirements#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to be able to test the application on an Android or iOS device, the application must ask for the necessary permissions to access the device's camera and microphone. These permissions are requested when the user joins the video call room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application must include the following permissions in the AndroidManifest.xml file located in the android/app/src/main directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                    41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    <uses-permission android:name="android.permission.CAMERA" />
                                                                                                                                                                                                    -<uses-permission android:name="android.permission.RECORD_AUDIO" />
                                                                                                                                                                                                    -<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application must include the following permissions in the Info.plist file located in the ios/App/App directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Info.plist
                                                                                                                                                                                                    48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    <key>NSCameraUsageDescription</key>
                                                                                                                                                                                                    -<string>This Application uses your camera to make video calls.</string>
                                                                                                                                                                                                    -<key>NSMicrophoneUsageDescription</key>
                                                                                                                                                                                                    -<string>This Application uses your microphone to make calls.</string>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/ios/index.html b/3.0.0-beta3/docs/tutorials/application-client/ios/index.html deleted file mode 100644 index c0725718..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/ios/index.html +++ /dev/null @@ -1,4940 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - iOS Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    iOS Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built for iOS, using Swift, that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit Swift SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Understanding the Code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This iOS project, created with Xcode and written in Swift, includes various files and directories. For this tutorial, focus on the following key components within the openvidu-ios/Shared directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • OpenViduApp.swift: Initializes the application and sets up the main view.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Support: Contains files for secure storage, token management, and other support functions.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Utils: Includes utility files like HttpClient.swift for HTTP networking.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Views: Houses the user interface components of the application.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Contexts: Manages application state and room contexts for LiveKit interaction.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Assets.xcassets: Stores images and color assets used in the app.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Integrating LiveKit#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use LiveKit in your iOS app, you need to add the LiveKit Swift SDK as a Swift Package. You can do this using either Package.swift or Xcode.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding LiveKit via Package.swift#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Open your Package.swift file.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Add LiveKit to the dependencies array.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Include LiveKit in the targets array.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Example Package.swift:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    // swift-tools-version:5.3
                                                                                                                                                                                                    -import PackageDescription
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -let package = Package(
                                                                                                                                                                                                    -    name: "MyApp",
                                                                                                                                                                                                    -    platforms: [.iOS(.v14)],
                                                                                                                                                                                                    -    dependencies: [
                                                                                                                                                                                                    -        .package(name: "LiveKit", url: "https://github.com/livekit/client-sdk-swift.git", .upToNextMajor(from: "2.0.12"))
                                                                                                                                                                                                    -    ],
                                                                                                                                                                                                    -    targets: [
                                                                                                                                                                                                    -        .target(
                                                                                                                                                                                                    -            name: "MyApp",
                                                                                                                                                                                                    -            dependencies: ["LiveKit"]
                                                                                                                                                                                                    -        )
                                                                                                                                                                                                    -    ]
                                                                                                                                                                                                    -)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Adding LiveKit via Xcode#

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Open your Xcode project.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Go to Project Settings.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Select the Swift Packages tab.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Click the + button to add a new package.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Enter the URL: https://github.com/livekit/client-sdk-swift.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Choose the version you want, such as "Up to Next Major Version" with 2.0.12.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    iOS Specific Requirements#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To test the application on an iOS device, you need to ensure it has permission to access the camera and microphone. These configurations are already included in this project. However, if you're starting a new project, follow these steps:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Add Permissions to Info.plist

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Include the following keys in your Info.plist file to request access to the camera and microphone:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      <key>NSCameraUsageDescription</key>
                                                                                                                                                                                                      -<string>$(PRODUCT_NAME) needs camera access to capture and transmit video</string>
                                                                                                                                                                                                      -<key>NSMicrophoneUsageDescription</key>
                                                                                                                                                                                                      -<string>$(PRODUCT_NAME) needs microphone access to capture and transmit audio</string>
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Automatic Permission Requests

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app will automatically request these permissions when it runs.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Check Permissions

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To verify if the permissions were granted, use the AVCaptureDevice.requestAccess(for: .video) method:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      AVCaptureDevice.requestAccess(for: .video) { granted in
                                                                                                                                                                                                      -    if granted {
                                                                                                                                                                                                      -        print("Camera access granted")
                                                                                                                                                                                                      -    } else {
                                                                                                                                                                                                      -        print("Camera access denied")
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configuring URLs#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ConfigureUrlsView.swift file defines a SwiftUI view for configuring the URLs required for the application:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server used to obtain tokens for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server used to connect to the video call room and handle video communication.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. If you are running OpenVidu locally, you can set applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www represents the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter them when the application starts. This configuration is managed in the ConfigureUrlsView.swift file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    When the user clicks the Save button, the LKButton action triggers the validation and saves the URLs into the AppContext and RoomContext. The ConfigureUrlsView handles this logic:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    ConfigureUrlsView.swift
                                                                                                                                                                                                    28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    LKButton(title: "Save") {
                                                                                                                                                                                                    -    Task.detached { @MainActor in
                                                                                                                                                                                                    -        let isApplicationServerValid = isValidURL(self.applicationServerUrl)
                                                                                                                                                                                                    -        let isLivekitUrlValid = isValidURL(self.livekitUrl)
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if !isApplicationServerValid || !isLivekitUrlValid {
                                                                                                                                                                                                    -            print("Invalid URLs")
                                                                                                                                                                                                    -            errorMessage = "There was an error with the URL values"
                                                                                                                                                                                                    -            return
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        appCtx.applicationServerUrl = self.applicationServerUrl
                                                                                                                                                                                                    -        roomCtx.livekitUrl = self.livekitUrl
                                                                                                                                                                                                    -        errorMessage = ""
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    In this code snippet, the isValidURL function checks the validity of the URLs. If both URLs are valid, they are saved into the appCtx and roomCtx contexts. If any URL is invalid, an error message is displayed.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Before joining a room, the ConnectView.swift defines the view for the connection screen. It includes a logo, text fields for participant name and room name, and buttons for joining the room and resetting URLs.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    After define the participant and room name, the user can click the Join button to connect to the room. This action triggers the connectToRoom method asynchronously:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    ConnectView.swift
                                                                                                                                                                                                    func connectToRoom() async {
                                                                                                                                                                                                    -    let livekitUrl = roomCtx.livekitUrl
                                                                                                                                                                                                    -    let roomName = roomCtx.name
                                                                                                                                                                                                    -    let participantName = roomCtx.localParticipantName
                                                                                                                                                                                                    -    let applicationServerUrl = appCtx.applicationServerUrl
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    guard !livekitUrl.isEmpty, !roomName.isEmpty else {
                                                                                                                                                                                                    -        print("LiveKit URL or room name is empty")
                                                                                                                                                                                                    -        return
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    do {
                                                                                                                                                                                                    -        let token = try await httpService.getToken(
                                                                                                                                                                                                    -            applicationServerUrl: applicationServerUrl, roomName: roomName,
                                                                                                                                                                                                    -            participantName: participantName)// (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if token.isEmpty {
                                                                                                                                                                                                    -            print("Received empty token")
                                                                                                                                                                                                    -            return
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        roomCtx.token = token
                                                                                                                                                                                                    -        print("Connecting to room...")
                                                                                                                                                                                                    -        try await roomCtx.connect() // (2)!
                                                                                                                                                                                                    -        print("Room connected")
                                                                                                                                                                                                    -        await enableCameraAndMicrophone() // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    } catch {
                                                                                                                                                                                                    -        print("Failed to get token: \(error.localizedDescription)")
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -func enableCameraAndMicrophone() async {
                                                                                                                                                                                                    -    do {
                                                                                                                                                                                                    -        try await room.localParticipant.setCamera(enabled: true) // (4)!
                                                                                                                                                                                                    -        try await room.localParticipant.setMicrophone(enabled: true) // (5)!
                                                                                                                                                                                                    -    } catch {
                                                                                                                                                                                                    -        print("Error enabling camera and microphone: \(error.localizedDescription)")
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The getToken method is called to request a token from the application server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The connect method is called to connect to the room using the LiveKit URL and the token.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The enableCameraAndMicrophone method is called to enable the camera and microphone for the local participant.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The setCamera method is called to enable the camera for the local participant.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The setMicrophone method is called to enable the microphone for the local participant.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The OpenViduApp.swift handle the navigation page. When room status is connected, the user is redirected to the RoomView:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    OpenViduApp.swift
                                                                                                                                                                                                    struct RoomSwitchView: View {
                                                                                                                                                                                                    -    @EnvironmentObject var appCtx: AppContext
                                                                                                                                                                                                    -    @EnvironmentObject var roomCtx: RoomContext
                                                                                                                                                                                                    -    @EnvironmentObject var room: Room
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var shouldShowRoomView: Bool {
                                                                                                                                                                                                    -        room.connectionState == .connected || room.connectionState == .reconnecting
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var shouldShowConfigureUrlsView: Bool {
                                                                                                                                                                                                    -        appCtx.applicationServerUrl.isEmpty || roomCtx.livekitUrl.isEmpty
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var body: some View {
                                                                                                                                                                                                    -        ZStack {
                                                                                                                                                                                                    -            Color.black
                                                                                                                                                                                                    -                .ignoresSafeArea()
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Navigation logic
                                                                                                                                                                                                    -            if shouldShowRoomView {
                                                                                                                                                                                                    -                RoomView() // (1)!
                                                                                                                                                                                                    -            } else {
                                                                                                                                                                                                    -                if shouldShowConfigureUrlsView {
                                                                                                                                                                                                    -                    ConfigureUrlsView() // (2)!
                                                                                                                                                                                                    -                } else {
                                                                                                                                                                                                    -                    ConnectView() // (3)!
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        .navigationTitle(computeTitle())
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. If the room is connected, the user is redirected to the RoomView.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. If the URLs are not configured, the user is redirected to the ConfigureUrlsView.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. If the room is not connected and the URLs are configured, the user is redirected to the ConnectView.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To display the video tracks of participants in the room, the RoomView.swift uses various SwiftUI views and custom components. This approach allows the application to dynamically load and display the video tracks as they are received.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    struct RoomView: View {
                                                                                                                                                                                                    -    @EnvironmentObject var appCtx: AppContext
                                                                                                                                                                                                    -    @EnvironmentObject var roomCtx: RoomContext
                                                                                                                                                                                                    -    @EnvironmentObject var room: Room
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    @State var isCameraPublishingBusy = false
                                                                                                                                                                                                    -    @State var isMicrophonePublishingBusy = false
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    func content(geometry: GeometryProxy) -> some View {
                                                                                                                                                                                                    -        VStack {
                                                                                                                                                                                                    -            // ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -            // Display Participant layout
                                                                                                                                                                                                    -            HorVStack(axis: geometry.isTall ? .vertical : .horizontal, spacing: 5) {
                                                                                                                                                                                                    -                Group {
                                                                                                                                                                                                    -                    ParticipantLayout(sortedParticipants(), spacing: 5) { participant in // (1)!
                                                                                                                                                                                                    -                        ParticipantView(participant: participant, videoViewMode: .fill) // (2)!
                                                                                                                                                                                                    -                    }
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -                .frame(
                                                                                                                                                                                                    -                    minWidth: 0,
                                                                                                                                                                                                    -                    maxWidth: .infinity,
                                                                                                                                                                                                    -                    minHeight: 0,
                                                                                                                                                                                                    -                    maxHeight: .infinity
                                                                                                                                                                                                    -                )
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -            .padding(5)
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The ParticipantLayout component is used to display the video tracks of all participants in the room. It receives the sorted list of participants and a closure that returns a ParticipantView for each participant.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The ParticipantView component is used to display the video track of a participant.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The ParticipantView component is responsible for rendering the video track of a participant. It uses the SwiftUIVideoView component to display the video track and the VideoView.LayoutMode enum to define the layout mode.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The LiveKit Swift SDK includes a VideoView class, based on UIKit, specifically designed for rendering video tracks. Additionally, subscribed audio tracks are automatically played by default.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    ParticipantView.swift
                                                                                                                                                                                                    struct ParticipantView: View {
                                                                                                                                                                                                    -    @ObservedObject var participant: Participant
                                                                                                                                                                                                    -    @EnvironmentObject var appCtx: AppContext
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var videoViewMode: VideoView.LayoutMode = .fill
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -     var body: some View {
                                                                                                                                                                                                    -        GeometryReader { geometry in
                                                                                                                                                                                                    -            ZStack(alignment: .bottom) {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                // ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -                // VideoView for the Participant
                                                                                                                                                                                                    -                if let publication = participant.mainVideoPublication,
                                                                                                                                                                                                    -                    !publication.isMuted,
                                                                                                                                                                                                    -                    let track = publication.track as? VideoTrack
                                                                                                                                                                                                    -                {
                                                                                                                                                                                                    -                    ZStack(alignment: .topLeading) {
                                                                                                                                                                                                    -                        SwiftUIVideoView(track, // (1)!
                                                                                                                                                                                                    -                                            layoutMode: videoViewMode,
                                                                                                                                                                                                    -                                            isRendering: $isRendering)
                                                                                                                                                                                                    -                    }
                                                                                                                                                                                                    -                }
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -     }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The SwiftUIVideoView component renders the participant's video track.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To leave the room, the user can click the Leave button in the RoomView. This action triggers the leaveRoom method asynchronously:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    func content(geometry: GeometryProxy) -> some View {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // ...
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    Button(action: {
                                                                                                                                                                                                    -        Task {
                                                                                                                                                                                                    -            await roomCtx.disconnect()
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }, label: {
                                                                                                                                                                                                    -        HStack {
                                                                                                                                                                                                    -            Image(systemSymbol: .xmarkCircleFill)
                                                                                                                                                                                                    -                .renderingMode(.original)
                                                                                                                                                                                                    -            Text("Leave Room")
                                                                                                                                                                                                    -                .font(.headline)
                                                                                                                                                                                                    -                .fontWeight(.semibold)
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        .padding(8)
                                                                                                                                                                                                    -        .background(Color.red.opacity(0.8)) // Background color for the button
                                                                                                                                                                                                    -        .foregroundColor(.white) // Text color
                                                                                                                                                                                                    -        .cornerRadius(8)
                                                                                                                                                                                                    -    })
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    After rome is disconnected, the room status is updated to disconnected and the OpenViduApp.swift handle this update to redirect the user to the ConnectView.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/javascript/index.html b/3.0.0-beta3/docs/tutorials/application-client/javascript/index.html deleted file mode 100644 index 67ab9b24..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/javascript/index.html +++ /dev/null @@ -1,4863 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - JavaScript Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    JavaScript Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with plain JavaScript, HTML and CSS that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This application is designed to be beginner-friendly and consists of only three essential files that are located in the src directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • app.js: This is the main JavaScript file for the sample application. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in your application, you need to include the library in your HTML file. You can do this by adding the following script tag to the <head> section of your HTML file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    <script src="https://cdn.jsdelivr.net/npm/livekit-client@2.1.5/dist/livekit-client.umd.js"></script>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then, you can use the LivekitClient object in your JavaScript code by referencing it from the window object under LivekitClient. When accessing symbols from the class, you will need to prefix them with LivekitClient.. For example, Room becomes LivekitClient.Room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    // When running OpenVidu locally, leave these variables empty
                                                                                                                                                                                                    -// For other deployment type, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -var APPLICATION_SERVER_URL = ""; // (1)!
                                                                                                                                                                                                    -var LIVEKIT_URL = ""; // (2)!
                                                                                                                                                                                                    -configureUrls();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const LivekitClient = window.LivekitClient; // (3)!
                                                                                                                                                                                                    -var room; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "http://localhost:6080/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "https://" + window.location.hostname + ":6443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!LIVEKIT_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            LIVEKIT_URL = "ws://localhost:7880/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            LIVEKIT_URL = "wss://" + window.location.hostname + ":7443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The URL of the application server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The LivekitClient object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LivekitClient: The LiveKit JS SDK object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // Disable 'Join' button
                                                                                                                                                                                                    -    document.getElementById("join-button").disabled = true;
                                                                                                                                                                                                    -    document.getElementById("join-button").innerText = "Joining...";
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    room = new LivekitClient.Room(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        // (2)!
                                                                                                                                                                                                    -        addTrack(track, participant.identity);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every new Track destroyed...
                                                                                                                                                                                                    -    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {
                                                                                                                                                                                                    -        // (3)!
                                                                                                                                                                                                    -        track.detach();
                                                                                                                                                                                                    -        document.getElementById(track.sid)?.remove();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        if (track.kind === "video") {
                                                                                                                                                                                                    -            removeVideoContainer(participant.identity);
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get the room name and participant name from the form
                                                                                                                                                                                                    -        const roomName = document.getElementById("room-name").value; // (4)!
                                                                                                                                                                                                    -        const userName = document.getElementById("participant-name").value;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await getToken(roomName, userName); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Hide the 'Join room' page and show the 'Room' page
                                                                                                                                                                                                    -        document.getElementById("room-title").innerText = roomName; // (7)!
                                                                                                                                                                                                    -        document.getElementById("join").hidden = true;
                                                                                                                                                                                                    -        document.getElementById("room").hidden = false;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone(); // (8)!
                                                                                                                                                                                                    -        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;
                                                                                                                                                                                                    -        addTrack(localVideoTrack, userName, true);
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.log("There was an error connecting to the room:", error.message);
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Hide the "Join room" page and show the "Room" page.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Publish your camera and microphone.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. It creates a new Room object using LivekitClient.Room(). This object represents the video call room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      80
                                                                                                                                                                                                      -81
                                                                                                                                                                                                      -82
                                                                                                                                                                                                      -83
                                                                                                                                                                                                      -84
                                                                                                                                                                                                      -85
                                                                                                                                                                                                      -86
                                                                                                                                                                                                      -87
                                                                                                                                                                                                      -88
                                                                                                                                                                                                      -89
                                                                                                                                                                                                      -90
                                                                                                                                                                                                      -91
                                                                                                                                                                                                      -92
                                                                                                                                                                                                      -93
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {
                                                                                                                                                                                                      -    const element = track.attach(); // (1)!
                                                                                                                                                                                                      -    element.id = track.sid;
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    /* If the track is a video track, we create a container and append the video element to it
                                                                                                                                                                                                      -    with the participant's identity */
                                                                                                                                                                                                      -    if (track.kind === "video") {
                                                                                                                                                                                                      -        const videoContainer = createVideoContainer(participantIdentity, local);
                                                                                                                                                                                                      -        videoContainer.append(element);
                                                                                                                                                                                                      -        appendParticipantData(videoContainer, participantIdentity + (local ? " (You)" : ""));
                                                                                                                                                                                                      -    } else {
                                                                                                                                                                                                      -        document.getElementById("layout-container").append(element);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {
                                                                                                                                                                                                      -    const videoContainer = document.createElement("div");
                                                                                                                                                                                                      -    videoContainer.id = `camera-${participantIdentity}`;
                                                                                                                                                                                                      -    videoContainer.className = "video-container";
                                                                                                                                                                                                      -    const layoutContainer = document.getElementById("layout-container");
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (local) {
                                                                                                                                                                                                      -        layoutContainer.prepend(videoContainer);
                                                                                                                                                                                                      -    } else {
                                                                                                                                                                                                      -        layoutContainer.append(videoContainer);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    return videoContainer;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -function appendParticipantData(videoContainer, participantIdentity) {
                                                                                                                                                                                                      -    const dataElement = document.createElement("div");
                                                                                                                                                                                                      -    dataElement.className = "participant-data";
                                                                                                                                                                                                      -    dataElement.innerHTML = `<p>${participantIdentity}</p>`;
                                                                                                                                                                                                      -    videoContainer.prepend(dataElement);
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {
                                                                                                                                                                                                      -    const videoContainer = document.getElementById(`camera-${participantIdentity}`);
                                                                                                                                                                                                      -    videoContainer?.remove();
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It retrieves the room name and participant name from the form.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async function getToken(roomName, participantName) {
                                                                                                                                                                                                      -    const response = await fetch(APPLICATION_SERVER_URL + "token", {
                                                                                                                                                                                                      -        method: "POST",
                                                                                                                                                                                                      -        headers: {
                                                                                                                                                                                                      -            "Content-Type": "application/json"
                                                                                                                                                                                                      -        },
                                                                                                                                                                                                      -        body: JSON.stringify({
                                                                                                                                                                                                      -            roomName,
                                                                                                                                                                                                      -            participantName
                                                                                                                                                                                                      -        })
                                                                                                                                                                                                      -    });
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (!response.ok) {
                                                                                                                                                                                                      -        const error = await response.json();
                                                                                                                                                                                                      -        throw new Error(`Failed to get token: ${error.errorMessage}`);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const token = await response.json();
                                                                                                                                                                                                      -    return token.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It updates the UI to hide the "Join room" page and show the "Room" layout.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await room.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Remove all HTML elements inside the layout container
                                                                                                                                                                                                    -    removeAllLayoutElements(); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Back to 'Join room' page
                                                                                                                                                                                                    -    document.getElementById("join").hidden = false; // (3)!
                                                                                                                                                                                                    -    document.getElementById("room").hidden = true;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Enable 'Join' button
                                                                                                                                                                                                    -    document.getElementById("join-button").disabled = false;
                                                                                                                                                                                                    -    document.getElementById("join-button").innerText = "Join!";
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// (4)!
                                                                                                                                                                                                    -window.onbeforeunload = () => {
                                                                                                                                                                                                    -    room?.disconnect();
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Show the "Join room" page and hide the "Room" layout.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It shows the "Join room" page and hides the "Room" layout.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/react/index.html b/3.0.0-beta3/docs/tutorials/application-client/react/index.html deleted file mode 100644 index 0ece3737..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/react/index.html +++ /dev/null @@ -1,4965 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - React Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    React Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with React that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This React project has been generated using the Vite. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • App.tsx: This file defines the main application component. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • App.css: This file contains the styles for the main application component.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • VideoComponent.tsx: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data. Its associated styles are in VideoComponent.css.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install livekit-client
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the App.tsx file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    type TrackInfo = { // (1)!
                                                                                                                                                                                                    -    trackPublication: RemoteTrackPublication;
                                                                                                                                                                                                    -    participantIdentity: string;
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// When running OpenVidu locally, leave these variables empty
                                                                                                                                                                                                    -// For other deployment type, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -let APPLICATION_SERVER_URL = ""; // (2)!
                                                                                                                                                                                                    -let LIVEKIT_URL = ""; // (3)!
                                                                                                                                                                                                    -configureUrls();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "http://localhost:6080/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "https://" + window.location.hostname + ":6443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!LIVEKIT_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            LIVEKIT_URL = "ws://localhost:7880/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            LIVEKIT_URL = "wss://" + window.location.hostname + ":7443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function App() {
                                                                                                                                                                                                    -    const [room, setRoom] = useState<Room | undefined>(undefined); // (4)!
                                                                                                                                                                                                    -    const [localTrack, setLocalTrack] = useState<LocalVideoTrack | undefined>(undefined); // (5)!
                                                                                                                                                                                                    -    const [remoteTracks, setRemoteTracks] = useState<TrackInfo[]>([]); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    const [participantName, setParticipantName] = useState("Participant" + Math.floor(Math.random() * 100)); // (7)!
                                                                                                                                                                                                    -    const [roomName, setRoomName] = useState("Test Room"); // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the application server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The URL of the LiveKit server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The local video track, which represents the user's camera.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. The remote tracks array.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. The participant's name.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. The room name.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The App.tsx file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteTracks: An array of TrackInfo objects, which group a track publication with the participant's identity.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: The room name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    -89
                                                                                                                                                                                                    -90
                                                                                                                                                                                                    -91
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    const room = new Room(); // (1)!
                                                                                                                                                                                                    -    setRoom(room);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    room.on(
                                                                                                                                                                                                    -        RoomEvent.TrackSubscribed,
                                                                                                                                                                                                    -        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {
                                                                                                                                                                                                    -            // (2)!
                                                                                                                                                                                                    -            setRemoteTracks((prev) => [
                                                                                                                                                                                                    -                ...prev,
                                                                                                                                                                                                    -                { trackPublication: publication, participantIdentity: participant.identity }
                                                                                                                                                                                                    -            ]);
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every Track destroyed...
                                                                                                                                                                                                    -    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {
                                                                                                                                                                                                    -        // (3)!
                                                                                                                                                                                                    -        setRemoteTracks((prev) => prev.filter((track) => track.trackPublication.trackSid !== publication.trackSid));
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await getToken(roomName, participantName); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.connect(LIVEKIT_URL, token); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.localParticipant.enableCameraAndMicrophone(); // (6)!
                                                                                                                                                                                                    -        setLocalTrack(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);
                                                                                                                                                                                                    -    } catch (error) {
                                                                                                                                                                                                    -        console.log("There was an error connecting to the room:", (error as Error).message);
                                                                                                                                                                                                    -        await leaveRoom();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Publish your camera and microphone.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the "Join room" page and showing the "Room" layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracks array as a TrackInfo object containing the track publication and the participant's identity.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracks array.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      App.tsx
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async function getToken(roomName: string, participantName: string) {
                                                                                                                                                                                                      -    const response = await fetch(APPLICATION_SERVER_URL + "token", {
                                                                                                                                                                                                      -        method: "POST",
                                                                                                                                                                                                      -        headers: {
                                                                                                                                                                                                      -            "Content-Type": "application/json"
                                                                                                                                                                                                      -        },
                                                                                                                                                                                                      -        body: JSON.stringify({
                                                                                                                                                                                                      -            roomName: roomName,
                                                                                                                                                                                                      -            participantName: participantName
                                                                                                                                                                                                      -        })
                                                                                                                                                                                                      -    });
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (!response.ok) {
                                                                                                                                                                                                      -        const error = await response.json();
                                                                                                                                                                                                      -        throw new Error(`Failed to get token: ${error.errorMessage}`);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const data = await response.json();
                                                                                                                                                                                                      -    return data.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video and Audio Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    <div id="layout-container">
                                                                                                                                                                                                    -    {localTrack && (
                                                                                                                                                                                                    -        <VideoComponent track={localTrack} participantIdentity={participantName} local={true} />
                                                                                                                                                                                                    -    )}
                                                                                                                                                                                                    -    {remoteTracks.map((remoteTrack) =>
                                                                                                                                                                                                    -        remoteTrack.trackPublication.kind === "video" ? (
                                                                                                                                                                                                    -            <VideoComponent
                                                                                                                                                                                                    -                key={remoteTrack.trackPublication.trackSid}
                                                                                                                                                                                                    -                track={remoteTrack.trackPublication.videoTrack!}
                                                                                                                                                                                                    -                participantIdentity={remoteTrack.participantIdentity}
                                                                                                                                                                                                    -            />
                                                                                                                                                                                                    -        ) : (
                                                                                                                                                                                                    -            <AudioComponent
                                                                                                                                                                                                    -                key={remoteTrack.trackPublication.trackSid}
                                                                                                                                                                                                    -                track={remoteTrack.trackPublication.audioTrack!}
                                                                                                                                                                                                    -            />
                                                                                                                                                                                                    -        )
                                                                                                                                                                                                    -    )}
                                                                                                                                                                                                    -</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      If the property localTrack is defined, we display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Then, we iterate over the remoteTracks array and, for each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.txs file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    VideoComponent.tsx
                                                                                                                                                                                                     5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    interface VideoComponentProps {
                                                                                                                                                                                                    -    track: LocalVideoTrack | RemoteVideoTrack; // (1)!
                                                                                                                                                                                                    -    participantIdentity: string; // (2)!
                                                                                                                                                                                                    -    local?: boolean; // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function VideoComponent({ track, participantIdentity, local = false }: VideoComponentProps) {
                                                                                                                                                                                                    -    const videoElement = useRef<HTMLVideoElement | null>(null); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    useEffect(() => {
                                                                                                                                                                                                    -        if (videoElement.current) {
                                                                                                                                                                                                    -            track.attach(videoElement.current); // (5)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        return () => {
                                                                                                                                                                                                    -            track.detach(); // (6)!
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -    }, [track]);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    return (
                                                                                                                                                                                                    -        <div id={"camera-" + participantIdentity} className="video-container">
                                                                                                                                                                                                    -            <div className="participant-data">
                                                                                                                                                                                                    -                <p>{participantIdentity + (local ? " (You)" : "")}</p>
                                                                                                                                                                                                    -            </div>
                                                                                                                                                                                                    -            <video ref={videoElement} id={track.sid}></video>
                                                                                                                                                                                                    -        </div>
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The participant identity associated with the video track.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The reference to the video element in the HTML template.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Detach the video track when the component is unmounted.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It defines the properties track, participantIdentity, and local as props of the component:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.tsx file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    AudioComponent.tsx
                                                                                                                                                                                                     5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    interface AudioComponentProps {
                                                                                                                                                                                                    -    track: LocalAudioTrack | RemoteAudioTrack; // (1)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function AudioComponent({ track }: AudioComponentProps) {
                                                                                                                                                                                                    -    const audioElement = useRef<HTMLAudioElement | null>(null); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    useEffect(() => {
                                                                                                                                                                                                    -        if (audioElement.current) {
                                                                                                                                                                                                    -            track.attach(audioElement.current); // (3)!
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        return () => {
                                                                                                                                                                                                    -            track.detach(); // (4)!
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -    }, [track]);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    return <audio ref={audioElement} id={track.sid} />;
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Detach the audio track when the component is unmounted.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property as a prop for the component and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    91
                                                                                                                                                                                                    -92
                                                                                                                                                                                                    -93
                                                                                                                                                                                                    -94
                                                                                                                                                                                                    -95
                                                                                                                                                                                                    -96
                                                                                                                                                                                                    -97
                                                                                                                                                                                                    -98
                                                                                                                                                                                                    -99
                                                                                                                                                                                                    async function leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await room?.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Reset the state
                                                                                                                                                                                                    -    setRoom(undefined); // (2)!
                                                                                                                                                                                                    -    setLocalTrack(undefined);
                                                                                                                                                                                                    -    setRemoteTracks([]);
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Reset all variables to their initial state.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-client/vue/index.html b/3.0.0-beta3/docs/tutorials/application-client/vue/index.html deleted file mode 100644 index e5b35877..00000000 --- a/3.0.0-beta3/docs/tutorials/application-client/vue/index.html +++ /dev/null @@ -1,4956 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Vue Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Vue Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Vue that allows:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • Leaving the video call room at any time.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run a server application#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      cargo run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run the client application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Vue project has been generated using the Vue CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      App.vue: This file defines the main application component along with its HTML template and styles. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      VideoComponent.vue: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install livekit-client
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Now let's see the code of the App.vue file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    type TrackInfo = {
                                                                                                                                                                                                    -    // (1)!
                                                                                                                                                                                                    -    trackPublication: RemoteTrackPublication;
                                                                                                                                                                                                    -    participantIdentity: string;
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// When running OpenVidu locally, leave these variables empty
                                                                                                                                                                                                    -// For other deployment type, configure them with correct URLs depending on your deployment
                                                                                                                                                                                                    -let APPLICATION_SERVER_URL = ""; // (2)!
                                                                                                                                                                                                    -let LIVEKIT_URL = ""; // (3)!
                                                                                                                                                                                                    -configureUrls();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -function configureUrls() {
                                                                                                                                                                                                    -    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!APPLICATION_SERVER_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "http://localhost:6080/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            APPLICATION_SERVER_URL = "https://" + window.location.hostname + ":6443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment
                                                                                                                                                                                                    -    if (!LIVEKIT_URL) {
                                                                                                                                                                                                    -        if (window.location.hostname === "localhost") {
                                                                                                                                                                                                    -            LIVEKIT_URL = "ws://localhost:7880/";
                                                                                                                                                                                                    -        } else {
                                                                                                                                                                                                    -            LIVEKIT_URL = "wss://" + window.location.hostname + ":7443/";
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const room = ref<Room>(); // (4)!
                                                                                                                                                                                                    -const localTrack = ref<LocalVideoTrack>(); // (5)!
                                                                                                                                                                                                    -const remoteTracksMap: Ref<Map<string, TrackInfo>> = ref(new Map()); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -let participantName = ref("Participant" + Math.floor(Math.random() * 100)); // (7)!
                                                                                                                                                                                                    -let roomName = ref("Test Room"); // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The URL of the application server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The URL of the LiveKit server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The local video track, which represents the user's camera.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. The participant's name.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. The room name.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The App.vue file defines the following variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • roomName: The room name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Joining a Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    -89
                                                                                                                                                                                                    -90
                                                                                                                                                                                                    -91
                                                                                                                                                                                                    -92
                                                                                                                                                                                                    async function joinRoom() {
                                                                                                                                                                                                    -    // Initialize a new Room object
                                                                                                                                                                                                    -    room.value = new Room(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Specify the actions when events take place in the room
                                                                                                                                                                                                    -    // On every new Track received...
                                                                                                                                                                                                    -    room.value.on(
                                                                                                                                                                                                    -        RoomEvent.TrackSubscribed,
                                                                                                                                                                                                    -        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {
                                                                                                                                                                                                    -            // (2)!
                                                                                                                                                                                                    -            remoteTracksMap.value.set(publication.trackSid, {
                                                                                                                                                                                                    -                trackPublication: publication,
                                                                                                                                                                                                    -                participantIdentity: participant.identity
                                                                                                                                                                                                    -            });
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // On every Track destroyed...
                                                                                                                                                                                                    -    room.value.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {
                                                                                                                                                                                                    -        // (3)!
                                                                                                                                                                                                    -        remoteTracksMap.value.delete(publication.trackSid);
                                                                                                                                                                                                    -    });
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        // Get a token from your application server with the room name and participant name
                                                                                                                                                                                                    -        const token = await getToken(roomName.value, participantName.value); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Connect to the room with the LiveKit URL and the token
                                                                                                                                                                                                    -        await room.value.connect(LIVEKIT_URL, token); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        // Publish your camera and microphone
                                                                                                                                                                                                    -        await room.value.localParticipant.enableCameraAndMicrophone(); // (6)!
                                                                                                                                                                                                    -        localTrack.value = room.value.localParticipant.videoTrackPublications.values().next().value.videoTrack;
                                                                                                                                                                                                    -    } catch (error: any) {
                                                                                                                                                                                                    -        console.log("There was an error connecting to the room:", error.message);
                                                                                                                                                                                                    -        await leaveRoom();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Add listener for beforeunload event to leave the room when the user closes the tab
                                                                                                                                                                                                    -    window.addEventListener("beforeunload", leaveRoom); // (7)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Event handling for when a track is destroyed.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Publish your camera and microphone.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Add a listener for the beforeunload event to leave the room when the user closes the tab.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the "Join room" page and showing the "Room" layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • -

                                                                                                                                                                                                        RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      App.vue
                                                                                                                                                                                                      /**
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * GETTING A TOKEN FROM YOUR APPLICATION SERVER
                                                                                                                                                                                                      - * --------------------------------------------
                                                                                                                                                                                                      - * The method below request the creation of a token to
                                                                                                                                                                                                      - * your application server. This prevents the need to expose
                                                                                                                                                                                                      - * your LiveKit API key and secret to the client side.
                                                                                                                                                                                                      - *
                                                                                                                                                                                                      - * In this sample code, there is no user control at all. Anybody could
                                                                                                                                                                                                      - * access your application server endpoints. In a real production
                                                                                                                                                                                                      - * environment, your application server must identify the user to allow
                                                                                                                                                                                                      - * access to the endpoints.
                                                                                                                                                                                                      - */
                                                                                                                                                                                                      -async function getToken(roomName: string, participantName: string) {
                                                                                                                                                                                                      -    const response = await fetch(APPLICATION_SERVER_URL + "token", {
                                                                                                                                                                                                      -        method: "POST",
                                                                                                                                                                                                      -        headers: {
                                                                                                                                                                                                      -            "Content-Type": "application/json"
                                                                                                                                                                                                      -        },
                                                                                                                                                                                                      -        body: JSON.stringify({
                                                                                                                                                                                                      -            roomName,
                                                                                                                                                                                                      -            participantName
                                                                                                                                                                                                      -        })
                                                                                                                                                                                                      -    });
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    if (!response.ok) {
                                                                                                                                                                                                      -        const error = await response.json();
                                                                                                                                                                                                      -        throw new Error(`Failed to get token: ${error.errorMessage}`);
                                                                                                                                                                                                      -    }
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -    const data = await response.json();
                                                                                                                                                                                                      -    return data.token;
                                                                                                                                                                                                      -}
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. It adds a listener for the beforeunload event to leave the room when the user closes the tab.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Displaying Video and Audio Tracks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    <div id="layout-container">
                                                                                                                                                                                                    -    <VideoComponent v-if="localTrack" :track="localTrack" :participantIdentity="participantName" :local="true" />
                                                                                                                                                                                                    -    <template v-for="remoteTrack of remoteTracksMap.values()" :key="remoteTrack.trackPublication.trackSid">
                                                                                                                                                                                                    -        <VideoComponent
                                                                                                                                                                                                    -            v-if="remoteTrack.trackPublication.kind === 'video'"
                                                                                                                                                                                                    -            :track="remoteTrack.trackPublication.videoTrack!"
                                                                                                                                                                                                    -            :participantIdentity="remoteTrack.participantIdentity"
                                                                                                                                                                                                    -        />
                                                                                                                                                                                                    -        <AudioComponent v-else :track="remoteTrack.trackPublication.audioTrack!" hidden />
                                                                                                                                                                                                    -    </template>
                                                                                                                                                                                                    -</div>
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      We use the v-if directive to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Then, we use the v-for directive to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.vue file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    VideoComponent.vue
                                                                                                                                                                                                     5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    const props = withDefaults(
                                                                                                                                                                                                    -    defineProps<{
                                                                                                                                                                                                    -        track: LocalVideoTrack | RemoteVideoTrack; // (1)!
                                                                                                                                                                                                    -        participantIdentity: string; // (2)!
                                                                                                                                                                                                    -        local?: boolean; // (3)!
                                                                                                                                                                                                    -    }>(),
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        local: false
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const videoElement = ref<HTMLMediaElement | null>(null); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -onMounted(() => {
                                                                                                                                                                                                    -    if (videoElement.value) {
                                                                                                                                                                                                    -        props.track.attach(videoElement.value); // (5)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -onUnmounted(() => {
                                                                                                                                                                                                    -    props.track.detach(); // (6)!
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The participant identity associated with the video track.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The reference to the video element in the HTML template.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Detach the video track when the component is unmounted.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It defines the properties track, participantIdentity, and local using the defineProps() function:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.vue file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    AudioComponent.vue
                                                                                                                                                                                                     5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    const props = defineProps<{
                                                                                                                                                                                                    -    track: LocalAudioTrack | RemoteAudioTrack; // (1)!
                                                                                                                                                                                                    -}>();
                                                                                                                                                                                                    -const audioElement = ref<HTMLMediaElement | null>(null); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -onMounted(() => {
                                                                                                                                                                                                    -    if (audioElement.value) {
                                                                                                                                                                                                    -        props.track.attach(audioElement.value); // (3)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -onUnmounted(() => {
                                                                                                                                                                                                    -    props.track.detach(); // (4)!
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Detach the audio track when the component is unmounted.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property using the defineProps() function and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Leaving the Room#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    async function leaveRoom() {
                                                                                                                                                                                                    -    // Leave the room by calling 'disconnect' method over the Room object
                                                                                                                                                                                                    -    await room.value?.disconnect(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    // Empty all variables
                                                                                                                                                                                                    -    room.value = undefined; // (2)!
                                                                                                                                                                                                    -    localTrack.value = undefined;
                                                                                                                                                                                                    -    remoteTracksMap.value.clear();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    window.removeEventListener("beforeunload", leaveRoom); // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -onUnmounted(() => {
                                                                                                                                                                                                    -    // (4)!
                                                                                                                                                                                                    -    // On component unmount, leave the room
                                                                                                                                                                                                    -    leaveRoom();
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Reset all variables to their initial state.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Remove the beforeunload event listener.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Call the leaveRoom() function when the component is unmounted.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • It removes the beforeunload event listener.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The leaveRoom() function is also called when the component is unmounted using the onUnmounted() lifecycle hook. This ensures that the user leaves the room when the component is no longer needed.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/dotnet/index.html b/3.0.0-beta3/docs/tutorials/application-server/dotnet/index.html deleted file mode 100644 index e8cd544d..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/dotnet/index.html +++ /dev/null @@ -1,4870 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - .NET Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    .NET Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for .NET with ASP.NET Core Minimal APIs that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit available, so the application has to manually build LiveKit compatible JWT tokens using the .NET library System.IdentityModel.Tokens.Jwt, and check the validity of webhook events on its own. It is a fairly easy process.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      dotnet run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple ASP.NET Core Minimal APIs app with a single file Program.cs that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code Program.cs file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                     8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    var builder = WebApplication.CreateBuilder(args); // (1)!
                                                                                                                                                                                                    -var MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -IConfiguration config = new ConfigurationBuilder() // (3)!
                                                                                                                                                                                                    -                .SetBasePath(Directory.GetCurrentDirectory())
                                                                                                                                                                                                    -                .AddJsonFile("appsettings.json")
                                                                                                                                                                                                    -                .AddEnvironmentVariables().Build();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// Load env variables
                                                                                                                                                                                                    -var SERVER_PORT = config.GetValue<int>("SERVER_PORT"); // (4)!
                                                                                                                                                                                                    -var LIVEKIT_API_KEY = config.GetValue<string>("LIVEKIT_API_KEY"); // (5)!
                                                                                                                                                                                                    -var LIVEKIT_API_SECRET = config.GetValue<string>("LIVEKIT_API_SECRET"); // (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -// Enable CORS support
                                                                                                                                                                                                    -builder.Services.AddCors(options => // (7)!
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    options.AddPolicy(name: MyAllowSpecificOrigins,
                                                                                                                                                                                                    -                      builder =>
                                                                                                                                                                                                    -                      {
                                                                                                                                                                                                    -                          builder.WithOrigins("*").AllowAnyHeader();
                                                                                                                                                                                                    -                      });
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -builder.WebHost.UseKestrel(serverOptions => // (8)!
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    serverOptions.ListenAnyIP(SERVER_PORT);
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -var app = builder.Build(); // (9)!
                                                                                                                                                                                                    -app.UseCors(MyAllowSpecificOrigins);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A WebApplicationBuilder instance to build the application.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The name of the CORS policy to be used in the application.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. A IConfiguration instance to load the configuration from the appsettings.json file, including the required environment variables.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The port where the application will be listening.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The API key of LiveKit Server.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. The API secret of LiveKit Server.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Configure CORS support.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Configure the port.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    17. Build the application and enable CORS support.
                                                                                                                                                                                                    18. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The Program.cs file imports the required dependencies and loads the necessary environment variables (defined in appsettings.json file):

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally the application enables CORS support and the port where the application will be listening.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    app.MapPost("/token", async (HttpRequest request) =>
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    var body = new StreamReader(request.Body); // (1)!
                                                                                                                                                                                                    -    string postData = await body.ReadToEndAsync();
                                                                                                                                                                                                    -    Dictionary<string, dynamic> bodyParams = JsonSerializer.Deserialize<Dictionary<string, dynamic>>(postData) ?? new Dictionary<string, dynamic>();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (bodyParams.TryGetValue("roomName", out var roomName) && bodyParams.TryGetValue("participantName", out var participantName))
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        var token = CreateLiveKitJWT(roomName.ToString(), participantName.ToString()); // (2)!
                                                                                                                                                                                                    -        return Results.Json(new { token }); // (3)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    else
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        return Results.BadRequest(new { errorMessage = "roomName and participantName are required" }); // (4)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a new JWT token with the room and participant name.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Return the token to the client.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Return a 400 error if required fields are not available.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available. If not, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. Unfortunately there is no .NET SDK for LiveKit, so we need to create the JWT token manually. The CreateLiveKitJWT method is responsible for creating the LiveKit compatible JWT token:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    string CreateLiveKitJWT(string roomName, string participantName)
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    JwtHeader headers = new(new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(LIVEKIT_API_SECRET)), "HS256")); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var videoGrants = new Dictionary<string, object>() // (2)!
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        { "room", roomName },
                                                                                                                                                                                                    -        { "roomJoin", true }
                                                                                                                                                                                                    -    };
                                                                                                                                                                                                    -    JwtPayload payload = new()
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        { "exp", new DateTimeOffset(DateTime.UtcNow.AddHours(6)).ToUnixTimeSeconds() }, // (3)!
                                                                                                                                                                                                    -        { "iss", LIVEKIT_API_KEY }, // (4)!
                                                                                                                                                                                                    -        { "nbf", 0 }, // (5)!
                                                                                                                                                                                                    -        { "sub", participantName }, // (6)!
                                                                                                                                                                                                    -        { "name", participantName },
                                                                                                                                                                                                    -        { "video", videoGrants }
                                                                                                                                                                                                    -    };
                                                                                                                                                                                                    -    JwtSecurityToken token = new(headers, payload);
                                                                                                                                                                                                    -    return new JwtSecurityTokenHandler().WriteToken(token); // (7)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a new JwtHeader with LIVEKIT_API_SECRET as the secret key and HS256 as the encryption algorithm.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a new Dictionary with the video grants for the participant. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Set the expiration time of the token. LiveKit default's is 6 hours.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Set the API key of LiveKit Server as the issuer (iss) of the token.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The Not before field (nbf) sets when the token becomes valid (0 for immediately valid).
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Set the participant's name in the claims sub and name.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Finally, the returned token is sent back to the client.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This method uses the native System.IdentityModel.Tokens.Jwt library to create a JWT token valid for LiveKit. The most important field in the JwtPayload is video, which will determine the VideoGrant permissions of the participant in the Room. You can also customize the expiration time of the token by changing the exp field, and add a metadata field for the participant. Check out all the available claims.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, the returned token is sent back to the client.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    app.MapPost("/livekit/webhook", async (HttpRequest request) =>
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    var body = new StreamReader(request.Body);
                                                                                                                                                                                                    -    string postData = await body.ReadToEndAsync(); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var authHeader = request.Headers["Authorization"]; // (2)!
                                                                                                                                                                                                    -    if (authHeader.Count == 0)
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        return Results.BadRequest("Authorization header is required");
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    try
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        VerifyWebhookEvent(authHeader.First(), postData); // (3)!
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    catch (Exception e)
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        Console.Error.WriteLine("Error validating webhook event: " + e.Message);
                                                                                                                                                                                                    -        return Results.Unauthorized();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    Console.Out.WriteLine(postData); // (4)!
                                                                                                                                                                                                    -    return Results.Ok(); // (5)!
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The raw string body of the request contains the webhook event.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The Authorization header is required to validate the webhook event.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Verify the webhook event.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Consume the event as you whish.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Return a response to LiveKit Server to let it know that the webhook was received correctly.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint receives the incoming webhook event and validates it to ensure it is coming from our LiveKit Server. For that we need the raw string body and the Authorization header of the request. After validating it, we can consume the event (in this case, we just log it), and we must also return a 200 OK response to LiveKit Server to let it know that the webhook was received correctly.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit, so we need to manually validate the webhook event. The VerifyWebhookEvent method does that:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    void VerifyWebhookEvent(string authHeader, string body)
                                                                                                                                                                                                    -{
                                                                                                                                                                                                    -    var utf8Encoding = new UTF8Encoding();
                                                                                                                                                                                                    -    var tokenValidationParameters = new TokenValidationParameters()
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        ValidateIssuerSigningKey = true,
                                                                                                                                                                                                    -        IssuerSigningKey = new SymmetricSecurityKey(utf8Encoding.GetBytes(LIVEKIT_API_SECRET)), // (1)!
                                                                                                                                                                                                    -        ValidateIssuer = true,
                                                                                                                                                                                                    -        ValidIssuer = LIVEKIT_API_KEY, // (2)!
                                                                                                                                                                                                    -        ValidateAudience = false
                                                                                                                                                                                                    -    };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var jwtValidator = new JwtSecurityTokenHandler();
                                                                                                                                                                                                    -    var claimsPrincipal = jwtValidator.ValidateToken(authHeader, tokenValidationParameters, out SecurityToken validatedToken); // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    var sha256 = SHA256.Create();
                                                                                                                                                                                                    -    var hashBytes = sha256.ComputeHash(utf8Encoding.GetBytes(body));
                                                                                                                                                                                                    -    var hash = Convert.ToBase64String(hashBytes); // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (claimsPrincipal.HasClaim(c => c.Type == "sha256") && claimsPrincipal.FindFirstValue("sha256") != hash)
                                                                                                                                                                                                    -    {
                                                                                                                                                                                                    -        throw new ArgumentException("sha256 checksum of body does not match!");
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Use the LIVEKIT_API_SECRET as the secret key to validate the token.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Set the LIVEKIT_API_KEY as the issuer of the token.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Validate the Authorization header with the recently created TokenValidationParameters. If the LIVEKIT_API_SECRET or LIVEKIT_API_KEY of the LiveKit Server that sent the event do not match the ones in the application, this will throw an exception.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can trust it.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    We need a TokenValidationParameters object from the Microsoft.IdentityModel.Tokens namespace. We use the LIVEKIT_API_SECRET as the symmetric key, and the LIVEKIT_API_KEY as the issuer of the token.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If method JwtSecurityTokenHandler#ValidateToken does rise an exception when validating the Authorization header, it means the webhook event was sent by a LiveKit Server with different credentials.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, we calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can definitely trust it.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/go/index.html b/3.0.0-beta3/docs/tutorials/application-server/go/index.html deleted file mode 100644 index ae2f78bf..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/go/index.html +++ /dev/null @@ -1,4734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Go Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Go Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Go with Gin that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses the LiveKit Go SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      go run main.go
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Go app with a single file main.go that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the main.go file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    var SERVER_PORT string // (1)!
                                                                                                                                                                                                    -var LIVEKIT_API_KEY string // (2)!
                                                                                                                                                                                                    -var LIVEKIT_API_SECRET string // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. The port where the application will be listening
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The API key of LiveKit Server
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The API secret of LiveKit Server
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The main.go file first declares the necessary global variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The server launch takes place in the main function at the end of the file, where we first load the environment variables, then set the REST endpoints and finally start the server on SERVER_PORT:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    func main() {
                                                                                                                                                                                                    -    loadEnv() // (1)!
                                                                                                                                                                                                    -    router := gin.Default() // (2)!
                                                                                                                                                                                                    -    router.Use(cors.Default()) // (3)!
                                                                                                                                                                                                    -    router.POST("/token", createToken) // (4)!
                                                                                                                                                                                                    -    router.POST("/livekit/webhook", receiveWebhook) // (5)!
                                                                                                                                                                                                    -    router.Run(":" + SERVER_PORT) // (6)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Load environment variables
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a new Gin router
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Enable CORS support
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Create the /token endpoint
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Create the /livekit/webhook endpoint
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Start the server on the SERVER_PORT
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    func createToken(context *gin.Context) {
                                                                                                                                                                                                    -    var body struct {
                                                                                                                                                                                                    -        RoomName        string `json:"roomName"`
                                                                                                                                                                                                    -        ParticipantName string `json:"participantName"`
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if err := context.BindJSON(&body); err != nil {
                                                                                                                                                                                                    -        context.JSON(http.StatusBadRequest, err.Error())
                                                                                                                                                                                                    -        return
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if body.RoomName == "" || body.ParticipantName == "" {
                                                                                                                                                                                                    -        context.JSON(http.StatusBadRequest, gin.H{"errorMessage": "roomName and participantName are required"})
                                                                                                                                                                                                    -        return
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    at := auth.NewAccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) // (1)!
                                                                                                                                                                                                    -    grant := &auth.VideoGrant{
                                                                                                                                                                                                    -        RoomJoin: true,
                                                                                                                                                                                                    -        Room:     body.RoomName,
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    at.SetVideoGrant(grant).SetIdentity(body.ParticipantName) // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    token, err := at.ToJWT() // (3)!
                                                                                                                                                                                                    -    if err != nil {
                                                                                                                                                                                                    -        context.JSON(http.StatusInternalServerError, err.Error())
                                                                                                                                                                                                    -        return
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    context.JSON(http.StatusOK, gin.H{"token": token}) // (4)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    We first load the request body into a struct with roomName and participantName string fields. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Go SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We convert the AccessToken to a JWT token and return it to the client.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    func receiveWebhook(context *gin.Context) {
                                                                                                                                                                                                    -    authProvider := auth.NewSimpleKeyProvider( // (1)!
                                                                                                                                                                                                    -        LIVEKIT_API_KEY, LIVEKIT_API_SECRET,
                                                                                                                                                                                                    -    )
                                                                                                                                                                                                    -    event, err := webhook.ReceiveWebhookEvent(context.Request, authProvider) // (2)!
                                                                                                                                                                                                    -    if err != nil {
                                                                                                                                                                                                    -        fmt.Fprintf(os.Stderr, "error validating webhook event: %v", err)
                                                                                                                                                                                                    -        return
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    fmt.Println("LiveKit Webhook", event) // (3)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Consume the event as you whish.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Consume the event as you whish.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/index.html b/3.0.0-beta3/docs/tutorials/application-server/index.html deleted file mode 100644 index d190f09d..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/index.html +++ /dev/null @@ -1,3995 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Application Server Tutorials - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Application Server Tutorials#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Every application server below has two specific purposes:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    To do so they all define two REST endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token: takes a room and participant name and returns a token.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /webhook: for receiving webhook events from LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    They use the proper LiveKit Server SDK for their language, if available.

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/java/index.html b/3.0.0-beta3/docs/tutorials/application-server/java/index.html deleted file mode 100644 index 52cd0c0f..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/java/index.html +++ /dev/null @@ -1,4701 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Java Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Java Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Java with Spring Boot that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses LiveKit Kotlin SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Run the application -
                                                                                                                                                                                                      mvn spring-boot:run
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Spring Boot app with a single controller Controller.java that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the Controller.java file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    @CrossOrigin(origins = "*") // (1)!
                                                                                                                                                                                                    -@RestController // (2)!
                                                                                                                                                                                                    -public class Controller {
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    @Value("${livekit.api.key}")
                                                                                                                                                                                                    -    private String LIVEKIT_API_KEY; // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    @Value("${livekit.api.secret}")
                                                                                                                                                                                                    -    private String LIVEKIT_API_SECRET; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    ...
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Allows the application to be accessed from any domain
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Marks the class as a controller where every method returns a domain object instead of a view
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The API key of LiveKit Server
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The API secret of LiveKit Server
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Starting by the top, the Controller class has the following annotations:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • @CrossOrigin(origins = "*"): allows the application to be accessed from any domain.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • @RestController: marks the class as a controller where every method returns a domain object instead of a view.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Going deeper, the Controller class has the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server. It is injected from the property livekit.api.key defined in application.properties using the @Value("${livekit.api.key}") annotation.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server. It is injected from the the property livekit.api.secret defined in application.properties using the @Value("${livekit.api.secret}") annotation.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    @PostMapping(value = "/token")
                                                                                                                                                                                                    -public ResponseEntity<Map<String, String>> createToken(@RequestBody Map<String, String> params) {
                                                                                                                                                                                                    -    String roomName = params.get("roomName");
                                                                                                                                                                                                    -    String participantName = params.get("participantName");
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (roomName == null || participantName == null) {
                                                                                                                                                                                                    -        return ResponseEntity.badRequest().body(Map.of("errorMessage", "roomName and participantName are required"));
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (1)!
                                                                                                                                                                                                    -    token.setName(participantName); // (2)!
                                                                                                                                                                                                    -    token.setIdentity(participantName);
                                                                                                                                                                                                    -    token.addGrants(new RoomJoin(true), new RoomName(roomName)); // (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    return ResponseEntity.ok(Map.of("token", token.toJwt())); // (4)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Kotlin SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    @PostMapping(value = "/livekit/webhook", consumes = "application/webhook+json")
                                                                                                                                                                                                    -public ResponseEntity<String> receiveWebhook(@RequestHeader("Authorization") String authHeader, @RequestBody String body) { // (1)!
                                                                                                                                                                                                    -    WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (2)!
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        WebhookEvent event = webhookReceiver.receive(body, authHeader); // (3)!
                                                                                                                                                                                                    -        System.out.println("LiveKit Webhook: " + event.toString()); // (4)!
                                                                                                                                                                                                    -    } catch (Exception e) {
                                                                                                                                                                                                    -        System.err.println("Error validating webhook event: " + e.getMessage());
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -    return ResponseEntity.ok("ok");
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. We need the 'Authorization' header and the raw body of the HTTP request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Consume the event as you whish.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    We declare the 'Authorization' header and the raw body of the HTTP request as parameters of the our method. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then we initialize a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally we obtain a WebhookEvent object calling method WebhookReceiver#receive. It takes the raw body as a String and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/node/index.html b/3.0.0-beta3/docs/tutorials/application-server/node/index.html deleted file mode 100644 index 322d6d24..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/node/index.html +++ /dev/null @@ -1,4721 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Node.js Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Node.js Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Node with Express that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses LiveKit JS SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Express app with a single file index.js that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the index.js file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    import "dotenv/config";
                                                                                                                                                                                                    -import express from "express";
                                                                                                                                                                                                    -import cors from "cors";
                                                                                                                                                                                                    -import { AccessToken, WebhookReceiver } from "livekit-server-sdk"; // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const SERVER_PORT = process.env.SERVER_PORT || 6080; // (2)!
                                                                                                                                                                                                    -const LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || "devkey"; // (3)!
                                                                                                                                                                                                    -const LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || "secret"; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -const app = express(); // (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -app.use(cors()); // (6)!
                                                                                                                                                                                                    -app.use(express.json()); // (7)!
                                                                                                                                                                                                    -app.use(express.raw({ type: "application/webhook+json" })); // (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import AccessToken from livekit-server-sdk.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The port where the application will be listening.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The API key of LiveKit Server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The API secret of LiveKit Server.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Initialize the Express application.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Enable CORS support.
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Enable JSON body parsing for the /token endpoint.
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Enable raw body parsing for the /livekit/webhook endpoint.
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The index.js file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    It also initializes the WebhookReceiver object that will help validating and decoding incoming webhook events.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally the express application is initialized. CORS is allowed, JSON body parsing is enabled for the /token endpoint and raw body parsing is enabled for the /livekit/webhook endpoint.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    app.post("/token", async (req, res) => {
                                                                                                                                                                                                    -  const roomName = req.body.roomName;
                                                                                                                                                                                                    -  const participantName = req.body.participantName;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  if (!roomName || !participantName) {
                                                                                                                                                                                                    -    res.status(400).json({ errorMessage: "roomName and participantName are required" });
                                                                                                                                                                                                    -    return;
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, { // (1)!
                                                                                                                                                                                                    -    identity: participantName,
                                                                                                                                                                                                    -  });
                                                                                                                                                                                                    -  at.addGrant({ roomJoin: true, room: roomName }); // (2)!
                                                                                                                                                                                                    -  const token = await at.toJwt(); // (3)!
                                                                                                                                                                                                    -  res.json({ token }); // (4)!
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit JS SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    const webhookReceiver = new WebhookReceiver( // (1)!
                                                                                                                                                                                                    -  LIVEKIT_API_KEY,
                                                                                                                                                                                                    -  LIVEKIT_API_SECRET
                                                                                                                                                                                                    -);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -app.post("/livekit/webhook", async (req, res) => {
                                                                                                                                                                                                    -  try {
                                                                                                                                                                                                    -    const event = await webhookReceiver.receive(
                                                                                                                                                                                                    -      req.body, // (2)!
                                                                                                                                                                                                    -      req.get("Authorization") // (3)!
                                                                                                                                                                                                    -    );
                                                                                                                                                                                                    -    console.log(event); // (4)!
                                                                                                                                                                                                    -  } catch (error) {
                                                                                                                                                                                                    -    console.error("Error validating webhook event", error);
                                                                                                                                                                                                    -  }
                                                                                                                                                                                                    -  res.status(200).send();
                                                                                                                                                                                                    -});
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The body of the HTTP request.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The Authorization header of the HTTP request.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Consume the event as you whish.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all we initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This object will validate and decode the incoming webhook events.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint receives the incoming webhook with the async method WebhookReceiver#receive. It takes the body and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/php/index.html b/3.0.0-beta3/docs/tutorials/application-server/php/index.html deleted file mode 100644 index 8f2d0658..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/php/index.html +++ /dev/null @@ -1,4748 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - PHP Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    PHP Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for PHP that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses LiveKit PHP SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      composer install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      composer start
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    -

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple PHP app with a single file index.php that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the index.php file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.php
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    <?php
                                                                                                                                                                                                    -require __DIR__ . "/vendor/autoload.php";
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -use Agence104\LiveKit\AccessToken; // (1)!
                                                                                                                                                                                                    -use Agence104\LiveKit\AccessTokenOptions;
                                                                                                                                                                                                    -use Agence104\LiveKit\VideoGrant;
                                                                                                                                                                                                    -use Agence104\LiveKit\WebhookReceiver;
                                                                                                                                                                                                    -use Dotenv\Dotenv;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -Dotenv::createImmutable(__DIR__)->safeLoad();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -header("Access-Control-Allow-Origin: *"); // (2)!
                                                                                                                                                                                                    -header("Access-Control-Allow-Headers: Content-Type, Authorization");
                                                                                                                                                                                                    -header("Content-type: application/json");
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -$LIVEKIT_API_KEY = $_ENV["LIVEKIT_API_KEY"] ?? "devkey"; // (3)!
                                                                                                                                                                                                    -$LIVEKIT_API_SECRET = $_ENV["LIVEKIT_API_SECRET"] ?? "secret"; // (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import all necessary dependencies from the PHP LiveKit library.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Configure HTTP headers for the web server: enable CORS support, allow the Content-Type and Authorization headers and set the response content type to application/json.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The API key of LiveKit Server.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The API secret of LiveKit Server.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The index.php file imports the required dependencies, sets the HTTP headers for the web server and loads the necessary environment variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    <?php
                                                                                                                                                                                                    -if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] === "POST" && $_SERVER["PATH_INFO"] === "/token") {
                                                                                                                                                                                                    -    $data = json_decode(file_get_contents("php://input"), true);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    $roomName = $data["roomName"] ?? null;
                                                                                                                                                                                                    -    $participantName = $data["participantName"] ?? null;
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if (!$roomName || !$participantName) {
                                                                                                                                                                                                    -        http_response_code(400);
                                                                                                                                                                                                    -        echo json_encode(["errorMessage" => "roomName and participantName are required"]);
                                                                                                                                                                                                    -        exit();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    $tokenOptions = (new AccessTokenOptions()) // (1)!
                                                                                                                                                                                                    -        ->setIdentity($participantName);
                                                                                                                                                                                                    -    $videoGrant = (new VideoGrant()) // (2)!
                                                                                                                                                                                                    -        ->setRoomJoin()
                                                                                                                                                                                                    -        ->setRoomName($roomName);
                                                                                                                                                                                                    -    $token = (new AccessToken($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)) // (3)!
                                                                                                                                                                                                    -        ->init($tokenOptions)
                                                                                                                                                                                                    -        ->setGrant($videoGrant)
                                                                                                                                                                                                    -        ->toJwt();
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    echo json_encode(["token" => $token]); // (4)!
                                                                                                                                                                                                    -    exit();
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit PHP SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, the token is sent back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    <?php
                                                                                                                                                                                                    -$webhookReceiver = (new WebhookReceiver($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)); // (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] === "POST" && $_SERVER["PATH_INFO"] === "/livekit/webhook") {
                                                                                                                                                                                                    -    $headers = getallheaders();
                                                                                                                                                                                                    -    $authHeader = $headers["Authorization"]; // (2)!
                                                                                                                                                                                                    -    $body = file_get_contents("php://input"); // (3)!
                                                                                                                                                                                                    -    try {
                                                                                                                                                                                                    -        $event = $webhookReceiver->receive($body, $authHeader); // (4)!
                                                                                                                                                                                                    -        error_log("LiveKit Webhook:");
                                                                                                                                                                                                    -        error_log(print_r($event->getEvent(), true)); // (5)!
                                                                                                                                                                                                    -        exit();
                                                                                                                                                                                                    -    } catch (Exception $e) {
                                                                                                                                                                                                    -        http_response_code(401);
                                                                                                                                                                                                    -        echo "Error validating webhook event";
                                                                                                                                                                                                    -        echo json_encode($e->getMessage());
                                                                                                                                                                                                    -        exit();
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a new WebhookReceiver object providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The Authorization header of the HTTP request.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The raw body of the HTTP request as a string.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Consume the event as you wish.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    We first create a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. Then we must retrieve the Authorization header and the raw body of the HTTP request. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally, we obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request. We can consume the event as we wish (in this case, we just log it using the error output).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/python/index.html b/3.0.0-beta3/docs/tutorials/application-server/python/index.html deleted file mode 100644 index 7e1faac3..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/python/index.html +++ /dev/null @@ -1,4754 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Python Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Python Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Python with Flask that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses LiveKit Python SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the server directory

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Create a python virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python -m venv venv
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Activate the virtual environment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      .\venv\Scripts\activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      . ./venv/bin/activate
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. -

                                                                                                                                                                                                      Install dependencies

                                                                                                                                                                                                      -
                                                                                                                                                                                                      pip install -r requirements.txt
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. -

                                                                                                                                                                                                      Run the application

                                                                                                                                                                                                      -
                                                                                                                                                                                                      python app.py
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Flask app with a single file app.py that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the app.py file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.py
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    import os
                                                                                                                                                                                                    -from flask import Flask, request
                                                                                                                                                                                                    -from flask_cors import CORS
                                                                                                                                                                                                    -from dotenv import load_dotenv
                                                                                                                                                                                                    -from livekit.api import AccessToken, VideoGrants, TokenVerifier, WebhookReceiver # (1)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -load_dotenv() # (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -SERVER_PORT = os.environ.get("SERVER_PORT", 6080) # (3)!
                                                                                                                                                                                                    -LIVEKIT_API_KEY = os.environ.get("LIVEKIT_API_KEY", "devkey") # (4)!
                                                                                                                                                                                                    -LIVEKIT_API_SECRET = os.environ.get("LIVEKIT_API_SECRET", "secret") # (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -app = Flask(__name__) # (6)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -CORS(app) # (7)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import all necessary dependencies from livekit library
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Load environment variables from .env file
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The port where the application will be listening
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The API key of LiveKit Server
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. The API secret of LiveKit Server
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Initialize the Flask application
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Enable CORS support
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.py file imports the required dependencies and loads the necessary environment variables from .env file using dotenv library:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally the Flask application is initialized and CORS support is enabled.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    @app.post("/token")
                                                                                                                                                                                                    -def create_token():
                                                                                                                                                                                                    -    room_name = request.json.get("roomName")
                                                                                                                                                                                                    -    participant_name = request.json.get("participantName")
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if not room_name or not participant_name:
                                                                                                                                                                                                    -        return {"errorMessage": "roomName and participantName are required"}, 400
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    token = (
                                                                                                                                                                                                    -        AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!
                                                                                                                                                                                                    -        .with_identity(participant_name) # (2)!
                                                                                                                                                                                                    -        .with_grants(api.VideoGrants(room_join=True, room=room_name)) # (3)!
                                                                                                                                                                                                    -    )
                                                                                                                                                                                                    -    return {"token": token.to_jwt()} # (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Python SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    token_verifier = TokenVerifier(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!
                                                                                                                                                                                                    -webhook_receiver = WebhookReceiver(token_verifier) # (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -@app.post("/livekit/webhook")
                                                                                                                                                                                                    -def receive_webhook():
                                                                                                                                                                                                    -    auth_token = request.headers.get("Authorization") # (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    if not auth_token:
                                                                                                                                                                                                    -        return "Authorization header is required", 401
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    try:
                                                                                                                                                                                                    -        event = webhook_receiver.receive(request.data.decode("utf-8"), auth_token) # (4)!
                                                                                                                                                                                                    -        print("LiveKit Webhook:", event) # (5)!
                                                                                                                                                                                                    -        return "ok"
                                                                                                                                                                                                    -    except:
                                                                                                                                                                                                    -        print("Authorization header is not valid")
                                                                                                                                                                                                    -        return "Authorization header is not valid", 401
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Initialize a TokenVerifier using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Initialize a WebhookReceiver using the TokenVerifier. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Get the 'Authorization' header from the HTTP request.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the 'Authorization' header.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Consume the event as you whish.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    First of all, we need a WebhookReceiver for validating and decoding incoming webhook events. We initialize it with a TokenVerifier built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Inside the receive_webhook handler we:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the Authorization header. In this way, we can validate the event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. If everything is ok, you can consume the event as you whish (in this case, we just log it).
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/ruby/index.html b/3.0.0-beta3/docs/tutorials/application-server/ruby/index.html deleted file mode 100644 index 535c504e..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/ruby/index.html +++ /dev/null @@ -1,4718 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ruby Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Ruby Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Ruby with Sinatra that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses LiveKit Ruby SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Ruby app using the popular Sinatra web library. It has a single file app.rb that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the app.rb file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    require 'sinatra'
                                                                                                                                                                                                    -require 'sinatra/cors'
                                                                                                                                                                                                    -require 'sinatra/json'
                                                                                                                                                                                                    -require 'livekit' # (1)!
                                                                                                                                                                                                    -require './env.rb'
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -SERVER_PORT = ENV['SERVER_PORT'] || 6080 # (2)!
                                                                                                                                                                                                    -LIVEKIT_API_KEY = ENV['LIVEKIT_API_KEY'] || 'devkey' # (3)!
                                                                                                                                                                                                    -LIVEKIT_API_SECRET = ENV['LIVEKIT_API_SECRET'] || 'secret' # (4)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -set :port, SERVER_PORT # (5)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -register Sinatra::Cors # (6)!
                                                                                                                                                                                                    -set :allow_origin, '*' # (7)!
                                                                                                                                                                                                    -set :allow_methods, 'POST,OPTIONS'
                                                                                                                                                                                                    -set :allow_headers, 'content-type'
                                                                                                                                                                                                    -set :bind, '0.0.0.0' # (8)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import livekit library
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. The port where the application will be listening
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. The API key of LiveKit Server
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. The API secret of LiveKit Server
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Configure the port
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    11. Enable CORS support
                                                                                                                                                                                                    12. -
                                                                                                                                                                                                    13. Set allowed origin (any), methods and headers
                                                                                                                                                                                                    14. -
                                                                                                                                                                                                    15. Listen in any available network interface of the host
                                                                                                                                                                                                    16. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The app.rb file imports the required dependencies and loads the necessary environment variables (defined in env.rb file):

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Finally the application configures the port, sets the CORS configuration for Sinatra and binds the application to all available network interfaces (0.0.0.0).

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token endpoint#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    post '/token' do
                                                                                                                                                                                                    -  body = JSON.parse(request.body.read)
                                                                                                                                                                                                    -  room_name = body['roomName']
                                                                                                                                                                                                    -  participant_name = body['participantName']
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  if room_name.nil? || participant_name.nil?
                                                                                                                                                                                                    -    status 400
                                                                                                                                                                                                    -    return json({errorMessage: 'roomName and participantName are required'})
                                                                                                                                                                                                    -  end
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  token = LiveKit::AccessToken.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (1)!
                                                                                                                                                                                                    -  token.identity = participant_name # (2)!
                                                                                                                                                                                                    -  token.add_grant(roomJoin: true, room: room_name) # (3)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -  return json({token: token.to_jwt}) # (4)!
                                                                                                                                                                                                    -end
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Ruby SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    36
                                                                                                                                                                                                    -37
                                                                                                                                                                                                    -38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    post '/livekit/webhook' do
                                                                                                                                                                                                    -  auth_header = request.env['HTTP_AUTHORIZATION'] # (1)!
                                                                                                                                                                                                    -  token_verifier = LiveKit::TokenVerifier.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (2)!
                                                                                                                                                                                                    -  begin
                                                                                                                                                                                                    -    token_verifier.verify(auth_header) # (3)!
                                                                                                                                                                                                    -    body = JSON.parse(request.body.read) # (4)!
                                                                                                                                                                                                    -    puts "LiveKit Webhook: #{body}" # (5)!
                                                                                                                                                                                                    -    return
                                                                                                                                                                                                    -  rescue => e
                                                                                                                                                                                                    -    puts "Authorization header is not valid: #{e}"
                                                                                                                                                                                                    -  end
                                                                                                                                                                                                    -end
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a new TokenVerifier instance providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Verify the Authorization header with the TokenVerifier.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Now that we are sure the event is valid, we can parse the request JSON body to get the actual webhook event.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Consume the event as you whish.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    We need to verify that the event is coming from our LiveKit Server. For that we need the Authorization header from the HTTP request and a TokenVerifier instance built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If the verification is successful, we can parse the request JSON body and consume the event (in this case, we just log it).

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/tutorials/application-server/rust/index.html b/3.0.0-beta3/docs/tutorials/application-server/rust/index.html deleted file mode 100644 index 62462178..00000000 --- a/3.0.0-beta3/docs/tutorials/application-server/rust/index.html +++ /dev/null @@ -1,4880 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Rust Server Tutorial - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Rust Server Tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This is a minimal server application built for Rust with Axum that allows:

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    It internally uses the LiveKit Rust SDK.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running this tutorial#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    1. Run OpenVidu Server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Download OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Configure the local deployment

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -.\configure_lan_private_ip_windows.bat
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_macos.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-local-deployment/community
                                                                                                                                                                                                      -./configure_lan_private_ip_linux.sh
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run OpenVidu

                                                                                                                                                                                                      -
                                                                                                                                                                                                      docker compose up
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    2. Download the tutorial code#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    3. Run the server application#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Navigate into the server directory -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Install dependencies -
                                                                                                                                                                                                      bundle install
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Run the application -
                                                                                                                                                                                                      ruby app.rb
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    4. Run a client application to test against this server#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    npm install -g http-server
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      http-server -p 5080 ./src
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Run the application:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Navigate into the application client directory:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Install the required dependencies:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm install
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. -

                                                                                                                                                                                                      Serve the application:

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm start
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      -

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      -

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      -
                                                                                                                                                                                                        -
                                                                                                                                                                                                      1. -

                                                                                                                                                                                                        Localhost limitations:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      2. -
                                                                                                                                                                                                      3. -

                                                                                                                                                                                                        Serve over local network:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      4. -
                                                                                                                                                                                                      5. -

                                                                                                                                                                                                        Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        -

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      6. -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run android
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      npm run ios
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      -

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking the "Run" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. -

                                                                                                                                                                                                      Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. -

                                                                                                                                                                                                      Run the application in an emulator or a physical device by clicking on the menu Product > Run or by ⌘R.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    -

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Understanding the code#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The application is a simple Rust app with a single file main.rs that exports two endpoints:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Let's see the code of the main.rs file:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                     1
                                                                                                                                                                                                    - 2
                                                                                                                                                                                                    - 3
                                                                                                                                                                                                    - 4
                                                                                                                                                                                                    - 5
                                                                                                                                                                                                    - 6
                                                                                                                                                                                                    - 7
                                                                                                                                                                                                    - 8
                                                                                                                                                                                                    - 9
                                                                                                                                                                                                    -10
                                                                                                                                                                                                    -11
                                                                                                                                                                                                    -12
                                                                                                                                                                                                    -13
                                                                                                                                                                                                    -14
                                                                                                                                                                                                    -15
                                                                                                                                                                                                    -16
                                                                                                                                                                                                    -17
                                                                                                                                                                                                    -18
                                                                                                                                                                                                    -19
                                                                                                                                                                                                    -20
                                                                                                                                                                                                    -21
                                                                                                                                                                                                    -22
                                                                                                                                                                                                    -23
                                                                                                                                                                                                    -24
                                                                                                                                                                                                    -25
                                                                                                                                                                                                    -26
                                                                                                                                                                                                    -27
                                                                                                                                                                                                    -28
                                                                                                                                                                                                    -29
                                                                                                                                                                                                    -30
                                                                                                                                                                                                    -31
                                                                                                                                                                                                    -32
                                                                                                                                                                                                    -33
                                                                                                                                                                                                    -34
                                                                                                                                                                                                    -35
                                                                                                                                                                                                    -36
                                                                                                                                                                                                    use axum::http::HeaderMap;
                                                                                                                                                                                                    -use axum::{
                                                                                                                                                                                                    -    extract::Json, http::header::CONTENT_TYPE, http::Method, http::StatusCode, routing::post,
                                                                                                                                                                                                    -    Router,
                                                                                                                                                                                                    -};
                                                                                                                                                                                                    -use dotenv::dotenv;
                                                                                                                                                                                                    -use livekit_api::access_token::AccessToken; // (1)!
                                                                                                                                                                                                    -use livekit_api::access_token::TokenVerifier;
                                                                                                                                                                                                    -use livekit_api::access_token::VideoGrants;
                                                                                                                                                                                                    -use livekit_api::webhooks::WebhookReceiver;
                                                                                                                                                                                                    -use serde_json::{json, Value};
                                                                                                                                                                                                    -use std::env;
                                                                                                                                                                                                    -use tokio::net::TcpListener;
                                                                                                                                                                                                    -use tower_http::cors::{Any, CorsLayer};
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -#[tokio::main]
                                                                                                                                                                                                    -async fn main() {
                                                                                                                                                                                                    -    dotenv().ok(); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    let server_port = env::var("SERVER_PORT").unwrap_or("6081".to_string());
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    let cors = CorsLayer::new() // (3)!
                                                                                                                                                                                                    -        .allow_methods([Method::POST])
                                                                                                                                                                                                    -        .allow_origin(Any)
                                                                                                                                                                                                    -        .allow_headers([CONTENT_TYPE]);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    let app = Router::new() // (4)!
                                                                                                                                                                                                    -        .route("/token", post(create_token))
                                                                                                                                                                                                    -        .route("/livekit/webhook", post(receive_webhook))
                                                                                                                                                                                                    -        .layer(cors);
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    let listener = tokio::net::TcpListener::bind("0.0.0.0:".to_string() + &server_port)
                                                                                                                                                                                                    -        .await
                                                                                                                                                                                                    -        .unwrap();
                                                                                                                                                                                                    -    axum::serve(listener, app).await.unwrap(); // (5)!
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Import all necessary dependencies from the Rust LiveKit library.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Load environment variables from .env file.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Enable CORS support.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Define /token and /livekit/webhook endpoints.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Start the server listening on the specified port.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The main.rs file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Then CORS support is enabled and the endpoints are defined. Finally the axum application is initialized on the specified port.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Create token endpoint#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    38
                                                                                                                                                                                                    -39
                                                                                                                                                                                                    -40
                                                                                                                                                                                                    -41
                                                                                                                                                                                                    -42
                                                                                                                                                                                                    -43
                                                                                                                                                                                                    -44
                                                                                                                                                                                                    -45
                                                                                                                                                                                                    -46
                                                                                                                                                                                                    -47
                                                                                                                                                                                                    -48
                                                                                                                                                                                                    -49
                                                                                                                                                                                                    -50
                                                                                                                                                                                                    -51
                                                                                                                                                                                                    -52
                                                                                                                                                                                                    -53
                                                                                                                                                                                                    -54
                                                                                                                                                                                                    -55
                                                                                                                                                                                                    -56
                                                                                                                                                                                                    -57
                                                                                                                                                                                                    -58
                                                                                                                                                                                                    -59
                                                                                                                                                                                                    -60
                                                                                                                                                                                                    -61
                                                                                                                                                                                                    -62
                                                                                                                                                                                                    -63
                                                                                                                                                                                                    -64
                                                                                                                                                                                                    -65
                                                                                                                                                                                                    -66
                                                                                                                                                                                                    -67
                                                                                                                                                                                                    -68
                                                                                                                                                                                                    -69
                                                                                                                                                                                                    -70
                                                                                                                                                                                                    -71
                                                                                                                                                                                                    -72
                                                                                                                                                                                                    -73
                                                                                                                                                                                                    -74
                                                                                                                                                                                                    -75
                                                                                                                                                                                                    -76
                                                                                                                                                                                                    -77
                                                                                                                                                                                                    -78
                                                                                                                                                                                                    -79
                                                                                                                                                                                                    -80
                                                                                                                                                                                                    -81
                                                                                                                                                                                                    -82
                                                                                                                                                                                                    -83
                                                                                                                                                                                                    -84
                                                                                                                                                                                                    -85
                                                                                                                                                                                                    -86
                                                                                                                                                                                                    -87
                                                                                                                                                                                                    -88
                                                                                                                                                                                                    async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<Value>) {
                                                                                                                                                                                                    -    if let Some(payload) = payload {
                                                                                                                                                                                                    -        let livekit_api_key = env::var("LIVEKIT_API_KEY").unwrap_or("devkey".to_string());
                                                                                                                                                                                                    -        let livekit_api_secret = env::var("LIVEKIT_API_SECRET").unwrap_or("secret".to_string());
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        let room_name = match payload.get("roomName") {
                                                                                                                                                                                                    -            Some(value) => value,
                                                                                                                                                                                                    -            None => {
                                                                                                                                                                                                    -                return (
                                                                                                                                                                                                    -                    StatusCode::BAD_REQUEST,
                                                                                                                                                                                                    -                    Json(json!({ "errorMessage": "roomName is required" })),
                                                                                                                                                                                                    -                );
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -        let participant_name = match payload.get("participantName") {
                                                                                                                                                                                                    -            Some(value) => value,
                                                                                                                                                                                                    -            None => {
                                                                                                                                                                                                    -                return (
                                                                                                                                                                                                    -                    StatusCode::BAD_REQUEST,
                                                                                                                                                                                                    -                    Json(json!({ "errorMessage": "participantName is required" })),
                                                                                                                                                                                                    -                );
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        let token = match AccessToken::with_api_key(&livekit_api_key, &livekit_api_secret) // (1)!
                                                                                                                                                                                                    -            .with_identity(&participant_name.to_string()) // (2)!
                                                                                                                                                                                                    -            .with_name(&participant_name.to_string())
                                                                                                                                                                                                    -            .with_grants(VideoGrants { // (3)!
                                                                                                                                                                                                    -                room_join: true,
                                                                                                                                                                                                    -                room: room_name.to_string(),
                                                                                                                                                                                                    -                ..Default::default()
                                                                                                                                                                                                    -            })
                                                                                                                                                                                                    -            .to_jwt() // (4)!
                                                                                                                                                                                                    -        {
                                                                                                                                                                                                    -            Ok(token) => token,
                                                                                                                                                                                                    -            Err(_) => {
                                                                                                                                                                                                    -                return (
                                                                                                                                                                                                    -                    StatusCode::INTERNAL_SERVER_ERROR,
                                                                                                                                                                                                    -                    Json(json!({ "errorMessage": "Error creating token" })),
                                                                                                                                                                                                    -                );
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -        return (StatusCode::OK, Json(json!({ "token": token }))); // (5)!
                                                                                                                                                                                                    -    } else {
                                                                                                                                                                                                    -        return (
                                                                                                                                                                                                    -            StatusCode::BAD_REQUEST,
                                                                                                                                                                                                    -            Json(json!({ "errorMessage": "roomName and participantName are required" })),
                                                                                                                                                                                                    -        );
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Finally, the token is sent back to the client.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Rust SDK:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Finally, the token is sent back to the client.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Receive webhook#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    async fn receive_webhook(headers: HeaderMap, body: String) -> (StatusCode, String) {
                                                                                                                                                                                                    -    let livekit_api_key = env::var("LIVEKIT_API_KEY").unwrap_or("devkey".to_string());
                                                                                                                                                                                                    -    let livekit_api_secret = env::var("LIVEKIT_API_SECRET").unwrap_or("secret".to_string());
                                                                                                                                                                                                    -    let token_verifier = TokenVerifier::with_api_key(&livekit_api_key, &livekit_api_secret); // (1)!
                                                                                                                                                                                                    -    let webhook_receiver = WebhookReceiver::new(token_verifier); // (2)!
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    let auth_header = match headers.get("Authorization") { // (3)!
                                                                                                                                                                                                    -        Some(header_value) => match header_value.to_str() {
                                                                                                                                                                                                    -            Ok(header_str) => header_str,
                                                                                                                                                                                                    -            Err(_) => {
                                                                                                                                                                                                    -                return (
                                                                                                                                                                                                    -                    StatusCode::BAD_REQUEST,
                                                                                                                                                                                                    -                    "Invalid Authorization header format".to_string(),
                                                                                                                                                                                                    -                );
                                                                                                                                                                                                    -            }
                                                                                                                                                                                                    -        },
                                                                                                                                                                                                    -        None => {
                                                                                                                                                                                                    -            return (
                                                                                                                                                                                                    -                StatusCode::BAD_REQUEST,
                                                                                                                                                                                                    -                "Authorization header is required".to_string(),
                                                                                                                                                                                                    -            );
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    };
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -    match webhook_receiver.receive(&body, auth_header) { // (4)!
                                                                                                                                                                                                    -        Ok(event) => {
                                                                                                                                                                                                    -            println!("LiveKit WebHook: {:?}", event); // (5)!
                                                                                                                                                                                                    -            return (StatusCode::OK, "ok".to_string());
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -        Err(_) => {
                                                                                                                                                                                                    -            return (
                                                                                                                                                                                                    -                StatusCode::UNAUTHORIZED,
                                                                                                                                                                                                    -                "Error validating webhook event".to_string(),
                                                                                                                                                                                                    -            );
                                                                                                                                                                                                    -        }
                                                                                                                                                                                                    -    }
                                                                                                                                                                                                    -}
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Consume the event as you wish.
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    We declare as function parameters the map of headers (headers: HeaderMap) and the raw body (body: String) of the HTTP request. We will need both of them to validate and decode the incoming webhook event. We then:

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. -
                                                                                                                                                                                                    3. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    4. -
                                                                                                                                                                                                    5. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    6. -
                                                                                                                                                                                                    7. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    8. -
                                                                                                                                                                                                    9. Consume the event as you wish (in this case, we just log it).
                                                                                                                                                                                                    10. -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    -

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -


                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/ui-components/angular-components/index.html b/3.0.0-beta3/docs/ui-components/angular-components/index.html deleted file mode 100644 index dd4ea62b..00000000 --- a/3.0.0-beta3/docs/ui-components/angular-components/index.html +++ /dev/null @@ -1,4255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Angular Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Angular Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Introduction#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Angular Components are the simplest way to create real-time videoconferencing apps with Angular. There's no need to manage state or low-level events; Angular Components from OpenVidu handle all the complexity for you.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    This Angular library, offers developers a robust set of powerful and comprehensive videoconferencing components. These components are highly adaptable, extendable, and easily replaceable, allowing you to tailor them to your application's specific requirements.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Angular Components Angular -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    Angular Components
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    The primary goal of the OpenVidu team is to minimize the developer's effort when creating videoconferencing applications. Angular Components significantly contribute to this objective for several reasons:

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Rapid Development

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Abstracts the complexity of videoconferencing applications, allowing you to focus on customizations

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Flexible Customization

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Offers maximum customization flexibility, allowing you to adapt, extend, and replace any component

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Easy Maintenance

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Ensures your code remains up to date, making it easier to update your application with each new OpenVidu release

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    How to use#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Using Angular Components in your application is straightforward. The official Angular Components Tutorials cover everything Angular Components offers, from customizing colors and branding logos to injecting new custom features.

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Videoconference

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Videoconference component is the core of Angular Components. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Panel

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      The Panel components is the root of side panels in the videoconference. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prefabricated Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Angular Components provides a wide range of prefabricated components that you can use to build your videoconferencing application in a matter of minutes. These components are designed for direct use without any extensions or modifications.

                                                                                                                                                                                                    - - -

                                                                                                                                                                                                    Directives#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Angular Components provides two types of directives: Structural Directives and Attribute Directives.

                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Structural Directives: These directives manipulate the DOM by adding or removing elements from the view.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      They are distinguished by the asterisk (*) prefix and must be placed inside an HTML element within any Featured Component.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      For example, the *ovToolbar directive allows you to add a custom toolbar to the videoconference, replacing the default one.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Attribute Directives: Commonly known as Components Inputs, allow you to manipulate the appearance or behavior of an element.

                                                                                                                                                                                                      -

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Events#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Each component in Angular Components emits a set of events that you can listen to in your application to trigger specific actions.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    These events are designed to provide you with the flexibility to customize your videoconferencing application according to your requirements.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    You can check out all component events in the Angular Components API Reference.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Applications#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    A practical example showcases the potential of Angular Components is our production-ready flagship application, OpenVidu Call. This application is built using Angular Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    References#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/docs/ui-components/react-components/index.html b/3.0.0-beta3/docs/ui-components/react-components/index.html deleted file mode 100644 index 1b5923b8..00000000 --- a/3.0.0-beta3/docs/ui-components/react-components/index.html +++ /dev/null @@ -1,4212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - React Components - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    React Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Introduction#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    React Components are the simplest way to create real-time audio/video applications with React. There's no need to manage state or low level events, React Components from LiveKit handle all the complexity for you.

                                                                                                                                                                                                    - -

                                                                                                                                                                                                    A curated set of components that we believe are essential and serve as a solid foundation for most applications.

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      LiveKitRoom

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      It provides the Room context to all its children, serving as the root component of your application, and also exposes the Room state through a React context.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      RoomAudioRenderer

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      It manages remote participants' audio tracks and ensures that microphones and screen sharing are audible. It also provides a way to control the volume of each participant.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      TrackLoop

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Provides an easy way to loop through all participant camera and screen tracks. For each track, TrackLoop creates a TrackRefContext that you can use to render the track.

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prefabricated Components#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Prefabricated are constructed using components and enhanced with additional functionalities, unique styles, and practical defaults. They are designed for immediate use and are not meant to be extended.

                                                                                                                                                                                                    - - -

                                                                                                                                                                                                    Contexts#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Contexts are used to allow child components to access parent state without having to pass it down the component tree via props

                                                                                                                                                                                                    - - -

                                                                                                                                                                                                    Hooks#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Hooks are functions that let you use state and other React features without writing a class. They are functions that let you “hook into” React state and lifecycle features from function components.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    React Components provides a set of hooks that you can use to interact with the components and the underlying LiveKit client.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    See Reference

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Applications#

                                                                                                                                                                                                    -

                                                                                                                                                                                                    A practical example showcases the potential of React Components is the production-ready flagship application, LiveKit Meet. This application is built using React Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    References#

                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/index.html b/3.0.0-beta3/index.html index ebc7d603..82a45777 100644 --- a/3.0.0-beta3/index.html +++ b/3.0.0-beta3/index.html @@ -1,4188 +1,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - openVidu - openVidu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - - - - -
                                                                                                                                                                                                    - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    A powerful platform to develop WebRTC real-time applications. Self-hosted, performant, fault tolerant, scalable and observable.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    - OpenVidu allows you to implement ultra-low latency video - and audio applications with ease: one-to-one calls, videoconference rooms of - any size, massive live streamings with thousands of viewers... It is built - on the best open source WebRTC stacks with all the - features you need: multi-platform, recording, broadcasting, screen sharing - and more. From an operations perspective we aim to make it easy to - self-host a performant, fault-tolerant, scalable and - observable cluster, reducing DevOps efforts. -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - -

                                                                                                                                                                                                    Home#

                                                                                                                                                                                                    -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    - Create your real-time video and audio application with ease -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Ready to use app

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      You get OpenVidu Call with every OpenVidu installation.
                                                                                                                                                                                                      A fully-fledged videoconference application with all the features you expect: multiparty, device selection, screen share, chat, recording, virtual background and more!

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      All is customizable

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      If you want to integrate OpenVidu into your own application, there are UI Components that are quickly to setup but also highly customizable. If you want total control, you can use SDKs to fine-tune the integration of OpenVidu in your app. Learn more at Developing your OpenVidu app.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Self-hosted

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu is designed from the ground up to be self-hosted in your own servers. With OpenVidu you can easily deploy and manage a production-ready live-video solution in your own infrastructure, whether it is on premises or in your favorite cloud provider. Leverage your hardware and regain control of your users' data!

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Professional support

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      We are experts in WebRTC. We have been developing real time tools and supporting customers building their solutions for over a decade. Let's work together to make your project a success! Contact us now.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    - Self-host a production-ready live-video platform with advanced capabilities typically reserved for SaaS solutions -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Easy to deploy

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      What could take a whole DevOps team days of work, with OpenVidu you can have it ready in minutes: an easy installation, configuration and administration experience to your self-hosted, production grade, real-time solution. Install now.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Cost effective

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu COMMUNITY is open source, free and can handle a significant user load. With OpenVidu PRO you can handle more simultaneous Rooms in the same hardware thanks to mediasoup integration. This allows reducing the cost of each Room, making OpenVidu PRO truly cost-effective as a self-hosted solution. See Pricing.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Performant

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Scalable

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Fault tolerant

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Observable

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    - All the features you need to quickly build your perfect real-time application -

                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      WebRTC

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Achieve ultra-low latency in your videoconference or live streaming app thanks to WebRTC.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Security at all levels

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      E2E encryption, fine-grained access control and highly secure deployments for the most demanding security requirements.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Multiplatform

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Chrome, Firefox, Safari, Android, iOS, Unity, Windows, MacOS, Linux... OpenVidu is compatible with all of them.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Up to 4K video and HQ audio

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      HD up to 4K video resolution, and crisp audio quality with noise cancellation and echo suppression.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Recording

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Record your videocalls with complete freedom. You can use predefined layouts or easily build your own.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Broadcast to YouTube/Twitch

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      OpenVidu allows you to easily broadcast your sessions to live-streaming platforms such as YouTube or Twitch.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Screen sharing

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Screen share from browsers or native applications with ease, always with the best quality.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Virtual Backgrounds

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      Apply effects to your videos, blurring the background or replacing it with an image.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    • -

                                                                                                                                                                                                      Server side processing

                                                                                                                                                                                                      -
                                                                                                                                                                                                      -

                                                                                                                                                                                                      For the most advanced use cases: you can add pipelines to process video and audio streams in real time in your servers.

                                                                                                                                                                                                      -
                                                                                                                                                                                                    • -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    Build, deploy on-premises and scale your videoconferencing or live streaming app with ease. Contact us if you need it : we are here to help!

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - -
                                                                                                                                                                                                    - - - -
                                                                                                                                                                                                    - - - - - - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Redirecting... + + +

                                                                                                                                                                                                    Redirecting to getting started...

                                                                                                                                                                                                    + + diff --git a/3.0.0-beta3/overrides/home.html b/3.0.0-beta3/overrides/home.html deleted file mode 100644 index 695beeca..00000000 --- a/3.0.0-beta3/overrides/home.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "main.html" %} {% block tabs %} {{ super() }} - - - -
                                                                                                                                                                                                    -
                                                                                                                                                                                                    - -
                                                                                                                                                                                                    -

                                                                                                                                                                                                    {{config.site_description}}

                                                                                                                                                                                                    -

                                                                                                                                                                                                    - OpenVidu allows you to implement ultra-low latency video - and audio applications with ease: one-to-one calls, videoconference rooms of - any size, massive live streamings with thousands of viewers... It is built - on the best open source WebRTC stacks with all the - features you need: multi-platform, recording, broadcasting, screen sharing - and more. From an operations perspective we aim to make it easy to - self-host a performant, fault-tolerant, scalable and - observable cluster, reducing DevOps efforts. -

                                                                                                                                                                                                    - -
                                                                                                                                                                                                    - -{% endblock %} diff --git a/3.0.0-beta3/overrides/main.html b/3.0.0-beta3/overrides/main.html deleted file mode 100644 index a0e07c1b..00000000 --- a/3.0.0-beta3/overrides/main.html +++ /dev/null @@ -1,133 +0,0 @@ - -{% extends "base.html" %} - -{% block announce %} -
                                                                                                                                                                                                    Coming from OpenVidu 2? Find out all you need to know on this page
                                                                                                                                                                                                    -{% endblock %} - -{% block libs %} - -{{ super() }} - - - - - - - -{% endblock %} - -{% block outdated %} -Warning: You are reading docs for an old version
                                                                                                                                                                                                    - - GO TO LATEST VERSION - -{% endblock %} - -{% block extrahead %} - -{{ super() }} - -{% endblock %} - -{% block scripts %} - -{{ super() }} - -{% endblock %} - -{% block styles %} -{{ super() }} -{% if page.meta and page.meta.hide %} -{% if "footer-prev" in page.meta.hide %} - -{% endif %} -{% if "footer-next" in page.meta.hide %} - -{% endif %} -{% if "search-bar" in page.meta.hide %} - -{% endif %} -{% if "version-selector" in page.meta.hide %} - -{% endif %} -{% endif %} -{% endblock %} \ No newline at end of file diff --git a/3.0.0-beta3/overrides/partials/footer.html b/3.0.0-beta3/overrides/partials/footer.html deleted file mode 100644 index 5537509b..00000000 --- a/3.0.0-beta3/overrides/partials/footer.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/3.0.0-beta3/overrides/partials/header.html b/3.0.0-beta3/overrides/partials/header.html deleted file mode 100644 index ec789668..00000000 --- a/3.0.0-beta3/overrides/partials/header.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - -{% set class = "md-header" %} -{% if "navigation.tabs.sticky" in features %} - {% set class = class ~ " md-header--shadow md-header--lifted" %} -{% elif "navigation.tabs" not in features %} - {% set class = class ~ " md-header--shadow" %} -{% endif %} - - - - - - - - -
                                                                                                                                                                                                    - - - - - {% if "navigation.tabs.sticky" in features %} - {% if "navigation.tabs" in features %} - {% include "partials/tabs.html" %} - {% endif %} - {% endif %} -
                                                                                                                                                                                                    - - -{% if page.title != "Account" %} - -{% endif %} \ No newline at end of file diff --git a/3.0.0-beta3/search/search_index.json b/3.0.0-beta3/search/search_index.json index edde8740..6fee511e 100644 --- a/3.0.0-beta3/search/search_index.json +++ b/3.0.0-beta3/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":"
                                                                                                                                                                                                    • Ready to use app

                                                                                                                                                                                                      You get OpenVidu Call with every OpenVidu installation.A fully-fledged videoconference application with all the features you expect: multiparty, device selection, screen share, chat, recording, virtual background and more!

                                                                                                                                                                                                    • All is customizable

                                                                                                                                                                                                      If you want to integrate OpenVidu into your own application, there are UI Components that are quickly to setup but also highly customizable. If you want total control, you can use SDKs to fine-tune the integration of OpenVidu in your app. Learn more at Developing your OpenVidu app.

                                                                                                                                                                                                    • Self-hosted

                                                                                                                                                                                                      OpenVidu is designed from the ground up to be self-hosted in your own servers. With OpenVidu you can easily deploy and manage a production-ready live-video solution in your own infrastructure, whether it is on premises or in your favorite cloud provider. Leverage your hardware and regain control of your users' data!

                                                                                                                                                                                                    • Professional support

                                                                                                                                                                                                      We are experts in WebRTC. We have been developing real time tools and supporting customers building their solutions for over a decade. Let's work together to make your project a success! Contact us now.

                                                                                                                                                                                                    • Easy to deploy

                                                                                                                                                                                                      What could take a whole DevOps team days of work, with OpenVidu you can have it ready in minutes: an easy installation, configuration and administration experience to your self-hosted, production grade, real-time solution. Install now.

                                                                                                                                                                                                    • Cost effective

                                                                                                                                                                                                      OpenVidu COMMUNITY is open source, free and can handle a significant user load. With OpenVidu PRO you can handle more simultaneous Rooms in the same hardware thanks to mediasoup integration. This allows reducing the cost of each Room, making OpenVidu PRO truly cost-effective as a self-hosted solution. See Pricing.

                                                                                                                                                                                                    • Performant

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                    • Scalable

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                    • Fault tolerant

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                    • Observable

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                    • WebRTC

                                                                                                                                                                                                      Achieve ultra-low latency in your videoconference or live streaming app thanks to WebRTC.

                                                                                                                                                                                                    • Security at all levels

                                                                                                                                                                                                      E2E encryption, fine-grained access control and highly secure deployments for the most demanding security requirements.

                                                                                                                                                                                                    • Multiplatform

                                                                                                                                                                                                      Chrome, Firefox, Safari, Android, iOS, Unity, Windows, MacOS, Linux... OpenVidu is compatible with all of them.

                                                                                                                                                                                                    • Up to 4K video and HQ audio

                                                                                                                                                                                                      HD up to 4K video resolution, and crisp audio quality with noise cancellation and echo suppression.

                                                                                                                                                                                                    • Recording

                                                                                                                                                                                                      Record your videocalls with complete freedom. You can use predefined layouts or easily build your own.

                                                                                                                                                                                                    • Broadcast to YouTube/Twitch

                                                                                                                                                                                                      OpenVidu allows you to easily broadcast your sessions to live-streaming platforms such as YouTube or Twitch.

                                                                                                                                                                                                    • Screen sharing

                                                                                                                                                                                                      Screen share from browsers or native applications with ease, always with the best quality.

                                                                                                                                                                                                    • Virtual Backgrounds

                                                                                                                                                                                                      Apply effects to your videos, blurring the background or replacing it with an image.

                                                                                                                                                                                                    • Server side processing

                                                                                                                                                                                                      For the most advanced use cases: you can add pipelines to process video and audio streams in real time in your servers.

                                                                                                                                                                                                    Build, deploy on-premises and scale your videoconferencing or live streaming app with ease. Contact us if you need it : we are here to help! Talk to an expert"},{"location":"#get-started","title":"Create your real-time video and audio application with ease","text":""},{"location":"#get-started","title":"Self-host a production-ready live-video platform with advanced capabilities typically reserved for SaaS solutions","text":""},{"location":"#get-started","title":"All the features you need to quickly build your perfect real-time application","text":""},{"location":"account/","title":"Account","text":""},{"location":"pricing/","title":"Pricing","text":""},{"location":"pricing/#pricing","title":"Pricing","text":"OpenVidu COMMUNITY OpenVidu PRO Price Free 0.0006$ core/minuteFree while in beta! * Type of deployment OpenVidu Single Node OpenVidu Elastic OpenVidu High Availability Suitability For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install

                                                                                                                                                                                                    About OpenVidu Pro free beta period

                                                                                                                                                                                                    • OpenVidu Pro is currently in beta and will remain completely free until GA.
                                                                                                                                                                                                    • All users running a beta version of OpenVidu Pro will be notified weeks before the free beta period ends, giving time to upgrade to the final GA version if desired.
                                                                                                                                                                                                    • Active OpenVidu Pro clusters in beta version will eventually shut down automatically after the free beta period ends.
                                                                                                                                                                                                    "},{"location":"pricing/#how-is-openvidu-pro-priced","title":"How is OpenVidu Pro priced?There is a 15-day free trial period waiting for you!","text":"

                                                                                                                                                                                                    OpenVidu Pro follows a simple pricing model based on the number of cores used by the OpenVidu Pro cluster:

                                                                                                                                                                                                    $0.0006 per core per minute available for your OpenVidu PRO cluster

                                                                                                                                                                                                    Taking into account the following points:

                                                                                                                                                                                                    • You only pay for your OpenVidu Pro cluster(s) for the time they are running. Usage will be registered the moment you start your cluster and will stop as soon as you shut your cluster down. When turned on, your cluster will be charged even in idle state (without active Rooms).
                                                                                                                                                                                                    • You pay for every available core at any given time: if you cluster grows for one hour, that hour you will pay more. If your cluster decreases the next hour, next hour will be cheaper. Master Nodes and Media Nodes have the same core per minute price.
                                                                                                                                                                                                    • Your OpenVidu Pro cluster(s) need to allow outbound traffic to domain accounts.openvidu.io port 443. If you are behind a very restrictive corporate firewall that doesn't allow this, please contact us through commercial@openvidu.io.
                                                                                                                                                                                                    Get an OpenVidu License"},{"location":"pricing/#why-is-openvidu-pro-priced-like-this","title":"Why is OpenVidu Pro priced like this?","text":"

                                                                                                                                                                                                    There are deliberate reasons for this pricing model in OpenVidu Pro:

                                                                                                                                                                                                    • We believe that a platform specifically designed to be self-hosted should have a pricing model that is as close to hardware as possible: that is the total number of cores available to the cluster over time.
                                                                                                                                                                                                    • This pricing model is simple, transparent and easy to predict: you pay only for the time the cluster is running and always according to its size.
                                                                                                                                                                                                    • The cost is directly proportional to the size of your cluster: larger clusters pay more, smaller clusters pay less.
                                                                                                                                                                                                    • Elasticity is encouraged: adjust the size of your cluster according to the load at any given time to minimize costs.
                                                                                                                                                                                                    "},{"location":"pricing/#when-and-how-are-you-charged","title":"When and how are you charged?","text":"

                                                                                                                                                                                                    Users must create an OpenVidu account and get an OpenVidu License. This license will be required to deploy an OpenVidu Pro cluster (OpenVidu Elastic or OpenVidu High Availability).

                                                                                                                                                                                                    When purchasing an OpenVidu License, you will have to indicate your billing address and a credit card. You will receive a 15-day free trial period during which you will not be charged at all.

                                                                                                                                                                                                    After the free trial period, a monthly billing cycle will charge all your expenses to your credit card. Therefore, you will receive an invoice each month. You can review your upcoming expenses and your past invoices in your OpenVidu account page. And don't worry: we don't store any credit card data. The entire billing process is securely done via Stripe.

                                                                                                                                                                                                    OpenVidu Pro clusters will automatically report their usage on a recurring basis. That's why they need outbound access to domain accounts.openvidu.io port 443. If you are behind a very restrictive corporate firewall that doesn't allow this, please contact us through commercial@openvidu.io.

                                                                                                                                                                                                    "},{"location":"pricing/#pricing-examples","title":"Pricing examplesThere is a 15-day free trial period waiting for you!","text":"

                                                                                                                                                                                                    As explained above, every minute of an OpenVidu Pro cluster is charged according to the number of cores available for the cluster. So let's see some actual examples, first noting the following points:

                                                                                                                                                                                                    • The examples represent a continuous usage of the cluster, but remember that you can shut it down whenever you are not using it and that you can drop nodes to save resources.
                                                                                                                                                                                                    • Each example shows in a table the price for 8 hours, 1 day and 1 month of continuous usage, as well as the approximated amount of video Tracks and Rooms of 8 participants the cluster would support. This is done to provide a basic insight into the capacity of each cluster. These 8-to-8 Rooms assume 64 video Tracks (640x480) and 64 audio Tracks in them (2 tracks published and 14 tracks subscribed per Participant), with no Egress, Ingress or other additional features.
                                                                                                                                                                                                    Get an OpenVidu License"},{"location":"pricing/#openvidu-elastic-with-12-cores-in-total","title":"OpenVidu Elastic with 12 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster has 1 Master Node of 4 cores and 2 Media Nodes of 4 cores each.

                                                                                                                                                                                                    Number of video Tracks 2000 Number of Rooms with 8 Participants 250 8 hours $3.46 24 hours (1 day of uninterrupted use) $10.37 720 hours (1 month of uninterrupted use) $311.04"},{"location":"pricing/#openvidu-elastic-with-20-cores-in-total","title":"OpenVidu Elastic with 20 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster has 1 Master Node of 4 cores and 4 Media Nodes of 4 cores each.

                                                                                                                                                                                                    Number of video Tracks 4000 Number of Rooms with 8 Participants 500 8 hours $5.76 24 hours (1 day of uninterrupted use) $17.28 720 hours (1 month of uninterrupted use) $518.40"},{"location":"pricing/#openvidu-high-availability-with-32-cores-in-total","title":"OpenVidu High Availability with 32 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro HA cluster has 4 Master Nodes of 4 cores each and 4 Media Nodes of 4 cores each. The number of simultaneous Rooms and Tracks will be the same as in the previous example, but this cluster will provide fault tolerance thanks to the replication of the Master Nodes.

                                                                                                                                                                                                    Number of video Tracks 4000 Number of Rooms with 8 Participants 500 8 hours $9.21 24 hours (1 day of uninterrupted use) $27.65 720 hours (1 month of uninterrupted use) $829.44"},{"location":"pricing/#openvidu-elastic-with-a-variable-number-of-cores","title":"OpenVidu Elastic with a variable number of cores","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster takes advantage of the elasticity of the platform. It has a fixed Master Node of 4 cores, but a variable number of Media Nodes. Let's imagine a scenario where our days are divided in three phases according to the user load:

                                                                                                                                                                                                    • First 8 hours of the day the demand is low. 1 Media Node of 4 cores is enough to handle it.
                                                                                                                                                                                                    • The next 8 hours of the day the user load increases significantly (this is very typical if our application is used more during working hours). We add another Media Node of 8 cores to handle this new demand.
                                                                                                                                                                                                    • The last 8 hours of the day the demand decreases, and we are able to remove the Media Node of 8 cores and keep only the Media Node of 4 cores.
                                                                                                                                                                                                    First 8 hours of the day with low demand(8 cores in total) Video Tracks1000 8x8 Rooms125Price$2.30 Next 8 hours of the day with high demand(16 cores in total) Price$4.61 Video Tracks3000 8x8 Rooms375 Last 8 hours of the day with low demand(8 cores in total) Price$2.30 Video Tracks1000 8x8 Rooms125 Total for 1 day $9.21 Total for 1 month $276.30"},{"location":"support/","title":"Support","text":"

                                                                                                                                                                                                    Self-hosting your own solutions can be challenging. We have built OpenVidu to make this task as easy as possible. But of course you may encounter difficulties in the process, or your particular use case may require customized assistance. The OpenVidu team specializes in customer support. Together we will make your project a success!

                                                                                                                                                                                                    "},{"location":"support/#commercial-support","title":"Commercial support","text":"

                                                                                                                                                                                                    Do not hesitate to contact us at commercial@openvidu.io. We provide consultancy, prioritizing bug fixes or new features, custom app development, etc.

                                                                                                                                                                                                    Let's work together and build something great!

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Do you need help updating from OpenVidu 2 to OpenVidu 3? Write us to pro.support.v2apps@openvidu.io and we will be happy to guide you through the process.

                                                                                                                                                                                                    "},{"location":"support/#community-support","title":"Community support","text":"

                                                                                                                                                                                                    The public forum is the right place to ask any questions that do not involve private information, so that the whole community can benefit from the exchange of ideas.

                                                                                                                                                                                                    "},{"location":"blog/","title":"Blog","text":""},{"location":"conditions/cookie-policy/","title":"Cookie Policy","text":""},{"location":"conditions/cookie-policy/#what-are-cookies","title":"What are cookies?","text":"

                                                                                                                                                                                                    TIKAL TECHNOLOGIES SL web page uses cookies, which are small files that it exchanges with the visitor's web browser for different purposes. That is done in a totally \"invisible\" and harmless way for the visitor, so your visit to the page is more fluid and you are not interrupted by some functions. The following explains which is the usage of cookies in TIKAL TECHNOLOGIES SL website and how you can disable them if you don't agree.

                                                                                                                                                                                                    "},{"location":"conditions/cookie-policy/#what-kind-of-information-do-we-collect","title":"What kind of information do we collect?","text":"

                                                                                                                                                                                                    TIKAL TECHNOLOGIES SL web page uses cookies for the following purposes

                                                                                                                                                                                                    • Functional cookies: they are used to improve the visitor's navigation through the website, making it more user-friendly. It is important to understand that cookies do not contain any kind of specific personal information, and most of them are deleted from the hard disk at the end of the browser session.
                                                                                                                                                                                                    • Analytical Cookies: TIKAL TECHNOLOGIES SL website uses cookies from Google Analytics, to analyze how visitors use the page. This way, TIKAL TECHNOLOGIES SL can offer improvements in the usability of the webpage. Google Analytics only collects and processes anonymous data through the TIKAL TECHNOLOGIES SL website. There is further information about the management of Google Analytics' web analysis services at www.google.com/analytics.
                                                                                                                                                                                                    "},{"location":"conditions/cookie-policy/#how-are-users-able-to-change-the-cookies-configuration-in-their-browsers","title":"How are users able to change the cookies configuration in their browsers?","text":"

                                                                                                                                                                                                    Any browser allows you to make adjustments on the actions to perform whenever a website asks you to store a cookie. You can:

                                                                                                                                                                                                    • Allow web pages to deposit cookies in the browser.
                                                                                                                                                                                                    • Allow the cookies of the visited web pages only to remain in the browser as long as the page remains open.
                                                                                                                                                                                                    • Do not allow web pages to deposit cookies in the browser. Please note that in this case, some website functions will not be operational or the full page could even not work at all.
                                                                                                                                                                                                    • Allow one by one which web pages will be able to deposit cookies in the browser. Please note that in unauthorized pages some website functions will not be operational or the full page could even not work at all.

                                                                                                                                                                                                    The modification of the cookies configuration can be done in the option \"Configuration\" of the browser, in the \"Privacy\" section.

                                                                                                                                                                                                    "},{"location":"conditions/privacy-policy/","title":"Privacy Policy","text":"

                                                                                                                                                                                                    In accordance with the provisions of Regulation (EU) 2016/679 and the Organic Law 3/2018 of 5 December, on the protection of personal data and guarantee of digital rights, we inform you that the data you provide will be incorporated to the treatment system owned by TIKAL TECHNOLOGIES SL with CIF B85986669 and address at Calle Chile, N\u00ba 10, 28290 - Las Rozas de Madrid (Madrid), for the purpose of ELECTRONIC COMMERCE, CUSTOMER MANAGEMENT, AND OTHER PURPOSES. Your data may be processed by third parties (they will be data processors recipients of your data for contractual purposes for example, our computer maintenance company) requiring the same level of established rights, obligations and responsibilities. Your details will be kept for the time only strictly necessary. They will be deleted when a period of time has elapsed without any use being made of it. You agree to notify us of any changes in the data. You will be able to exercise your access rights, rectification, limitation of treatment, deletion, portability and opposition to processing of your personal data by addressing your request to the management or to the e-mail info@naevatec.com. You can contact the appropriate supervisory authority to make any complaint you may consider necessary.

                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/","title":"Terms of Service","text":"

                                                                                                                                                                                                    The purpose of the following terms and conditions is to explain our obligations as providers of the service, as well as your obligations as a client. Please read them carefully.

                                                                                                                                                                                                    The aforementioned terms and conditions shall be applied from the moment TIKAL TECHNOLOGIES provides you with access to the service, thus it is understood that you have voluntarily accepted them as part of the contractual obligations between the parties involved, that is, between TIKAL TECHNOLOGIES (TIKAL form now on) and you as client. OpenVidu PRO is a service which will vary with time, so as to adapt to its clients and users\u00b4 new requirements, which in turn, will likely affect the terms and conditions so that they suit the changes and variations made to TIKAL.

                                                                                                                                                                                                    TIKAL reserves the right to change the terms and conditions at any given moment, notwithstanding, it shall always endeavour to communicate these via e-mail or through the application itself; consequently, we strongly advise you to ensure that you have read and understood the terms and conditions whose most recent, updated version, is available on our website.

                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#first-definitions","title":"First. Definitions.","text":"

                                                                                                                                                                                                    For the legal purposes of this contract, the following definitions will apply:

                                                                                                                                                                                                    1. Software application: a set of instructions which will be interpreted, utilized and executed by a computer system. Even when there may be many of them, the present contract may refer to them in singular, and likewise when pertaining to its backup files.
                                                                                                                                                                                                    2. Telematics application: a software application within a server which is connected to the Internet such that it can be accessed remotely through electronic networks. The assignment of the license to use the telematics application OpenVidu PRO is the subject of the present contract.
                                                                                                                                                                                                    3. Client of the telematics application: the natural or legal person who benefits from the licence to use the telematics application, thus assuming all obligations arising from the present contract.
                                                                                                                                                                                                    4. User of the telematics application: the natural person authorized by the client to use the telematics application, who in turn assumes all obligations arising from the present contract and said utilization.
                                                                                                                                                                                                    5. Parties: TIKAL and the client.
                                                                                                                                                                                                    6. Exploitation rights over the telematics application: TIKAL TECHNOLOGIES SL
                                                                                                                                                                                                    7. Third parties: any natural or legal person alien to the present contractual relation, who, for any reason, enters into a formal, legally binding agreement with either TIKAL or the client.
                                                                                                                                                                                                    8. The service, all supporting infrastructure provided by TIKAL that allows the client to register, download, provision bill, and operate its instance of the telematics application
                                                                                                                                                                                                    9. Hardware: electronic, mechanic or magnetic devices necessary for the telematics application, and its complementary parts, to work properly.
                                                                                                                                                                                                    10. Personal data: any information regarding an identified or identifiable natural person.
                                                                                                                                                                                                    11. Updates: new versions of the telematics application and/or its modules, which include new functionalities and improvements when compared to earlier versions.
                                                                                                                                                                                                    12. Telematics application modules: parts of the telematics application which manage specific functionalities, and whose licence to use them, the client must acquire separately.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#second-purpose","title":"Second. Purpose","text":"
                                                                                                                                                                                                    1. The purpose of the present contract is the licensing of the right to use the telematics application OpenVidu PRO by TIKAL TECHNOLOGIES SL. to the client, so that it may be use in the management of their business. Subject to the terms and conditions provided in this agreement, TIKAL hereby grants to the client a non-exclusive, non-sublicensable, non-transferable license to use the telematics application OpenVidu PRO (from now on \u201ctelematics application\u201d). Under no circumstances however, does said licence grant the client sales rights over the telematics application whose ownership remains entirely with TIKAL TECHNOLOGIES SL.
                                                                                                                                                                                                    2. The client\u00b4s rights to use the telematics application are subjected and limited by both the duration, and the terms and conditions established in the present contract.
                                                                                                                                                                                                    3. Hereby the client agrees to use the telematics application in compliance with the law, the present contract, and the good and rational will inherently present in any civilized society.
                                                                                                                                                                                                    4. The client acknowledges having examined that OpenVidu PRO features fulfil their needs, and that it has been appropriately informed by TIKAL about them.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#third-use-limitations-and-duty-of-care","title":"Third. Use limitations and duty of care.","text":"
                                                                                                                                                                                                    1. The client must protect and guard the telematics application; thus, it may not share any information whatsoever with third parties. It is specifically forbidden the use of the telematics application outside the business sphere for which it has been acquired, or outside any of the dispositions stipulated in this contract. The client may not sell, lease, transfer, or otherwise sublicense the telematics application or take part in any act which may result in the violation of their duty of care and protection. The client may not assign, transfer, pledge or make any other disposition of the rights acquired through this contract, of any part of the contract, or of any of the rights, claims or obligations under the contract.
                                                                                                                                                                                                    2. The client is obligated to refrain from using the telematics application for illegal purposes or any other purposes contrary to what is established in the present contract, or any action that may be injurious to TIKAL\u00b4s rights and interests, to the owner of the telematics application, as well as to any third parties involved. Said actions include, but are not limited to, any deed that may harm, overload, disrupt, or otherwise render useless the telematics application, thus preventing other clients and users from making use of it.
                                                                                                                                                                                                    3. Changes to the telematics application are strictly forbidden. These include, but are not limited to, such things as reverse engineering, decompiling, disassembling, reproducing, translating, modifying, commercializing, cloning, transforming or transmitting to any natural or legal person, partially or entirely, by any means, whether mechanic, magnetic, photocopies, etc\u2026 or to eliminate or block any proprietary notice or logos pertaining to the telematics application. The components and elements subject to the aforementioned restrictions include, but are not limited to, such things as the logical diagrams, source codes, object and/or data model; except prior, written authorization from TIKAL. These restrictions stand, even when said actions where needed for the interoperability with other computer programs or telematics applications.
                                                                                                                                                                                                    4. The client or the user must protect and safeguard, both physically and intellectually, the telematics application, namely, its contents, logical procedures, and access protocols, by establishing the necessary means in order to guarantee the non-disclosure, cloning, reproduction, altering, translation, transformation, access by third parties, or any other action that shall imply a violation of the duty of care or of any intellectual and industrial property right.
                                                                                                                                                                                                    5. The telematics application may only be used by the client or authorized user, for processing the client\u00b4s own data and their products, but under no circumstances shall it be used to process third parties \u2018data.
                                                                                                                                                                                                    6. TIKAL cannot guarantee uninterrupted access to the service throughout the entire validity period of this contract due to unforeseeable factors such as network issues, telecommunications service providers, breakdown in computers, as well as other contingencies such as repair and maintenance work, and software updates. Notwithstanding this, TIKAL reserves the right to adopt any necessary measures to limit the service, should it be considered that improper and/or irresponsible use of the telematics application is occurring, specially when said uses run counter to the terms and conditions provided in the present contract.
                                                                                                                                                                                                    7. Should the client or user breach the terms of contract, in a continuous and sustained fashion, or acting in bad faith, TIKAL shall terminate the provision of the service, without reimbursing any amount, on the grounds of abusive and improper use.
                                                                                                                                                                                                    8. Interpretation and scope. Any other right which has not been stated or directly mentioned in the present contract, remains reserved to TIKAL. Under no circumstances shall the terms and conditions of this contract be interpreted or applied in such a fashion that could be injurious to TIKAL or in any manner that runs counter to the regular exploitation framework of a telematics application.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#fourth-liability","title":"Fourth. Liability.","text":"
                                                                                                                                                                                                    1. TIKAL\u00b4s telematics application is access-ready in its current state and configuration. Should the application contain any deficiency attributable to TIKAL TECHNOLOGIES SL, the latter pledges to make use of all the resources available to them in order to solve the issue as promptly as possible. Nonetheless, it declines any liability and does not give any guarantee regarding violations perpetrated by third parties, marketability, satisfactory quality or suitability for a specific purpose.
                                                                                                                                                                                                    2. TIKAL shall act with due diligence and professionalism by making use of all its resources available so as to ensure the quality, reliability, and security of the telematics application. In any case, TIKAL\u00b4s assumes no liability for any damages, direct or indirect, incidental or special, including, but not limited to, such things as damages or financial loss, work disruptions, failure, breakdown, or any losses, even when the possibility of such inconveniences occurring, which include third-party complaints, were previously notified to a member of TIKAL\u00b4s staff.
                                                                                                                                                                                                    3. The client accepts, within reason, to tolerate specific, isolated disruptions in connectivity and hereby forfeits the right to claim any liability, contractual or otherwise, as well as damages owing to possible failures, slowness or access errors. TIKAL declines any liability concerning data loss, accidental or otherwise, resulting from the client\u00b4s actions or activities.
                                                                                                                                                                                                    4. The client or user is solely responsible for the provision and payment of the costs necessary to ensure compatibility between the telematics application and their equipment, including all hardware, software, electronic components, and any other component required to access the telematics application, these include, but are not limited to, such things as telecommunication services, Internet access and connectivity, operating systems, or any other program, equipment or services, required to access and use the telematics application.
                                                                                                                                                                                                    5. TIKAL declines any liability regarding any content that the client or user may host within the telematics application OpenVidu PRO, since at no moment, does TIKAL intervene in the internal processing of said content. Therefore, and in accordance with art.16 of LSSI-CE, TIKAL is not legally bound to remove any content from the server, provided there is no \u201cactual knowledge\u201d that the activity or information stored is illegal, libellous, or injurious to third-party rights or assets. In this regard, it shall be understood that \u201cactual knowledge\u201d exits, when there is a court or administrative decision, ordering to block or remove content and that the contractor (TIKAL) has been made aware of it. Notwithstanding, TIKAL reserves the right to remove this type of content out of its own volition, once it has been detected, whilst the client waives any right to claim or demand compensation. Should the application be in any way damaged due to the introduction of malign software or content (virus, trojan,\u2026) TIKAL reserves the right to automatically terminate the contract without having to pay any compensation whatsoever. On the other hand, TIKAL hereby reserves the right to demand compensation from the client or user for any damages caused to the system.
                                                                                                                                                                                                    6. The client or user shall burden all legal costs incurred when the cause is attributable to them, these include TIKAL lawyers\u2019 fees, even when a final court decision has yet to be reached.
                                                                                                                                                                                                    7. TIKAL uses information security protocols which are broadly accepted and observed by the industry such as firewalls, access-control procedures, and crypto mechanisms in order to avoid any unauthorized access to the data. For this purpose, the client hereby grants TIKAL access to data so that it can perform access-control authentication. The licensing process or any process which entails the introduction of personal data shall always conducted under a rigorous communication protocol so as to ensure no third parties have access to data transmitted electronically.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#fifth-intellectual-and-industrial-property-rights","title":"Fifth. Intellectual and industrial property rights.","text":"
                                                                                                                                                                                                    1. The exploitation rights of the telematics application are owned by TIKAL and protected by Spanish Intellectual Property Laws applicable in any country where it is used. The structure, organization and coding of the telematics application constitute confidential and valuable industrial and commercial secrets which belong to TIKAL. Therefore, the client must treat the telematics application in the same fashion they would when utilizing any material protected by intellectual property rights, thus copying, duplicating, or cloning the application is strictly forbidden.
                                                                                                                                                                                                    2. The present licence to use the telematics application does not imply, either explicitly or implicitly, the assignment of the intellectual and industrial rights over said application, the hardware, or the data model.
                                                                                                                                                                                                    3. Brands must be utilized in accordance with the commercial uses of brands, including acknowledging the proprietor\u2019s name of the brand. Brands may only be used in order identify those printouts produced by the telematics application. Said utilization does not imply or grant any property rights over the application.
                                                                                                                                                                                                    4. The knowledge and expertise intrinsic to the telematics application, as well as the knowledge utilized to configure it, is confidential information which belongs to the owner of the telematics application TIKAL. The client acknowledges this and assumes all liability regarding fraudulent use, or illegal copy or duplication of said application, or complementary programs, or utilization of this information by third parties, being liable for any breach of the present contract, by them or by any person or persons depending or associated with the client, or when these individuals have been granted access, directly or indirectly, to the telematics application by the client.
                                                                                                                                                                                                    5. Updates: For the entire validity period of the present contract, and in accordance with the terms and conditions stipulated in the next paragraph, the client is entitled to have access to the updates of the telematics application as they arise. The client assumes all legal liability for the updates, regarding limitations and duty of care, in the same fashion as with the original computer application. Updates to additional modules of the telematics application shall be given to those clients who have acquired from TIKAL the licence to use said modules.
                                                                                                                                                                                                    6. Hereby the client gives TIKAL consent to incorporate them as such into their business portfolio, thus allowing TIKAL to use their brand and logo on its website as well as in documents which may be given to other potential clients, for the sole purpose of said portfolio, and provided that the client does not express opposition to them being used in such a fashion.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#sixth-right-to-amend","title":"Sixth. Right to amend.","text":"

                                                                                                                                                                                                    TIKAL reserves the right to update the telematics application to the latest version available on the market. Said updates may include, but are not limited to, such things as new functionalities, improvements, and modifications and legal updates to the telematics application, which may vary, at any moment such things as its features, performance, and configuration of the telematics application content.

                                                                                                                                                                                                    TIKAL pledges to evaluate and take into consideration suggestions and requests made by clients and users of the telematics application so that they may be incorporated in the new versions of said application; however, it is TIKAL\u00b4s right, not the client\u00b4s to decide which modifications or improvements may be included in the aforementioned versions.

                                                                                                                                                                                                    TIKAL reserves the right to modify, at any moment, the characteristics, features, and conditions of TIKAL for the benefit and development of the service. With this in mind, TIKAL may only have to observe the formality of having to notify the client via an on-line notice, or by modifying any clause in this contract. Notwithstanding the foregoing, TIKAL shall endeavour to promptly notify the client so that the latter may adapt them.

                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#seventh-exclusion-and-termination-of-licensing","title":"Seventh. Exclusion and termination of licensing.","text":"
                                                                                                                                                                                                    1. TIKAL reserves the right to exclude and/or terminate, temporarily or in a definite manner, the client\u00b4s right to use the telematics application, in case the following occurring:
                                                                                                                                                                                                      • Breach of any of the terms and conditions of the present contract.
                                                                                                                                                                                                      • Breach of law and order and/or improper, illegal, or negligent professional behavior.
                                                                                                                                                                                                      • When a court, administrative, or official decision is made to do so.
                                                                                                                                                                                                    2. The exclusion clause, or termination of this contract, does not imply that TIKAL forfeits the right to take legal actions or file for financial compensation when the client has acted in bad faith to damage, directly or indirectly, the telematics application.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#eighth-communications","title":"Eighth. Communications.","text":"
                                                                                                                                                                                                    1. For the purposes of establishing a line of communication regarding the present contract both parties agree to use the place of residence which appears in it. The client pledges to keep the e-mail account provided in this licensing agreement, operational, activated and updated for the purposes of communications with TIKAL, which constitutes TIKAL\u00b4s preferred line of communication (albeit not the only one). In general terms, the client pledges to keep their personal details updated, and must communicate TIKAL, in a clear, unambiguous manner, of any changes.
                                                                                                                                                                                                    2. Should the client fail to notify said changes, notifications or notices delivered to the address(es) given by the client in the licensing agreement, shall be considered valid.
                                                                                                                                                                                                    3. The client consents that telephone conversations with TIKAL may be recorded with the intent to improve the quality and security of the service.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#ninth-duration","title":"Ninth. Duration.","text":"
                                                                                                                                                                                                    1. The contract shall be valid indefinitely from the moment the client requests it. The client can also put the end to the contract at any time he wishes, being obliged to pay the pending consumed service.
                                                                                                                                                                                                    2. As long as the period contract holds it is understood that the validity of the contract published on TIKAL\u00b4s website and containing all updates, prevails.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#tenth-terms-of-payment","title":"Tenth. Terms of payment.","text":"
                                                                                                                                                                                                    1. The price, payment method, billing and payment of the telematics application licensing, object of the present contract, is stipulated in the Current Official Rates Section published on TIKAL\u00b4s website (https://openvidu.io at the time of writing), which are considered part of a whole to all intents and purposes.
                                                                                                                                                                                                    2. The price stipulated in the aforementioned Current Official Rates Section, do not include valued added tax (VAT), nor does it include any other taxes or fees established by law whose current rates shall be applied for the provision of the service when signing the present contract. Therefore, said amounts may be increased according to current tax rates.
                                                                                                                                                                                                    3. Payment will be done monthly and will cover the whole amount of the service consumed during last month period according to the currently published rates from TIKAL.
                                                                                                                                                                                                    4. Monthly payments include both the basic rate for the provision of the service, and the corresponding rate(s) for any optional or additional service hired.
                                                                                                                                                                                                    5. Payments must be made effective by the credit or debit card that the client has agreed with TIKAL when first hiring the service. Visa and MasterCard shall be the accepted cards.
                                                                                                                                                                                                    6. Total or partial delay in payment by the client for the amount(s) TIKAL has billed them shall grant TIKAL the right to cancel or terminate all contracted obligations in accordance with the present contract. Suspension of the service provision shall be realized within the next fifteen natural days after the contract has reached its expiry date, prior notice to the client. After said fifteen natural days from the day the service was suspended, and prior notification to the client, TIKAL may terminate the contract. If the client pays the full amount owed to TIKAL during said period, the latter shall re-establish the service as promptly as possible from the moment it is notified that the debt has been settled. Notwithstanding the foregoing, TIKAL reserves the right to ask for a two-month deposit as a guarantee before re-establishing the service. The client accepts all liability for any legal costs incurred due to claims made by TIKAL regarding breach of payment after the contract has reached its expiry date, including, but not limited to, such things as the return of invoices and late-payment interest. When the client returns, for any cause alien to TIKAL, two or more direct-debit invoices, TIKAL shall be entitled to unilaterally opt for the annual hiring and billing of the service.
                                                                                                                                                                                                    7. When the client has defaulted on a payment, either totally or partially, during three months, for the amount owed to TIKAL, the latter has the right to rescind the contract between the two parties, as well as the direct and definite termination and cancellation of the service hired by the client, including the database linked to the client\u00b4s services, without prior notice from TIKAL.
                                                                                                                                                                                                    8. TIKAL shall apply upon its rates any current deals and offers existing at the time the client hires the service, provided they comply with the terms and conditions of said deals and offers so that they may benefit from them. The client acknowledges and accepts the fact they may obtain detailed information, at any given time, regarding said deals and offers on TIKAL\u00b4s website or through the habitual communication channels with which TIKAL provides its clients.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#eleventh-data-protection","title":"Eleventh. Data Protection.","text":"

                                                                                                                                                                                                    The parties involved agree that they know, comply with, and are subject to, the Spanish and European laws and legislation regarding Personal Data Protection, thus they must give proper use and treatment to all data arising from any activity subjected to the terms and conditions of this contract.

                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#data-controller-agreement-between-the-client-and-tikal","title":"Data Controller agreement between the client and TIKAL.","text":"

                                                                                                                                                                                                    In accordance with the Spanish Data Protection Laws, TIKAL\u00b4s access to the client\u00b4s personal files shall not be considered a violation of said laws, insofar as TIKAL is effectively the Data Controller and said access is necessary for the provision of the service which is the subject of this contract.

                                                                                                                                                                                                    In this regard, and for the purposes of Data Protection regulation, TIKAL shall be regarded as the \u201cData Controller\u201d of the client\u00b4s data. Notwithstanding the foregoing, TIKAL pledges that it shall treat said data in conformity with the client\u00b4s instructions provided in this contract, and that under no circumstances shall it utilise them for any other purposes outside of what the parties have agreed in this contract, nor shall it transfer or communicate them to a third party, not even for back-up or storage purposes. At the same time, the duration and validity of this agreement shall correspond to the type of service hired by the client.

                                                                                                                                                                                                    Once the provision of said service terminates and the data shall no longer be necessary to perform the aforementioned Data Controller role, all personal data shall be either destroyed or returned to the person, persons or entity responsible for it, as well as any storage medium, documents or files containing personal data.

                                                                                                                                                                                                    In order to provide the service and what said provision entails, TIKAL shall be granted access to the following information:

                                                                                                                                                                                                    1. Contact details
                                                                                                                                                                                                    2. Company profile data
                                                                                                                                                                                                    3. Assets and billed services data
                                                                                                                                                                                                    4. Tax identification data

                                                                                                                                                                                                    TIKAL\u00b4s obligations as Data Controller are described as follows:

                                                                                                                                                                                                    1. Treat all data in accordance with the instructions received by the person, persons or entity in charge of its treatment and only for the purposes provided in this contract.
                                                                                                                                                                                                    2. To not communicate or transfer any data to third parties, except prior consent by the body in charge of its treatment, or in cases provided for by the law.
                                                                                                                                                                                                    3. TIKAL may not outsource, either totally or partially, the provision of the service(s) described in the present contract, except prior authorization from the client whom shall be informed with due notice about the outsourcing entity as well as the services being outsourced. In this case, TIKAL shall draft and execute a new contract with said outsourcing entity, always in accordance with the current Data Protection laws.
                                                                                                                                                                                                    4. To not disclose any personal data to which TIKAL may have had access, even after the termination of this contract.
                                                                                                                                                                                                    5. To guarantee that the staff managing personal data pledge to keep the confidentiality which said data entails and that they comply with the proper security protocols.
                                                                                                                                                                                                    6. To assist the person or body responsible for data treatment regarding data protection.
                                                                                                                                                                                                    7. To provide the person or body responsible for data protection with support and assistance when performing an impact assessment, or when consulting the regulatory authorities, if applicable. Additionally, to provide said person or body with the necessary information so that it may prove their compliance with the rules and regulations.
                                                                                                                                                                                                    8. Notwithstanding the foregoing, said person or body has mechanisms in place so as to guarantee the confidentiality, integrity, and availability of the systems and services concerning data protection, as well as to restore the access and availability to data in case of system failure. Additionally, it is endowed with capabilities so as to regularly verify and assess the efficacy of the security protocol.

                                                                                                                                                                                                    Duties of the responsible for data treatment:

                                                                                                                                                                                                    1. To guarantee, at all times, compliance with the Data Protection Laws.
                                                                                                                                                                                                    2. Make all necessary enquiries beforehand.
                                                                                                                                                                                                    3. To supervise that proper data treatment is occurring.
                                                                                                                                                                                                    4. To provide the data controller with all necessary data for the provision of the service.

                                                                                                                                                                                                    TIKAL\u00b4s duties as Data Controller:

                                                                                                                                                                                                    1. To guarantee, at all times, compliance with the Data Protection Laws.
                                                                                                                                                                                                    2. Make all necessary enquiries beforehand.
                                                                                                                                                                                                    3. To supervise that proper data treatment is occurring.
                                                                                                                                                                                                    4. To provide the data controller with all necessary data for the provision of the service.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#twelfth-confidentiality","title":"Twelfth. Confidentiality.","text":"
                                                                                                                                                                                                    1. All data and information transmitted between the parties is strictly confidential and property of TIKAL and the client, and its protection is of the utmost importance. To this intent, both parties hereby contract the obligation to safeguard said data and information by adopting all appropriate measures to ensure that only authorized individuals shall have access to it; authorized individuals being understood as those employees which are needed by the parties involved so as to keep the provision of the service, which is the object of this contract, in good working order.
                                                                                                                                                                                                    2. In this regard, the signatory parties are hereby subject to the following confidential agreement:
                                                                                                                                                                                                      • Hereby TIKAL pledges to keep confidential all data and information supplied by, and concerning the client, as well as the output arisen from the service provided. In this regard, TIKAL possesses strict internal controls whose objective and end are to guarantee the integrity of the present confidential agreement.
                                                                                                                                                                                                      • The client therefore agrees to keep confidential all data and information arising from TIKAL\u00b4s internal processes, specially the existence, utilization, and functionalities of any process used in the provision of the service.
                                                                                                                                                                                                      • The present confidential agreement shall remain valid even after the termination of the present contractual relation and extends indefinitely to all members of staff that have been granted access to said confidential information.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#thirteenth-termination-rescission-nullity","title":"Thirteenth. Termination. Rescission. Nullity.","text":"
                                                                                                                                                                                                    1. The present contract shall be considered void for infringement, committed by any of the parties involved, of the Spanish Civil Code, and in particular, of the Spanish Commercial Code, and the obligations arising from the following:
                                                                                                                                                                                                      • Mutual consent of the parties involved.
                                                                                                                                                                                                      • When the present contract has reached its expiry date which is specified in clause tenth, or within the subsequent extensions thereof.
                                                                                                                                                                                                      • By unilateral rescission provided that the party wishing to rescind communicates this at least one month in advance.
                                                                                                                                                                                                      • When any of the parties has been officially put into administration, has filed for bankruptcy protection, is under bankruptcy or insolvency proceedings, or is under liquidation or dissolution.
                                                                                                                                                                                                      • Due to any other reason(s) provided for in law.
                                                                                                                                                                                                      • Should any of the parties involved breach the contracted obligations provided in the present contract, the other party may consider it as void. Said consideration warrants no prior notice or compensation of any kind, but for the need to communicate the decision to the other party; unless the unaccrued obligations owed by the party are performed within the next fifteen days, counting from the moment said party was notified that they are in breach of the contract . Notwithstanding the foregoing, the other party reserves the right to claim or file for damages caused by this infringement.
                                                                                                                                                                                                    2. TIKAL pledges to destroy all data provided by the client once the contractual relation is extinguished. Likewise, TIKAL shall destroy or return any document or storage medium containing any IT-related data arising from said contractual relation. Once said contractual relation terminates, the client may request TIKAL to supply them with a hard, back-up copy of all data pertaining to and arising from said relation, to any address the client wishes, prior to a written request to do so, which must be sent within the week after the end of the contract. The client shall burden the costs incurred arising from the handling and mailing of said request.
                                                                                                                                                                                                    3. The client may cease or cancel the use of the telematics application whenever they wish to do so. Should the client or any authorized user by them request the cancellation of the service at TIKAL\u00b4s offices, it shall become effective on the same day said request was made. Therefore, it is advised to carefully observe said process to avoid any resources or data loss that the client or user may have in their TIKAL\u00b4s account. Should it not be possible for them to initiate said cancellation process at TIKAL\u00b4s offices, the client may request it by contacting TIKAL\u00b4s customer service via any of the channels provided in this contract. Said cancellation shall become effective on the day stipulated by the client, provided that the request has been made with enough time to be processed correctly.
                                                                                                                                                                                                    "},{"location":"conditions/terms-of-service/#fourteenth-applicable-legislation-and-jurisdiction","title":"Fourteenth. Applicable legislation and jurisdiction.","text":"

                                                                                                                                                                                                    The present is a business contract regulated by Spanish laws. The parties involved agree that any discrepancy, legal or civil action, claim or complain arising from the interpretation and execution of the present contract, shall be, directly or indirectly, taken to the Court of Madrid, thus all parties involved hereby renounce to take any matters pertaining to this agreement to any other jurisdiction.

                                                                                                                                                                                                    The present document constitutes the total agreement of the parties in relation to the matters covered in this agreement, thus substitutes all previous obligations, liabilities, and agreements, both written and verbal, existing prior to the signature and execution of this contract.

                                                                                                                                                                                                    The following website (www.naevatec.com) belongs to: TIKAL TECHNOLOGIES SL TAX ID: B85986669 10 Chile Rd/St 28290 \u2013 Las Rozas de Madrid (Madrid City) Spain. Registered in the Madrid\u00b4s Trade Register, volume/tome 28043. Book 0 Section 8th of the Registry Book, Page 37, Sheet M-505315.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/","title":"Comparing OpenVidu","text":"

                                                                                                                                                                                                    This section compares OpenVidu to other videoconference/streaming solutions, to better understand what it is, what it is not, and what advantages and disadvantages it may have over them.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-vs-livekit","title":"OpenVidu vs LiveKit","text":"

                                                                                                                                                                                                    First of all, and perhaps the most obvious question, how does OpenVidu differ from LiveKit, and what kind of relationship is there between them? This can be answer with four simple points:

                                                                                                                                                                                                    • OpenVidu is a fork of LiveKit. It is 100% compatible with LiveKit: any application built for LiveKit is compatible with OpenVidu.
                                                                                                                                                                                                    • OpenVidu is a superset of LiveKit. It provides all of the open source features of LiveKit and supports all of its SDKs, but it also extends LiveKit with extra features, APIs and internal enhancements, most notably integration with mediasoup.
                                                                                                                                                                                                    • OpenVidu is a production-ready self-hosted solution. It offers an easy deployment process to self-host a high performance, fault tolerant, scalable and observable cluster. OpenVidu provides an interactive installer that manages all of the complexities, so you can quickly host a production deployment that would otherwise require advanced devops/SRE expertise.
                                                                                                                                                                                                    • OpenVidu is a support team for self-hosted deployments. The OpenVidu team is made up of real-time experts with over a decade of experience in the field. We specialize in customer support and are always ready to help you bring your ideas to life.

                                                                                                                                                                                                    OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your cluster.

                                                                                                                                                                                                    LiveKit comes in two flavors: LiveKit Open Source and LiveKit Cloud.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-community-vs-livekit-open-source","title":"OpenVidu COMMUNITY vs LiveKit Open Source","text":"

                                                                                                                                                                                                    LiveKit Open Source is probably the most advanced and feature-rich open source WebRTC stack available today. It has a simple but very versatile API design, and has a large collection of SDKs to integrate into your application on both the frontend and backend. Regardless of your technology stack, there is sure to be a LiveKit Open Source SDK available for you! This is why OpenVidu is fully compatible with LiveKit protocols. You can use any LiveKit SDK to build your application, and it will work seamlessly with an OpenVidu deployment.

                                                                                                                                                                                                    What does OpenVidu Community bring over LiveKit Open Source?

                                                                                                                                                                                                    With OpenVidu Community you get a handful of features on top of LiveKit Open Source that will help with the development of your application:

                                                                                                                                                                                                    • Egress and Ingress services already integrated with a Redis instance: LiveKit allows you to export media from a Room (for example recording it) or import media into a Room (for example ingesting a video file), using Egress and Ingress services respectively. These modules are independent of LiveKit Server and must be correctly configured and connected via a shared Redis. When running OpenVidu Community you will have all these services properly integrated, so you can focus on developing your app without worrying about anything else.
                                                                                                                                                                                                    • S3 compatible storage for Egress recordings: OpenVidu Community comes with an S3 compatible storage already configured to store Egress recordings (Minio).
                                                                                                                                                                                                    • Administration dashboard to monitor your Rooms: OpenVidu comes with an administration dashboard that allows you to monitor the status of your Rooms. Not only in real time, but also historically: the number of participants, the number of published tracks, Egress and Ingress processes... This is a great tool to have when developing your app, as it can help spotting issues and debugging your application's logic. See more.
                                                                                                                                                                                                    • OpenVidu Call: a fully-fledged videoconference application that you can customize and adapt to your needs. See more.
                                                                                                                                                                                                    • Powerful and easy to use local development environment: OpenVidu provides a Docker Compose based deployment designed for development and testing devices on your local network. It comes with automatic certificate management that makes it easy to test mobile devices in your LAN. See more.
                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-pro-vs-livekit-open-source","title":"OpenVidu PRO vs LiveKit Open Source","text":"

                                                                                                                                                                                                    Deploying LiveKit Open Source in production requires devops/SRE experience to operate your own network of media servers, load balance between them, maintain high uptime and monitor the health of your deployment. OpenVidu Pro makes this an easy process, hiding most of the complexities of such an advanced deployment. With OpenVidu Pro you can self-host a fault-tolerant, scalable and observable cluster, while doubling the original LiveKit Open Source performance to handle twice as many media streams with the same hardware.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-pro-vs-livekit-cloud","title":"OpenVidu PRO vs LiveKit Cloud","text":"

                                                                                                                                                                                                    LiveKit Cloud is the official SaaS solution for LiveKit. They manage the infrastructure, with a pricing model based on the total bandwidth consumed by your application. It offers certain advantages over LiveKit Open Source:

                                                                                                                                                                                                    • Analytics and telemetry dashboard. LiveKit Open Source does not export any metrics or logs out-of-the-box.
                                                                                                                                                                                                    • Massive Rooms for livestreams, where a theoretically unlimited number of viewers can be established for published tracks. In LiveKit Open Source one Room must fit in a single server. LiveKit Cloud overcomes this limitation with a mesh architecture where one media server can connect to other media servers to distribute the load.

                                                                                                                                                                                                    Where does OpenVidu Pro stand in relation to LiveKit Cloud? OpenVidu Pro aims to deliver the same advanced benefits as LiveKit Cloud, but as a self-hosted solution. We intend to provide a performant, fault tolerant, scalable and observable cluster that is easy to deploy, configure and administrate in your own infrastructure. For now, OpenVidu Pro brings:

                                                                                                                                                                                                    • OpenVidu Pro provides a complete observability stack with Grafana, Loki, Promtail and Mimir, as well as OpenVidu Dashboard to visualize the data. See more.
                                                                                                                                                                                                    • We are currently working on supporting the same scalability as LiveKit Cloud to support big videoconferences and massive live streams. See more.
                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-vs-saas-solutions","title":"OpenVidu vs SaaS solutions","text":"

                                                                                                                                                                                                    This includes many services like Agora, GetStream, Daily, Vonage, Jitsi as a Service, Whereby, Zoom SDK, Dolby Millicast, Amazon Chime SDK.

                                                                                                                                                                                                    The main difference between OpenVidu and these services is who owns the infrastructure, and where your users' data flows. All these SaaS solutions provide:

                                                                                                                                                                                                    • A public endpoint that your application connects to, so all media is routed through their servers.
                                                                                                                                                                                                    • Different sets of SDKs to integrate with your application. Some more complete than others, and maybe some low-code options.
                                                                                                                                                                                                    • A pricing model usually based on one of this two options: minutes-per-participant or total GBs of bandwidth consumed.

                                                                                                                                                                                                    Using a SaaS provider is a great option for some use cases, but not all. OpenVidu is designed to be self-hosted. This allows you to have full control over your infrastructure and data, taking the most out of your own resources and complying with the most strict regulations. While having the best features provided by SaaS: scalability, fault tolerance, observability. See Production ready for more information.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-vs-sfus","title":"OpenVidu vs SFUs","text":"

                                                                                                                                                                                                    This includes projects such as Kurento, mediasoup, Pion, Janus, Jitsi Videobridge or Medooze.

                                                                                                                                                                                                    These are all media servers. More specifically, they fall under the umbrella of the so-called SFUs (Selective Forwarding Units): they are able to receive media streams from different clients and selectively forward them to other clients, usually without transcoding or mixing the media.

                                                                                                                                                                                                    SFUs are generally low-level tools. Using them directly to implement real-time applications requires a deep understanding of signaling protocols, codecs, networking and other low-level concepts. OpenVidu is a higher-level abstraction compared to SFUs. It internally uses SFUs to rely the media streams (more specifically Pion and mediasoup), but hides all complexities to offer a simpler way to develop videoconferencing and live streaming applications.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-vs-mediasoup","title":"OpenVidu vs mediasoup","text":"

                                                                                                                                                                                                    mediasoup is a WebRTC SFU. It is a minimalist media server with a super low level API that allows building custom real-time applications. Compared to other SFUs, mediasoup is well known for its outstanding performance.

                                                                                                                                                                                                    OpenVidu uses mediasoup internally to transmit media streams. We have embedded mediasoup as the WebRTC engine right at the core of LiveKit Open Source, which allows OpenVidu to offer the fantastic APIs and SDKs of LiveKit while providing the cutting-edge performance of mediasoup. Learn more about mediasoup integration in section Performance.

                                                                                                                                                                                                    "},{"location":"docs/comparing-openvidu/#openvidu-vs-microsoft-teams-google-meet-zoom","title":"OpenVidu vs Microsoft Teams, Google Meet, Zoom","text":"

                                                                                                                                                                                                    All these well-known video conferencing tools are final applications that provide little to no customization at all. They are proprietary, closed-source apps designed to be used as-is, and they are not intended to be integrated into other systems.

                                                                                                                                                                                                    OpenVidu is inherently different, as it provides a set of APIs and SDKs to integrate real-time video capabilities into your own application. In other words: with OpenVidu you can easily build your own custom Microsoft Teams, Google Meet or Zoom-like application. See Use cases for some examples of what you can build with OpenVidu.

                                                                                                                                                                                                    "},{"location":"docs/getting-started/","title":"Getting started","text":""},{"location":"docs/getting-started/#what-is-openvidu","title":"What is OpenVidu?","text":"

                                                                                                                                                                                                    OpenVidu is a platform that allows you to implement real-time applications. You can build your brand new OpenVidu app from scratch, but it is also very easy to integrate OpenVidu in your already existing application.

                                                                                                                                                                                                    OpenVidu is based on WebRTC technology and allows developing any kind of use case you can imagine: one-to-one calls, video conference rooms, massive live streaming events, management and processing of drones and camera feeds...

                                                                                                                                                                                                    OpenVidu is built on the best open source technologies: LiveKit, from which it inherits all its amazing SDKs to integrate it into your front-end and back-end applications, and mediasoup, from which it inherits the best performance and optimization for media routing.

                                                                                                                                                                                                    OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your self-hosted, production-grade cluster."},{"location":"docs/getting-started/#use-cases","title":"Use cases","text":"

                                                                                                                                                                                                    OpenVidu is a super versatile platform that can be used to build just about any kind of real-time application you can think of. Most common use cases can be classified into one of the following categories:

                                                                                                                                                                                                    "},{"location":"docs/getting-started/#video-conferencing","title":"Video conferencing","text":"

                                                                                                                                                                                                    Video conferencing rooms are virtual spaces where two or more users can send video and audio and interact with each other in real-time. They can scale in size, from a simple 1-to-1 call to a massive video conference with thousands of participants. For example:

                                                                                                                                                                                                    • A 1-to-1 video-call center to attend your customers face to face.
                                                                                                                                                                                                    • An e-health application where doctors can treat their patients directly from it, in a private and secure manner using end-to-end encryption.
                                                                                                                                                                                                    • A banking application where customers may sign a contract, live and recording the call as proof of it.
                                                                                                                                                                                                    • A webinar platform where speakers can give their talks to large audiences, with the possibility of viewers temporarily turning their cameras to ask questions.
                                                                                                                                                                                                    "},{"location":"docs/getting-started/#live-streaming","title":"Live streaming","text":"

                                                                                                                                                                                                    Live streaming applications allow one publisher to broadcast video to many viewers. It can be a single video feed, multiple video feeds (webcam and screen share) or there could be even multiple publishers. The general rule is that the ratio of viewers to publishers is very high, in the order of thousands.

                                                                                                                                                                                                    Ultra-low latency live streaming (below 300ms) allows for actual real-time interaction between the viewers and the publishers. This differs from traditional live streaming platforms where the latency is usually in the order of seconds. In this way you can build applications like:

                                                                                                                                                                                                    • A TEDx-like application, where a speaker can give a talk to a massive audience of thousands of viewers, which may communicate through a chat. Real time subtitles and translations can be added to the stream.
                                                                                                                                                                                                    • An application to stream sport events, where viewers can switch between different cameras to watch the game from different angles to increase fan engagement.
                                                                                                                                                                                                    • A global live auction platform where the auctioneer can be seen by the bidders in real-time with sub-second latency all around the world.
                                                                                                                                                                                                    "},{"location":"docs/getting-started/#robotics-and-embedded-systems","title":"Robotics and embedded systems","text":"

                                                                                                                                                                                                    The future lies in the integration of cameras and sensors in all kinds of devices, everywhere: industry, homes, public spaces, emergency services... OpenVidu can be used to receive and process video and audio streams from these devices, and doing so in real-time. For example:

                                                                                                                                                                                                    • A security system to receive the feed of IP cameras and sending an alert when detecting a person.
                                                                                                                                                                                                    • A drone control system to receive the video feed from each drone camera and securely record it. Any other sensor reading could also be sent to be synchronized later with the recorded video feed.
                                                                                                                                                                                                    • A real-time translation app that uses the latest AI models to provide high-quality translations of spoken language in real time.
                                                                                                                                                                                                    "},{"location":"docs/getting-started/#openvidu-application-architecture","title":"OpenVidu application architecture","text":"

                                                                                                                                                                                                    Any OpenVidu application has 3 different parts:

                                                                                                                                                                                                    • Your OpenVidu deployment: provides all the necessary infrastructure for streaming real-time audio and video. It is built upon LiveKit server and mediasoup server. It can usually be treated as a black box in which its internal aspects are not important: you just deploy it and connect your application to it. It can be a single server or a cluster, deployed on premises or in your cloud provider.
                                                                                                                                                                                                    • Your Application client: runs in your user devices and interacts with the OpenVidu server through any LiveKit client SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit client SDK in your Application client. Your users will join rooms as participants to send and receive real-time audio and video tracks. It needs a token generated by the Application server to join a room.
                                                                                                                                                                                                    • Your Application server: interacts with the OpenVidu deployment through any LiveKit server SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit server SDK in your application server. At a minimum, it is responsible for the generation of tokens for the Application client to join a room. But you can implement your own business logic managing rooms, participants and tracks from the safety of your Application server.
                                                                                                                                                                                                    "},{"location":"docs/getting-started/#basic-concepts","title":"Basic concepts","text":""},{"location":"docs/getting-started/#room","title":"Room","text":"

                                                                                                                                                                                                    A Room is a virtual space where Participants can connect to send and receive media Tracks. Two Participants can only communicate if they are connected to the same Room.

                                                                                                                                                                                                    "},{"location":"docs/getting-started/#participant","title":"Participant","text":"

                                                                                                                                                                                                    A Participant is a user connected to a specific Room. Each Participant can publish as many video and audio Tracks as needed, and subscribe to any other Participant's Tracks, as long as they are connected to the same Room.

                                                                                                                                                                                                    "},{"location":"docs/getting-started/#track","title":"Track","text":"

                                                                                                                                                                                                    A Track is a data flow of audio or video. Participants create them from a local media source (a webcam, a microphone, a screen share) and publish them into a Room. Other Participants of the same Room can subscribe to them.

                                                                                                                                                                                                    With these three concepts you can build any kind of real-time application you can think of. The figure below shows two simple examples.

                                                                                                                                                                                                    Room \"Daily meeting\" has 2 Participants: \"Alice\" is publishing Track \"Webcam\" and \"Mic\" and is receiving Track \"Screen\" from \"Bob\". \"Bob\" is publishing Track \"Screen\" and receiving Tracks \"Webcam\" and \"Mic\" from \"Alice\".

                                                                                                                                                                                                    Room \"Remote support\" has 3 Participants: Participant \"Dan\" is not publishing any Track, but receiving all Tracks in the Room. Participant \"Erin\" is only receiving Track \"Mic\" from Participant \"Carol\", but not Track \"Screen\"."},{"location":"docs/getting-started/#openvidu-editions","title":"OpenVidu Editions","text":"

                                                                                                                                                                                                    OpenVidu is available in two editions:

                                                                                                                                                                                                    • OpenVidu COMMUNITY: free to use. It is a single-server deployment and provides a custom LiveKit distribution with Egress, Ingress, S3 storage and monitoring. Ideal for development and testing, but also for medium-scale production deployments. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community in a sufficiently powerful server!
                                                                                                                                                                                                    • OpenVidu PRO: OpenVidu commercial edition. It is a multi-server deployment with all the features of OpenVidu Community plus 2x performance, scalability, fault tolerance and improved monitoring and observability. Ideal for large-scale production deployments with heavy traffic that require the highest standards. You can start with OpenVidu Community and upgrade to OpenVidu Pro when needed.

                                                                                                                                                                                                    Type of deployment OpenViduLocal (development) OpenViduSingle Node OpenViduElastic OpenViduHigh Availability OpenVidu Edition COMMUNITY PRO COMMUNITY PRO PRO Suitability For local development in your laptop For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Friendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your network Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers Your laptop 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install Install"},{"location":"docs/releases/","title":"Releases","text":""},{"location":"docs/releases/#300-beta3","title":"3.0.0-beta3","text":""},{"location":"docs/releases/#changelog","title":"Changelog","text":"
                                                                                                                                                                                                    • Centralized configuration: OpenVidu now automatically manages and synchronizes the configuration of all its components. This means that updating any configuration parameter in multi-node deployments (OpenVidu Elastic and OpenVidu High Availability) is as simple as updating the required file in a single node. OpenVidu handles the distribution and restart of the affected services across all nodes. See how easily you can change the configuration here.
                                                                                                                                                                                                    • mediasoup support:
                                                                                                                                                                                                      • Dynacast is now supported (LiveKit reference).
                                                                                                                                                                                                      • Adaptive Streaming is now supported (LiveKit reference).
                                                                                                                                                                                                      • Speaker Detection events (LiveKit reference).
                                                                                                                                                                                                      • Server API method MutePublishTrack (LiveKit reference).
                                                                                                                                                                                                      • Client API method RemoteTrackPublication.setEnabled (LiveKit JS reference).
                                                                                                                                                                                                    • OpenVidu Call:
                                                                                                                                                                                                      • When using it against an OpenVidu Local Deployment, recordings couldn't be accessed from the application's frontend. This is now fixed and OpenVidu Call is able to access recordings.
                                                                                                                                                                                                      • There was an error when applying Virtual Backgrounds (\"No camera tracks found. Cannot apply background\"). This is now fixed.
                                                                                                                                                                                                      • Docker image openvidu/openvidu-call is now 50% smaller.
                                                                                                                                                                                                    • OpenVidu v2 compatibility:
                                                                                                                                                                                                      • There was a race condition when multiple participants connected to the Session at the same time that could cause remote streamCreated events to not be triggered. This is now fixed.
                                                                                                                                                                                                      • Configuration parameter V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET did not allow configuring subbuckets (\"openvidu\" worked fine, but \"openvidu/subbucket\" did not). Now it is possible to do so.
                                                                                                                                                                                                      • The operation to list recordings (available for REST API, openvidu-java-client, openvidu-node-client) was limited to 1000 recordings. This is now fixed and all recordings are always returned.
                                                                                                                                                                                                    • AWS deployments: all secrets are now synchronized with AWS Secrets Manager. You can update any secret from the AWS console and restart your cluster for them to have immediate effect in all your nodes. This is also true in reverse: you can update any secret inside your node and after a restart of the cluster, the values in AWS Secrets Manager will be properly synchronized.
                                                                                                                                                                                                    • New application tutorials available: iOS, Android, Recording.
                                                                                                                                                                                                    "},{"location":"docs/releases/#known-limitations","title":"Known limitations","text":"
                                                                                                                                                                                                    • When using mediasoup:
                                                                                                                                                                                                      • No ConnectionQualityChanged event (LiveKit reference).
                                                                                                                                                                                                      • No TrackStreamStateChanged event (LiveKit reference).
                                                                                                                                                                                                    "},{"location":"docs/releases/#version-table","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.7.2 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.4.2 MinIO 2024.6.13 Caddy 2.8.4 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"docs/releases/#300-beta2","title":"3.0.0-beta2","text":""},{"location":"docs/releases/#changelog_1","title":"Changelog","text":"
                                                                                                                                                                                                    • Improved mediasoup support:
                                                                                                                                                                                                      • Data messages work (LiveKit reference).
                                                                                                                                                                                                      • Ingress supported (LiveKit reference).
                                                                                                                                                                                                    • Improved OpenVidu Local Deployment:
                                                                                                                                                                                                      • Fixed Room Composite Egress (LiveKit reference) support when using mediasoup.
                                                                                                                                                                                                      • WebHooks (LiveKit reference) supported against a local OpenVidu Call.
                                                                                                                                                                                                    • Production deployments have a better private IP discovery process when there are multiple valid private IPs in the same host. This will make work more deployments out-of-the-box without the need of manual intervention.
                                                                                                                                                                                                    • OpenVidu PRO Evaluation Mode improved. Before a maximum a 2 Rooms of 8 Participants each could be created. Now the upper limit of Participants still apply, but the number of Rooms is unlimited. For example you can have 4 Rooms of 2 Participants each, or 1 Room of 8 Participants.
                                                                                                                                                                                                    • Minor bug fixes related to OpenVidu Call.
                                                                                                                                                                                                    "},{"location":"docs/releases/#known-limitations_1","title":"Known limitations","text":"
                                                                                                                                                                                                    • When using mediasoup:
                                                                                                                                                                                                      • No support for Speaker Detection events (LiveKit reference).
                                                                                                                                                                                                      • No ConnectionQualityChanged event (LiveKit reference).
                                                                                                                                                                                                      • No support for Dynacast (LiveKit reference).
                                                                                                                                                                                                      • No support for Adaptive Streaming (LiveKit reference).
                                                                                                                                                                                                    • When using OpenVidu Call against an OpenVidu Local Deployment, recordings cannot be accessed.
                                                                                                                                                                                                    "},{"location":"docs/releases/#version-table_1","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.6.0 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.2.0 MinIO 2024.06.13 Caddy 2.7.6 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"docs/releases/#300-beta1","title":"3.0.0-beta1","text":""},{"location":"docs/releases/#version-table_2","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.6.0 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.2.0 MinIO 2024.06.13 Caddy 2.7.6 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"docs/developing-your-openvidu-app/","title":"Developing your OpenVidu application","text":"

                                                                                                                                                                                                    Here's a high-level overview of the steps involved in building an OpenVidu application:

                                                                                                                                                                                                    1. Launch an OpenVidu deployment
                                                                                                                                                                                                    2. Use LiveKit Server SDK in your application server
                                                                                                                                                                                                    3. Build the UI of your client application
                                                                                                                                                                                                    4. Deploy OpenVidu and your application
                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/#1-launch-an-openvidu-deployment","title":"1. Launch an OpenVidu deployment","text":"

                                                                                                                                                                                                    The quickest way is to use OpenVidu local deployment.

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/#2-use-livekit-server-sdk-in-your-application-server","title":"2. Use LiveKit Server SDK in your application server","text":"

                                                                                                                                                                                                    OpenVidu is fully compatibly with LiveKit APIs. This means that any LiveKit Server SDK can be used in your application server.

                                                                                                                                                                                                    The only mandatory task to perform in your application server is:

                                                                                                                                                                                                    • Creating access tokens. Your Participants will only be able to connect to your Rooms by using a valid access token. Visit the official documentation about Authentication to learn how to generate access tokens and which permissions you can assign to them.

                                                                                                                                                                                                    There are also other optional tasks that you can perform from your application server, depending on your requirements:

                                                                                                                                                                                                    • Manage your Rooms and Participants: although most of your application logic will be in the frontend, you can also manage the logic of your Rooms and Participants from the security of your application backend. You can list, create, update and destroy Rooms and Participants. This is the official LiveKit documentation with all the available methods of the RoomServiceClient exposed by the Server API. These methods are also available in all LiveKit Server SDKs.
                                                                                                                                                                                                    • Manage Egress and Ingress: if your application needs some kind of recording, broadcasting or media ingestion, this operations must all be performed by your application server.
                                                                                                                                                                                                    • Receive Webhook events: you can also listen to Webhook events in your application backend. In this way you can react to events happening in your Rooms: a Room has started, a Room has finished, a Participant has joined a Room, a Track has been published... Visit the official documentation about Webhooks.
                                                                                                                                                                                                    • Publish Tracks from your backend: this is only for advanced applications that require server-side media publishing. Publishing media from your backend is possible by using LiveKit CLI, Python SDK, Go SDK, Node SDK or Rust SDK.

                                                                                                                                                                                                    To get you started, here is a list of all available LiveKit Server SDKs and an application server tutorial using them. These tutorials are all set up to generate access tokens and receive webhook events, so they are perfect starting points for your application server.

                                                                                                                                                                                                    Node Go Ruby Java Python Rust PHP .NET Server API

                                                                                                                                                                                                    Node Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    Go Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    Ruby Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Java Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Python Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Rust Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    PHP Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    .NET Tutorial

                                                                                                                                                                                                    There is no .NET SDK for LiveKit available. Visit the tutorial to learn how to create tokens and receive Webhook events directly from your .NET application server.

                                                                                                                                                                                                    If your backend technology does not have its own SDK, you have two different options:

                                                                                                                                                                                                    1. Consume the Server API directly: Reference Docs

                                                                                                                                                                                                    2. Use the livekit-cli: GitHub Repository

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/#3-build-the-ui-of-your-client-application","title":"3. Build the UI of your client application","text":"

                                                                                                                                                                                                    There are two main strategies to build the UI of your client application:

                                                                                                                                                                                                    • Use a high-level UI Components library: you can use Angular Components and React Components to quickly set up your UI with building blocks that manage the events and state of the Room for you.
                                                                                                                                                                                                    • Use a low-level client SDK: if you want extensive control and maximum flexibility when designing your UI, use any of the LiveKit Client SDKs.

                                                                                                                                                                                                    The table below summarizes the key differences between these two strategies to help you make an informed decision:

                                                                                                                                                                                                    UI Components Low-level client SDKs What is it? Frontend libraries offering videoconferencing components to build your own application. There are Angular Components or React Components Integrate OpenVidu from scratch in your web, mobile or desktop application using LiveKit Client SDKs Pros
                                                                                                                                                                                                    • Very flexible components: adapt, extend or replace any component
                                                                                                                                                                                                    • Have your first version running in minutes, work on your customizations from there
                                                                                                                                                                                                    • Easily keep your client code up to date with the latest features
                                                                                                                                                                                                    • Unlimited level of customization: build your own UI from scratch as you please
                                                                                                                                                                                                    • Available for all client platforms: browsers, iOS, Android, Flutter, React Native, Unity...
                                                                                                                                                                                                    Cons
                                                                                                                                                                                                    • Only available for Angular and React web apps
                                                                                                                                                                                                    • Higher complexity, although there are plenty of tutorials to smooth the learning curve
                                                                                                                                                                                                    Tutorials Angular Components tutorials Application client tutorials

                                                                                                                                                                                                    Whatever strategy you choose to build the UI of your application, most common steps to perform are:

                                                                                                                                                                                                    • Connect to a Room with an access token: the application client will connect to a Room with an access token generated by your application server. Once connected, the client becomes a Participant of the Room.
                                                                                                                                                                                                    • Publish Tracks to the Room: the application client may create Tracks of any kind (audio from the microphone, video from the camera device, screen sharing from an application...) and publish them to the Room.
                                                                                                                                                                                                    • Subscribe to Tracks from other Participants: the application client may receive the Tracks published by other Participants in the Room. It is possible to perform selective subscription, so the client can choose which Tracks to specifically subscribe to.
                                                                                                                                                                                                    • Mute and unmute Tracks: the application client may mute and unmute its own Tracks, and also may disable the reception of any Track published by other Participants.

                                                                                                                                                                                                    Of course, depending on the use case, this may not be necessary for all users, or other additional steps may need to be taken. For example, in a live streaming application, only presenters will publish Tracks, while all other viewers will only subscribe to them. Or it is possible that users may need exchange messages through a chat. Each specific application will need to refine its use of the UI Components or client SDKs to meet its requirements.

                                                                                                                                                                                                    Here is the list of all LiveKit Client SDKs: LiveKit Client SDKs. Below is a list of application client tutorials, which are perfect starting points for your client application.

                                                                                                                                                                                                    JavaScript

                                                                                                                                                                                                    React

                                                                                                                                                                                                    Angular

                                                                                                                                                                                                    Vue

                                                                                                                                                                                                    Electron

                                                                                                                                                                                                    Ionic

                                                                                                                                                                                                    Android

                                                                                                                                                                                                    iOS

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/#4-deploy-openvidu-and-your-application","title":"4. Deploy OpenVidu and your application","text":"

                                                                                                                                                                                                    You have different options to deploy OpenVidu in a production-ready environment, depending on the level of scalability, fault tolerance and observability you need. See Deployment types for more information.

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/","title":"How to develop your OpenVidu application","text":"

                                                                                                                                                                                                    This page is a collection of the most common operations you may want to perform in your application while integrating OpenVidu. Depending on the scope of the operation, these operations will be performed on the client side using a LiveKit Client SDK, or on the server side using a LiveKit Server SDK (or directly using the HTTP server API). Consider the architecture of an OpenVidu application:

                                                                                                                                                                                                    You can use this page as a cheat sheet to know at a glance how to do something, and you have links to the LiveKit reference documentation of each operation for a more detailed explanation.

                                                                                                                                                                                                    All client side operations are exemplified using the LiveKit JS Client SDK. For other client SDKs, refer to the corresponding LiveKit reference documentation.

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#generate-access-tokens","title":"Generate access tokens","text":"

                                                                                                                                                                                                    The application client needs an access token to connect to a Room. This token must be generated by the application server. Visit LiveKit reference documentation to learn how to generate access tokens:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#manage-rooms","title":"Manage Rooms","text":""},{"location":"docs/developing-your-openvidu-app/how-to/#connect-to-a-room","title":"Connect to a Room","text":"

                                                                                                                                                                                                    To connect to a Room you need the URL of your OpenVidu deployment (which is a WebSocket URL) and the access token generated by your application server.

                                                                                                                                                                                                    import { Room } from \"livekit-client\";\n\nconst room = new Room();\nawait room.connect(wsUrl, token);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#disconnect-from-a-room","title":"Disconnect from a Room","text":"
                                                                                                                                                                                                    await room.disconnect();\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#publish-a-track","title":"Publish a Track","text":"

                                                                                                                                                                                                    You can directly publish the default camera and microphone of the device using methods setCameraEnabled and setMicrophoneEnabled of the LocalParticipant object:

                                                                                                                                                                                                    // Publish a video track from the default camera\nawait room.localParticipant.setCameraEnabled(true);\n// Publish an audio track from the default microphone\nawait room.localParticipant.setMicrophoneEnabled(true);\n

                                                                                                                                                                                                    It is also possible to publish both of them at the same time using method LocalParticipant.enableCameraAndMicrophone, which has the advantage of showing a single permission dialog to the user:

                                                                                                                                                                                                    // Publish both default video and audio tracks triggering a single permission dialog\nawait room.localParticipant.enableCameraAndMicrophone();\n

                                                                                                                                                                                                    To craft a custom Track, you can use the LocalParticipant.createTracks method and publish them with LocalParticipant.publishTrack:

                                                                                                                                                                                                    var tracks = await room.localParticipant.createTracks({\n  audio: {\n    deviceId: \"default\",\n    autoGainControl: true,\n    echoCancellation: true,\n    noiseSuppression: true\n  },\n  video: {\n    deviceId: 'frontcamera';\n    facingMode: 'user'\n  },\n});\nawait Promise.all([\n    room.localParticipant.publishTrack(tracks[0]),\n    room.localParticipant.publishTrack(tracks[1]),\n]);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#muteunmute-a-track","title":"Mute/Unmute a Track","text":"

                                                                                                                                                                                                    To mute the default camera and microphone Tracks:

                                                                                                                                                                                                    await room.localParticipant.setCameraEnabled(false);\nawait room.localParticipant.setMicrophoneEnabled(false);\n

                                                                                                                                                                                                    To mute/unmute a custom Track:

                                                                                                                                                                                                    // Mute the track\nawait track.mute();\n\n// Unmute the track\nawait track.unmute();\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#unpublish-a-track","title":"Unpublish a Track","text":"

                                                                                                                                                                                                    To completely stop sending a Track to the Room, you must unpublish it:

                                                                                                                                                                                                    await room.localParticipant.unpublishTrack(track, true);\n

                                                                                                                                                                                                    The second boolean parameter indicates if the local Track should be stopped. This usually means freeing the device capturing it (switching off the camera LED, for example).

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#send-messages","title":"Send messages","text":"

                                                                                                                                                                                                    You can share information between Participants of a Room in different ways.

                                                                                                                                                                                                    First of all, you can set Room metadata that will be available for all clients in the Room object. You do so in your application server when calling the CreateRoom API (available for all LiveKit Server SDKs and the HTTP Server API). The Room metadata will be available in the client side like this:

                                                                                                                                                                                                    console.log(room.metadata);\n

                                                                                                                                                                                                    You can update the Room metadata at any time from your application server with the UpdateRoomMetadata API (available for all LiveKit Server SDKs and the HTTP Server API). The client side will be notified of the change with the roomMetadataChanged event of the Room object:

                                                                                                                                                                                                    room.on('roomMetadataChanged', (metadata) => {\n  console.log('New room metadata', metadata);\n});\n

                                                                                                                                                                                                    Secondly, you can also set Participant metadata. You do so when creating an access token in your application server, setting metadata field of the JWT.

                                                                                                                                                                                                    Participants can also update their own metadata from the client side, if their access token was created with grant canUpdateOwnMetadata.

                                                                                                                                                                                                    room.localParticipant.setMetadata('new metadata');\n

                                                                                                                                                                                                    The client side will be notified of the change with the participantMetadataChanged event of the Room and/or Participant object:

                                                                                                                                                                                                    // To handle all metadata changes of all participants\nroom.on(RoomEvent.ParticipantMetadataChanged, (previousMetadata: string, participant) => {\n  console.log('New metadata for participant', participant.identity, participant.metadata);\n});\n\n// To handle only metadata changes of a specific participant\nparticipant.on(ParticipantEvent.ParticipantMetadataChanged, (previousMetadata) => {\n    console.log('New metadata for participant', participant.identity, participant.metadata);\n});\n

                                                                                                                                                                                                    Finally, you can send messages to Participants in the Room using the LocalParticipant.publishData method:

                                                                                                                                                                                                    const data: Uint8Array = new TextEncoder().encode(JSON.stringify(''));\nroom.localParticipant.publishData(data, { reliable: true, topic: 'chat', destinationIdentities: ['participant-identity'] });\n

                                                                                                                                                                                                    The DataPublishOptions allow setting the reliability of the message (depending on the nature of the message it can be sent as a reliable or lossy message), a topic to easily filter messages, and the participants that will receive the message.

                                                                                                                                                                                                    The client side will be notified of the message with the dataReceived event of the Room and/or Participant object:

                                                                                                                                                                                                    // To receive all messages from the Room\nroom.on(RoomEvent.DataReceived, (payload: Uint8Array, participant: Participant, kind: DataPacket_Kind) => {\n  const strData = new TextDecoder().decode(payload);\n  console.log('Received data from', participant.identity, strData);\n});\n\n// To receive messages only from a specific participant\nparticipant.on(ParticipantEvent.DataReceived, (payload: Uint8Array, kind: DataPacket_Kind) => {\n  const strData = new TextDecoder().decode(payload);\n  console.log('Received data from', participant.identity, strData);\n});\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#from-your-application-server","title":"From your application server","text":"

                                                                                                                                                                                                    Except for the generation of access tokens, it is possible for all the logic of your application to be contained entirely on the client side. Nonetheless, some use cases may require the management of the Rooms from the server side.

                                                                                                                                                                                                    These operations are only available in the server SDKs, and not in the client SDKs:

                                                                                                                                                                                                    • Closing a Room. From the client side, a user can only leave his own Room.
                                                                                                                                                                                                    • Removing any Participant from a Room. From the client side, a user can only leave his own Room.
                                                                                                                                                                                                    • Muting any Track of any Participant. From the client side, a user can only mute/unmute his own Tracks.
                                                                                                                                                                                                    • Updating the metadata of any Participant. From the client side, a user can only update his own metadata.
                                                                                                                                                                                                    • Updating the metadata of the Room. From the client side this is not possible.
                                                                                                                                                                                                    • Egress operations. Egress cannot be started and stopped on demand by users from the client side.
                                                                                                                                                                                                    • Ingress operations. Ingress cannot be started and stopped on demand by users from the client side.

                                                                                                                                                                                                    You have here the complete list of the server-side operations, documented for the HTTP Server API. All the LiveKit Server SDKs have the same operations.

                                                                                                                                                                                                    • RoomService: to manage Rooms and Participants.
                                                                                                                                                                                                    • Egress: to manage egress operations.
                                                                                                                                                                                                    • Ingress: to manage ingress operations.
                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#screen-sharing","title":"Screen Sharing","text":"

                                                                                                                                                                                                    To quickly publish a screen sharing Track:

                                                                                                                                                                                                    await room.localParticipant.setScreenShareEnabled(true);\n

                                                                                                                                                                                                    You can also create custom screen tracks, for example capturing the audio of the screen and fine-tuning the video capture options (checkout the ScreenTrackOptions interface for detailed information):

                                                                                                                                                                                                    const screenTracks = await room.localParticipant.createScreenTracks({\n    audio: true,\n    contentHint: \"detail\",\n    preferCurrentTab: true,\n    video: {\n        displaySurface: \"window\"\n    }\n});\nawait Promise.all([\n    room.localParticipant.publishTrack(screenTracks[0]),\n    room.localParticipant.publishTrack(screenTracks[1]),\n]);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#virtual-background","title":"Virtual Background","text":"

                                                                                                                                                                                                    It is possible to apply a virtual background to video tracks. In this way you can blur the background or replace it with an image.

                                                                                                                                                                                                    It is necessary to install an additional dependency to use this feature:

                                                                                                                                                                                                    npm add @livekit/track-processors\n

                                                                                                                                                                                                    To blur the background:

                                                                                                                                                                                                    import { BackgroundBlur } from '@livekit/track-processors';\n\nconst videoTrack = await createLocalVideoTrack();\nconst blur = BackgroundBlur(10);\nawait videoTrack.setProcessor(blur);\n

                                                                                                                                                                                                    To replace the background with an image:

                                                                                                                                                                                                    import { VirtualBackground } from '@livekit/track-processors';\n\nconst videoTrack = await createLocalVideoTrack();\nconst image = VirtualBackground('https://picsum.photos/400');\nawait videoTrack.setProcessor(image);\n

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#recording","title":"Recording","text":"

                                                                                                                                                                                                    You can record your Rooms using the Egress module. Egress allows exporting media from a Room in different formats, including

                                                                                                                                                                                                    • Room Composite Egress: a single video output with all the Tracks of a Room composited in a layout. You can even create your custom layouts.
                                                                                                                                                                                                    • Track Composite Egress: a single video output combining an audio Track and a video Track.
                                                                                                                                                                                                    • Track Egress: individual outputs for each Track of a Room.

                                                                                                                                                                                                    Visit the LiveKit reference documentation for a detailed explanation of Egress:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/developing-your-openvidu-app/how-to/#webhooks","title":"Webhooks","text":"

                                                                                                                                                                                                    Your application server may receive webhooks coming from the OpenVidu deployment. These webhooks inform about events happening in the Rooms, including when a Room is created and finished, when a Participant joins and leaves a Room, when a Track is published and unpublished, and when Egress/Ingress operations take place in a Room.

                                                                                                                                                                                                    Every application server tutorial here is ready to receive webhooks: Application Server Tutorials.

                                                                                                                                                                                                    Visit the LiveKit reference documentation for a detailed explanation of each webhook event:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/","title":"OpenVidu Call","text":"OpenVidu Call The videoconference application built on top of OpenVidu
                                                                                                                                                                                                    • Ready to use

                                                                                                                                                                                                      Experience all the features you need only with a click: multiparty videoconferences, screen sharing, chat, and more

                                                                                                                                                                                                      Try it

                                                                                                                                                                                                    • Fully Customizable

                                                                                                                                                                                                      Built on an open-source license, OpenVidu Call offers full customization to fit your needs

                                                                                                                                                                                                      Customize it

                                                                                                                                                                                                    • Deploy Anywhere

                                                                                                                                                                                                      Install OpenVidu Call on your own servers or any cloud provider.

                                                                                                                                                                                                      Install it

                                                                                                                                                                                                    Features
                                                                                                                                                                                                    • Secure room access

                                                                                                                                                                                                      OpenVidu Call offers a straightforward authentication system enabling users to join rooms with a single click.

                                                                                                                                                                                                      Additionally, it automatically generates unique room names, providing a distinct URL for each room. This allows users to easily share the URL with friends and colleagues to join the room.

                                                                                                                                                                                                    • Setting up your room

                                                                                                                                                                                                      OpenVidu Call provides users with various options and configurations to personalize their experience before and after entering a room.

                                                                                                                                                                                                      This includes testing and selecting audio and video devices, choosing a nickname, and adjusting the preferred language.

                                                                                                                                                                                                    • Multi-party videoconference

                                                                                                                                                                                                      OpenVidu Call offers a multi-party videoconference feature that allows users to connect with multiple participants in a single room.

                                                                                                                                                                                                      Flexible and easy to use, it allows you to see all participants at once, making it ideal for team meetings, webinars, and more.

                                                                                                                                                                                                    • Chatting time!

                                                                                                                                                                                                      Chatting is an essential feature for any videoconference application.

                                                                                                                                                                                                      OpenVidu Call offers a chat feature that allows users to communicate with each other during a videoconference.

                                                                                                                                                                                                    • Recording your sessions for posterity

                                                                                                                                                                                                      Recording your videoconference sessions is a great way to keep a record of important meetings, webinars, and more.

                                                                                                                                                                                                      Record, playback, download and share your videoconference sessions with OpenVidu Call's recording feature.

                                                                                                                                                                                                    • Background effects

                                                                                                                                                                                                      Virtual backgrounds are a fun and useful feature that allows users to change their background during a videoconference.

                                                                                                                                                                                                      OpenVidu Call offers a virtual background feature that allows users to choose from a variety of backgrounds for enhancing privacy and professionalism.

                                                                                                                                                                                                    • Recording Management

                                                                                                                                                                                                      Allow administrators to manage recordings, including deleting, downloading, and sharing them.

                                                                                                                                                                                                      The admin dashboard provides a simple interface to manage all recordings.

                                                                                                                                                                                                    And much more...
                                                                                                                                                                                                    • Broadcasting (Live Streaming)

                                                                                                                                                                                                      Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

                                                                                                                                                                                                    • Automatic Reconnection

                                                                                                                                                                                                      Ensures that users are automatically reconnected to the call in case of temporary network issues

                                                                                                                                                                                                    • Speaker Detection

                                                                                                                                                                                                      Highlights the active speaker automatically, making it easier for participants to follow the conversation

                                                                                                                                                                                                    • Screen Sharing

                                                                                                                                                                                                      Allow users to share their screen and their camera at the same time with other participants in the call

                                                                                                                                                                                                    • Fullscreen Mode

                                                                                                                                                                                                      Offers a fullscreen mode for users to focus on the videoconference without any distractions

                                                                                                                                                                                                    • Powerful Layout

                                                                                                                                                                                                      Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

                                                                                                                                                                                                    All the features you need to quickly build your perfect real-time application

                                                                                                                                                                                                    Try it

                                                                                                                                                                                                    Customize it

                                                                                                                                                                                                    Install it

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/","title":"OpenVidu Call Documentation","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    Introducing OpenVidu Call, the premier videoconference application that showcases the full potential of the OpenVidu platform. OpenVidu Call is not just any videoconferencing tool; it\u2019s the default and flagship app built with the robust and versatile OpenVidu Components.

                                                                                                                                                                                                    OpenVidu Call"},{"location":"docs/openvidu-call/docs/#run-openvidu-call","title":"Run OpenVidu Call","text":""},{"location":"docs/openvidu-call/docs/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    OpenVidu Call have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    Accessible via openvidu-local-deployment

                                                                                                                                                                                                    A pre-built OpenVidu Call application is launched as part of the openvidu-local-deployment and it can be accessible by visiting http://localhost:7880/openvidu-call/.

                                                                                                                                                                                                    If you want to explore and run the OpenVidu Call code locally, follow the instructions below.

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#2-download-openvidu-call-code","title":"2. Download OpenVidu Call code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-call.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#3-run-the-openvidu-call-backend","title":"3. Run the OpenVidu Call backend","text":"
                                                                                                                                                                                                    1. Navigate to the backend directory:

                                                                                                                                                                                                      cd openvidu-call/backend\n
                                                                                                                                                                                                    2. Install the dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Start the application:

                                                                                                                                                                                                      npm run dev:start\n
                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#4-run-the-openvidu-call-frontend","title":"4. Run the OpenVidu Call frontend","text":"

                                                                                                                                                                                                    Launching another terminal, under the openvidu-call directory:

                                                                                                                                                                                                    1. Navigate to the frontend directory:

                                                                                                                                                                                                      cd openvidu-call/frontend\n
                                                                                                                                                                                                    2. Install the dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Start the application:

                                                                                                                                                                                                      npm run dev:start\n

                                                                                                                                                                                                    The application will be available at http://localhost:5080.

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#architecture","title":"Architecture","text":"

                                                                                                                                                                                                    The OpenVidu Call architecture is divided into two main components:

                                                                                                                                                                                                    • frontend: which is the client-side application built with Angular and OpenVidu Components.
                                                                                                                                                                                                    • backend: which is the server-side application built with Node.js and Express and uses the LiveKit Server SDK library to interact with the OpenVidu Server.

                                                                                                                                                                                                    OpenVidu Call Architecture OpenVidu Call frontend OpenVidu Call backend

                                                                                                                                                                                                    The client-side application built with Angular that provides the user interface for the videoconference. It uses the OpenVidu Components library to create the videoconference layout with ease.

                                                                                                                                                                                                    The project architecture is divided into the following directories:

                                                                                                                                                                                                    • guards: Contains the guards that handle the authentication.
                                                                                                                                                                                                    • models: Contains the models that define the data structures.
                                                                                                                                                                                                    • pages: Contains the components that define the different pages of the application.
                                                                                                                                                                                                    • services: Contains the services that interact with the backend in a RESTful manner.

                                                                                                                                                                                                    Additionally, the project hosts the following files:

                                                                                                                                                                                                    • app.component.ts: The main file that initializes the Angular application.
                                                                                                                                                                                                    • app-routes.ts: Contains the routes that define the application navigation.
                                                                                                                                                                                                    • app,config.ts: Contains the configuration settings for the application. This file is where import for the OpenVidu Angular Components are defined.

                                                                                                                                                                                                    The server-side application built with Node.js and Express that manages the communication between the OpenVidu Server and the frontend.

                                                                                                                                                                                                    It uses the LiveKit Server SDK library to interact with the OpenVidu Server and handle the authentication, videoconference rooms, recordings, broadcasts, and other features.

                                                                                                                                                                                                    The project architecture is divided into the following directories:

                                                                                                                                                                                                    • controllers: Contains the controllers that handle the HTTP requests.
                                                                                                                                                                                                    • services: Contains the services that interact with the OpenVidu Server.
                                                                                                                                                                                                    • models: Contains the models that define the data structures.
                                                                                                                                                                                                    • helpers: Contains the helper functions.

                                                                                                                                                                                                    Additionally, the project hosts the following files:

                                                                                                                                                                                                    • server.ts: The main file that initializes the Express application.
                                                                                                                                                                                                    • routes.ts: Contains the routes that define the API endpoints.
                                                                                                                                                                                                    • config.ts: Contains the configuration settings for the application.
                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#features","title":"Features","text":""},{"location":"docs/openvidu-call/docs/#authentication","title":"Authentication","text":"

                                                                                                                                                                                                    OpenVidu Call provides user authentication to ensure that only authorized users can access the videoconference rooms. The authentication process is handled by the backend, which uses Basic Authentication to verify the user credentials.

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#video-conferencing","title":"Video conferencing","text":""},{"location":"docs/openvidu-call/docs/#essential-features","title":"Essential Features","text":"

                                                                                                                                                                                                    OpenVidu Call offers essential features that make video conferencing simple and intuitive for users. These features include:

                                                                                                                                                                                                    • Multilingual

                                                                                                                                                                                                      Supports for multiple languages, allowing users to select their preferred language for the interface

                                                                                                                                                                                                    • Device Selection

                                                                                                                                                                                                      Users can choose their preferred audio and video devices before and during the call

                                                                                                                                                                                                    • Fullscreen Mode

                                                                                                                                                                                                      Offers a fullscreen mode for users to focus on the videoconference without any distractions

                                                                                                                                                                                                    • Screen Sharing

                                                                                                                                                                                                      Allow users to share their screen and their camera at the same time with other participants in the call

                                                                                                                                                                                                    • Powerful Layout

                                                                                                                                                                                                      Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

                                                                                                                                                                                                    • Chat Integration

                                                                                                                                                                                                      Built-in chat functionality enabling participants to send text messages to the group

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#advanced-features","title":"Advanced Features","text":"

                                                                                                                                                                                                    The advanced features of OpenVidu Call enhance the video conferencing experience by providing additional functionalities that improve collaboration and productivity.

                                                                                                                                                                                                    • Speaker Detection

                                                                                                                                                                                                      Highlights the active speaker automatically, making it easier for participants to follow the conversation

                                                                                                                                                                                                    • Automatic Reconnection

                                                                                                                                                                                                      Ensures that users are automatically reconnected to the call in case of temporary network issues

                                                                                                                                                                                                    • Recording

                                                                                                                                                                                                      Supports recording of video conferences for later playback

                                                                                                                                                                                                    • Broadcasting (Live Streaming)

                                                                                                                                                                                                      Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

                                                                                                                                                                                                    • Virtual Backgrounds

                                                                                                                                                                                                      Enables users to use virtual backgrounds during the call, enhancing privacy and professionalism

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#admin-dashboard","title":"Admin Dashboard","text":"

                                                                                                                                                                                                    An admin dashboard is integrated into OpenVidu Call to provide additional functionalities for the admin user.

                                                                                                                                                                                                    • Admin Authentication

                                                                                                                                                                                                      Provides admin authentication to ensure that only authorized users can access the admin dashboard

                                                                                                                                                                                                    • Recording Management

                                                                                                                                                                                                      Allows the admin user to view, download, and delete the recordings stored in the OpenVidu Server

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#build-and-deployment","title":"Build and Deployment","text":""},{"location":"docs/openvidu-call/docs/#docker-image","title":"Docker Image","text":"

                                                                                                                                                                                                    The process to build a Docker image of OpenVidu call is really easy, you just need to run the following instructions:

                                                                                                                                                                                                    1. Build the Docker image:

                                                                                                                                                                                                      cd docker\n./create_image.sh openvidu-call\n

                                                                                                                                                                                                      This script will create a Docker image with the name openvidu-call.

                                                                                                                                                                                                    2. Run the Docker container:

                                                                                                                                                                                                      docker run -p 6080:6080 \\\n-e LIVEKIT_URL=wss://your-livekit-server-url \\\n-e LIVEKIT_API_KEY=your-livekit-api-key \\\n-e LIVEKIT_API_SECRET=your-livekit-api-secret \\\nopenvidu-call\n

                                                                                                                                                                                                      Once the container is running, you can access the OpenVidu Call application by visiting http://localhost:6080.

                                                                                                                                                                                                    "},{"location":"docs/openvidu-call/docs/#package-bundle","title":"Package bundle","text":"

                                                                                                                                                                                                    To build the OpenVidu Call application without using Docker, you can follow the instructions:

                                                                                                                                                                                                    1. Build the frontend application:

                                                                                                                                                                                                      cd frontend\nnpm install && npm run build-and-copy\ncd ..\n
                                                                                                                                                                                                    2. Build the backend application:

                                                                                                                                                                                                      cd backend\nnpm install\nnpm run build\n
                                                                                                                                                                                                    3. Start the backend application:

                                                                                                                                                                                                      node dist/src/server.js\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/deployment-types/","title":"Deployment types","text":"

                                                                                                                                                                                                    OpenVidu offers user-friendly installers that facilitate quick on-premises deployments, so you can self-host your real-time solution in your own infrastructure or any cloud provider.

                                                                                                                                                                                                    There are different deployment options available, depending on your needs:

                                                                                                                                                                                                    Type of deployment OpenViduLocal (development) OpenViduSingle Node OpenViduElastic OpenViduHigh Availability OpenVidu Edition COMMUNITY PRO COMMUNITY PRO PRO Suitability For local development in your laptop For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Friendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your network Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers Your laptop 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install Install

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/deployment-types/#openvidu-local-development","title":"OpenVidu Local (development)","text":"

                                                                                                                                                                                                    To run OpenVidu in your local machine, this is the quickest option. It is a Docker Compose setup that includes all the necessary services to run OpenVidu in your LAN, including automated SSL certificates that will be valid across all devices in your network.

                                                                                                                                                                                                    OpenVidu Local (development)"},{"location":"docs/self-hosting/deployment-types/#openvidu-single-node","title":"OpenVidu Single Node","text":"

                                                                                                                                                                                                    This is the simplest production-ready OpenVidu deployment available. It provides all the features you need, but lacks scalability and fault tolerance. But make no mistake about it: it is perfectly suitable for medium-scale production deployments. For most projects OpenVidu Single Node will be enough, at least until your user load gets serious. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community on a sufficiently powerful server!

                                                                                                                                                                                                    It is composed of a single OpenVidu Node hosting all the necessary services in a monolithic setup.

                                                                                                                                                                                                    OpenVidu Single Node"},{"location":"docs/self-hosting/deployment-types/#openvidu-elastic","title":"OpenVidu Elastic","text":"

                                                                                                                                                                                                    This is the intermediate OpenVidu deployment. It provides scalability for your video rooms. Suitable for applications with dynamic load in the media plane that require scalability.

                                                                                                                                                                                                    It is composed of two different types of nodes, one of them running on a cluster of multiple servers and the other running as a single monolithic server:

                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster.
                                                                                                                                                                                                    • A single Master Node hosting all the support services in a monolithic setup.

                                                                                                                                                                                                    OpenVidu Elastic"},{"location":"docs/self-hosting/deployment-types/#openvidu-high-availability","title":"OpenVidu High Availability","text":"

                                                                                                                                                                                                    This is the most complete OpenVidu deployment. It provides scalability for your video rooms and fault tolerance in all its services. Suitable for applications where both scalability and availability are critical.

                                                                                                                                                                                                    It is composed of two different types of nodes running on two separate clusters:

                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster. The minimum number of nodes in this cluster is 1, and it is designed to scale up and down dynamically according to workload.
                                                                                                                                                                                                    • A cluster of Master Nodes hosting all the support services in their high availability format. Your deployment is fault tolerant thanks to this cluster. The minimum number of nodes in this cluster is 4, and it is designed to have a fixed number of nodes at all times.

                                                                                                                                                                                                    OpenVidu High Availability cluster"},{"location":"docs/self-hosting/deployment-types/#node-services","title":"Node services","text":"

                                                                                                                                                                                                    OpenVidu is composed of several services that work together to provide a complete videoconferencing solution. Every service runs as a Docker container, coordinated with Docker Compose.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/deployment-types/#master-node-services","title":"Master Node services","text":"SERVICE DESCRIPTION OpenVidu Dashboard Web application interface for managing your cluster and visualizing your Rooms. Default Application (OpenVidu Call) A fully fledged videoconference web application ready to be used out-of-the-box. OpenVidu Operator Module that supervises the high availability services and updates the loadbalancing configuration dynamically. Redis Database used to share transient information between Media Nodes and coordinate them. In OpenVidu High Availability this is an instance of a Redis Cluster. MongoDB Database used to store analytics and monitoring persistent data. In OpenVidu High Availability this is an instance of a MongoDB Replica Set. Minio S3 bucket used to store recordings and common node configurations. In OpenVidu High Availability this is an instance of a Minio Multi-Node. Caddy Reverse proxy used as a loadbalancer to distribute client connections across your nodes and automatically manage your TLS certificate. Mimir (observability) Module used to store metrics from Prometheus. Promtail (observability) Module used to collect logs from all services and send them to Loki. Loki (observability) Module used to store logs. Grafana (observability) Module used to visualize logs and metrics in dashboards."},{"location":"docs/self-hosting/deployment-types/#media-node-services","title":"Media Node services","text":"SERVICE DESCRIPTION OpenVidu Server Media server used to stream real-time video, audio and data. Based on SFUs LiveKit and mediasoup. Egress Server Module used to export media from a Room (for example, recordings or RTMP broadcasting). See Egress. Ingress Server Module used to import media into a Room (for example, an MP4 video or an RTSP stream). See Ingress. Caddy Reverse proxy used as a loadbalancer to distribute the load generated by the Media Nodes over the Minio, Mimir and Loki cluster. Prometheus (observability) Module used to collect metrics from OpenVidu Server and send them to Loki. Promtail (observability) Module used to collect logs from all services and send them to Loki."},{"location":"docs/self-hosting/faq/","title":"Installation FAQs","text":""},{"location":"docs/self-hosting/faq/#common-issues","title":"Common issues","text":""},{"location":"docs/self-hosting/faq/#everything-looks-alright-but-i-cannot-see-any-remote-video","title":"Everything looks alright, but I cannot see any remote video.","text":""},{"location":"docs/self-hosting/faq/#my-local-video-is-not-showing-up-on-the-browser","title":"My local video is not showing up on the browser","text":""},{"location":"docs/self-hosting/faq/#any-tips-to-make-easier-the-development-of-my-webrtc-application","title":"Any tips to make easier the development of my WebRTC application?","text":""},{"location":"docs/self-hosting/faq/#test-applications-in-my-network-with-multiple-devices","title":"Test applications in my network with multiple devices.","text":""},{"location":"docs/self-hosting/faq/#does-my-app-need-a-server-side","title":"Does my app need a server-side?","text":""},{"location":"docs/self-hosting/faq/#caddy-certificates-are-not-working-what-can-i-do","title":"Caddy certificates are not working. What can I do?","text":""},{"location":"docs/self-hosting/faq/#my-commercial-certificate-is-not-working-what-can-i-do","title":"My commercial certificate is not working. What can I do?","text":""},{"location":"docs/self-hosting/faq/#how-can-i-customize-the-caddy-configuration","title":"How can I customize the Caddy configuration?","text":""},{"location":"docs/self-hosting/faq/#openvidu-does-not-work-for-clients-behind-restrictive-firewalls","title":"OpenVidu does not work for clients behind restrictive firewalls.","text":""},{"location":"docs/self-hosting/faq/#fundamentals-knowledge","title":"Fundamentals Knowledge","text":""},{"location":"docs/self-hosting/faq/#what-is-a-domain-name-and-how-can-i-get-one","title":"What is a domain name and how can I get one?","text":""},{"location":"docs/self-hosting/faq/#what-is-an-aws-elastic-ip-and-how-can-i-create-one","title":"What is an AWS Elastic IP and how can I create one?","text":""},{"location":"docs/self-hosting/faq/#what-is-a-vpc-and-a-subnet-in-aws","title":"What is a VPC and a subnet in AWS?","text":""},{"location":"docs/self-hosting/faq/#what-is-a-dns-record-and-how-can-i-create-one","title":"What is a DNS record and how can I create one?","text":""},{"location":"docs/self-hosting/faq/#what-means-each-type-of-certificate-in-openvidu","title":"What means each type of certificate in OpenVidu?","text":""},{"location":"docs/self-hosting/faq/#what-is-stun-and-turn-and-why-do-i-need-them","title":"What is STUN and TURN and why do I need them?","text":""},{"location":"docs/self-hosting/faq/#what-is-a-caddy-server-and-why-is-it-used-in-openvidu","title":"What is a Caddy server and why is it used in OpenVidu?","text":""},{"location":"docs/self-hosting/faq/#what-is-the-operator-service-in-openvidu","title":"What is the \"operator\" service in OpenVidu?","text":""},{"location":"docs/self-hosting/local/","title":"OpenVidu Local Installation (Development)","text":"

                                                                                                                                                                                                    First, make sure you have the following prerequisites:

                                                                                                                                                                                                    Windows macOS Linux
                                                                                                                                                                                                    • Install Docker Desktop
                                                                                                                                                                                                    • Install Docker Desktop
                                                                                                                                                                                                    • Install Docker
                                                                                                                                                                                                    • Install Docker Compose

                                                                                                                                                                                                    The installation consists of cloning a repository and running a script to configure your local IP address in the deployment. Then, you can start, stop, and manage your deployment with Docker Compose.

                                                                                                                                                                                                    To install OpenVidu locally, follow these steps:

                                                                                                                                                                                                    OpenVidu COMMUNITYOpenVidu PRO
                                                                                                                                                                                                    1. Clone the following repository:

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n
                                                                                                                                                                                                    1. Clone the following repository:

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu PRO runs locally in evaluation mode for free for development and testing purposes. Some limits apply:

                                                                                                                                                                                                    • Maximum 8 Participants across all Rooms
                                                                                                                                                                                                    • Maximum 5 minutes duration per Room

                                                                                                                                                                                                    For a production environment, you need to create an OpenVidu account to get a license key. There's a 15 day free trial waiting for you!

                                                                                                                                                                                                    The deployment is ready when you see the following message:

                                                                                                                                                                                                     =========================================\n \ud83c\udf89 OpenVidu is ready! \ud83c\udf89\n =========================================\n\n OpenVidu Server && LiveKit Server URLs:\n\n     - From this machine:\n\n         - http://localhost:7880\n         - ws://localhost:7880\n\n     - From other devices in your LAN:\n\n         - https://xxx-yyy-zzz-www.openvidu-local.dev:7443\n         - wss://xxx-yyy-zzz-www.openvidu-local.dev:7443\n\n =========================================\n\n OpenVidu Developer UI (services and passwords):\n\n     - http://localhost:7880\n     - https://xxx-yyy-zzz-www.openvidu-local.dev:7443\n\n =========================================\n

                                                                                                                                                                                                    By visiting http://localhost:7880 you have the OpenVidu Developer UI available with a summary of the services and passwords deployed. You can access the following services:

                                                                                                                                                                                                    • OpenVidu API (LiveKit compatible) (http://localhost:7880): the main API endpoint for your OpenVidu and LiveKit applications. OpenVidu v2 compatibility API is only available in OpenVidu PRO.
                                                                                                                                                                                                    • OpenVidu Dashboard (http://localhost:7880/dashboard): a web application interface to visualize your Rooms, Ingress and Egress services.
                                                                                                                                                                                                    • MinIO (http://localhost:7880/minio-console): as an S3 storage service for recordings.
                                                                                                                                                                                                    • OpenVidu Call (Default Application) (http://localhost:7880/openvidu-call): an optional ready-to-use videoconferencing application.

                                                                                                                                                                                                    You just need to point your OpenVidu and LiveKit applications to http://localhost:7880 or ws://localhost:7880 and start developing. Check our tutorials if you want a step-by-step guide to develop your first application using OpenVidu.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/local/#configuration","title":"Configuration","text":""},{"location":"docs/self-hosting/local/#configure-your-application-to-use-the-local-deployment","title":"Configure your Application to use the Local Deployment","text":"

                                                                                                                                                                                                    To point your applications to your local OpenVidu Local deployment, check the credentials at http://localhost:7880 or simply check the .env file. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    OpenVidu COMMUNITYOpenVidu PRO

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • URL: It must be ws://localhost:7880 or http://localhost:7880 depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: It must be ws://localhost:7880/ or http://localhost:7880/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in .env of DOMAIN_NAME as a URL. For example, http://localhost:7880
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in .env of LIVEKIT_API_SECRET

                                                                                                                                                                                                    If you want to use the OpenVidu Local deployment from other devices on your network, follow the instructions in the next section.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/local/#configuring-webhooks","title":"Configuring webhooks","text":"

                                                                                                                                                                                                    To configure webhooks in your local deployment, simply go to the file livekit.yaml and add to the webhooks section the URL where you want to receive the events:

                                                                                                                                                                                                    webhook:\n    <LIVEKIT_API_KEY>:<LIVEKIT_API_SECRET>:\n    urls:\n        - <YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                    In case you are using the v2compatibility and you want to receive webhooks for OpenVidu v2 applications, you can configure the webhooks in the .env file. For example:

                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                    Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the events.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/local/#accessing-your-local-deployment-from-other-devices-on-your-network","title":"Accessing your local deployment from other devices on your network","text":"

                                                                                                                                                                                                    Testing WebRTC applications can be challenging because devices require a secure context (HTTPS) to access the camera and microphone. When using LiveKit Open Source, this isn't an issue if you access your app from the same computer where the LiveKit Server is running, as localhost is considered a secure context even over plain HTTP. Consider the following architecture:

                                                                                                                                                                                                    The simplest way to test your application is:

                                                                                                                                                                                                    1. Run LiveKit Server on your computer.
                                                                                                                                                                                                    2. Connect your app to LiveKit Server through localhost.
                                                                                                                                                                                                    3. Serve both your application client and server from the same computer.
                                                                                                                                                                                                    4. Access your app from localhost in a browser on the same computer.

                                                                                                                                                                                                    This setup is straightforward, but what if you need to test your app from multiple devices simultaneously, including real mobile devices? In this case, you must use a secure context (HTTPS), which introduces two challenges:

                                                                                                                                                                                                    1. LiveKit Server open source does not natively support HTTPS. You'll need a reverse proxy to serve LiveKit Server over HTTPS.
                                                                                                                                                                                                    2. Even with HTTPS, your SSL certificate might not be valid for local network addresses. You'll need to accept it in the browser for web apps, and install it on mobile devices.

                                                                                                                                                                                                    OpenVidu Local Deployment addresses these issues by providing a magic domain name openvidu-local.dev that resolves to any IP specified as a subdomain and provides a valid wildcard certificate for HTTPS. This is similar to services like nip.io, traefik.me, or localtls.

                                                                                                                                                                                                    When using OpenVidu Local Deployment, you can access OpenVidu Server (which is 100% LiveKit compatible) and your app from any device on your local network with a valid HTTPS certificate. The following table shows the URLs to access the deployment and your application locally and from other devices on your network:

                                                                                                                                                                                                    Local access Access from devices in your local network Usage Access only from the development machine Access from any device connected to your local network. In the URLs below, replace xxx-yyy-zzz-www with the local IP address of the development machine, replacing the dots (.) with dashes (-). You can find the configured local IP in the .env file in the LAN_PRIVATE_IP variable Application Client (frontend) http://localhost:5080 https://xxx-yyy-zzz-www.openvidu-local.dev:5443 Application Server (backend) http://localhost:6080 https://xxx-yyy-zzz-www.openvidu-local.dev:6443 OpenVidu (LiveKit Compatible) URL http://localhost:7880 https://xxx-yyy-zzz-www.openvidu-local.dev:7443

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    • If you are developing locally, use localhost to access the services, but if you want to test your application from other devices on your network, use the openvidu-local.dev URLs.
                                                                                                                                                                                                    • Replace xxx-yyy-zzz-www with your local IP address. You can find it in the .env file in the LAN_PRIVATE_IP variable.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    If the URL isn't working because the IP address is incorrect or the installation script couldn't detect it automatically, you can update the LAN_PRIVATE_IP value in the .env file and restart the deployment with docker compose up.

                                                                                                                                                                                                    When developing web applications with this deployment, you can use the following code snippet to dynamically determine the appropriate URLs for the application server and the OpenVidu server based on the browser's current location. This approach allows you to seamlessly run your application on both your development machine and other devices within your local network without needing to manually adjust the URLs in your code.

                                                                                                                                                                                                    if (window.location.hostname === \"localhost\") {\n  APPLICATION_SERVER_URL = \"http://localhost:6080\";\n  OPENVIDU_URL = \"ws://localhost:7880\";\n} else {\n  APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443\";\n  OPENVIDU_URL = \"wss://\" + window.location.hostname + \":7443\";\n}\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/local/#about-openvidu-localdev-domain-and-ssl-certificates","title":"About openvidu-local.dev domain and SSL certificates","text":"

                                                                                                                                                                                                    This setup simplifies the configuration of local OpenVidu deployments with SSL, making it easier to develop and test your applications securely on your local network by using the openvidu-local.dev domain and a wildcard SSL certificate valid for *.openvidu-local.dev. However, it\u2019s important to note that these certificates are publicly available and do not provide an SSL certificate for production use.

                                                                                                                                                                                                    The HTTPS offered by openvidu-local.dev is intended for development or testing purposes with the only goal of making your local devices trust your application (which is mandatory in WebRTC applications). For any other use case, it should be treated with the same security considerations as plain HTTP.

                                                                                                                                                                                                    For production, you should consider deploying a production-grade OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/changing-config/","title":"How to change OpenVidu configuration","text":"

                                                                                                                                                                                                    The following steps are valid to change any configuration file in any deployment type. Simply just go to one of your Master Nodes, or the only Node in your deployment, and follow these steps:

                                                                                                                                                                                                    Steps to change OpenVidu configuration
                                                                                                                                                                                                    1. Go to one of your Master Nodes (or the only node in your deployment).
                                                                                                                                                                                                    2. Go to /opt/openvidu/config directory.
                                                                                                                                                                                                    3. Find and change the configuration parameter you want to modify, it could be any file: openvidu.env, master_node.env, livekit.yaml, egress.yaml, etc.
                                                                                                                                                                                                    4. Restart OpenVidu just by executing:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                    Notice that you only need to restart OpenVidu in one of the Master Nodes (or the only node in your deployment) to apply the changes to all the nodes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/changing-config/#types-of-configuration-files","title":"Types of configuration files","text":"

                                                                                                                                                                                                    Configuration files can be divided into three types:

                                                                                                                                                                                                    1. openvidu.env: This file defines configuration parameters used by other services. Such as the domain name, credentials, etc.
                                                                                                                                                                                                    2. master_node.env and media_node.env (Only in Elastic and High Availability): These files define specific configuration parameters of the node they are placed in. It is very useful when you want to have different parameter values in different nodes.
                                                                                                                                                                                                    3. <service>.yaml or <service>.env: These files define the configuration of each service. For example, livekit.yaml defines the configuration of the OpenVidu Server, egress.yaml defines the configuration of the Egress Service, etc.

                                                                                                                                                                                                      These files make use of the parameters defined in the openvidu.env, master_node.env, and media_node.env files. For example, any service configuration file can access the DOMAIN_NAME parameter defined in the openvidu.env file by using this syntax:

                                                                                                                                                                                                      ${openvidu.DOMAIN_NAME}\n

                                                                                                                                                                                                      You can check the OpenVidu Configuration In depth section to learn more about how the configuration system works.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/changing-config/#config-files","title":"Config files","text":"

                                                                                                                                                                                                    These are the configuration files for each kind of deployment:

                                                                                                                                                                                                    Single NodeElasticHigh Availability

                                                                                                                                                                                                    The single node has all configuration files in the same directory /opt/openvidu/config/:

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- openvidu.env\n    |-- livekit.yaml\n    |-- egress.yaml\n    |-- ingress.yaml\n    |-- caddy.yaml\n    |-- redis.env\n    |-- minio.env\n    |-- mongo.env\n    |-- dashboard.env\n    |-- loki.yaml\n    |-- prometheus.yaml\n    |-- promtail.yaml\n    |-- app.env\n    `-- grafana/\n

                                                                                                                                                                                                    OpenVidu Elastic has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- cluster/\n    |   |-- openvidu.env\n    |   |-- master_node/\n    |   |   |-- grafana/\n    |   |   |-- app.env\n    |   |   |-- caddy.yaml\n    |   |   |-- dashboard.env\n    |   |   |-- loki.yaml\n    |   |   |-- mimir.yaml\n    |   |   |-- minio.env\n    |   |   |-- mongo.env\n    |   |   |-- operator.env\n    |   |   |-- promtail.yaml\n    |   |   |-- redis.env\n    |   |   `-- v2compatibility.env\n    |   `-- media_node/\n    |       |-- egress.yaml\n    |       |-- ingress.yaml\n    |       |-- livekit.yaml\n    |       |-- prometheus.yaml\n    |       `-- promtail.yaml\n    `-- node/\n    `-- master_node.env\n

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    `-- node/\n        `-- media_node.env\n

                                                                                                                                                                                                    OpenVidu High Availability has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- cluster/\n    |   |-- openvidu.env\n    |   |-- master_node/\n    |   |   |-- grafana/\n    |   |   |-- app.env\n    |   |   |-- caddy.yaml\n    |   |   |-- dashboard.env\n    |   |   |-- loki.yaml\n    |   |   |-- mimir.yaml\n    |   |   |-- minio.env\n    |   |   |-- mongo.env\n    |   |   |-- operator.env\n    |   |   |-- promtail.yaml\n    |   |   |-- redis.env\n    |   |   `-- v2compatibility.env\n    |   `-- media_node/\n    |       |-- caddy.yaml\n    |       |-- egress.yaml\n    |       |-- ingress.yaml\n    |       |-- livekit.yaml\n    |       |-- prometheus.yaml\n    |       `-- promtail.yaml\n    `-- node/\n    `-- master_node.env\n

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    `-- node/\n        `-- media_node.env\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/changing-config/#troubleshooting-configuration","title":"Troubleshooting configuration","text":"

                                                                                                                                                                                                    After changing the configuration and restarting, you need to make sure that the changes have been applied correctly. Here are some tips to check if something is wrong. All the following commands must be executed in one of the Master Nodes (or the only node in your deployment):

                                                                                                                                                                                                    1. Execute a docker ps. If you see an openvidu-init container constantly restarting, it means that the configuration file you modified has a syntax error. Check the logs of this container to see the error with:

                                                                                                                                                                                                      docker logs openvidu-init\n

                                                                                                                                                                                                      The log is self-explanatory and will tell you what is wrong with the configuration file:

                                                                                                                                                                                                      service 'openvidu': Failed to process config file '/opt/openvidu/config/livekit.yaml': Errors found:\n\n    *  Error at line 18: Unmatched opening brace at position 7\n

                                                                                                                                                                                                      Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      systemctl restart openvidu\n
                                                                                                                                                                                                    2. Execute a docker ps. If you don't see the openvidu-init container, but you see some containers restarting, check the logs of those restarting containers to see what is wrong:

                                                                                                                                                                                                      docker logs <container_id>\n
                                                                                                                                                                                                    3. If all the containers are running correctly, execute the following command:

                                                                                                                                                                                                      tail -f /var/log/openvidu/nodes_errors.log\n

                                                                                                                                                                                                      If you have an error like: 'No such file or directory' or simply the file is empty, the configuration is correct. If the file exists with content, some nodes may be malfunctioning. Check this file and failing container logs for errors.

                                                                                                                                                                                                      This is how the log file looks when there are Media Nodes with errors:

                                                                                                                                                                                                      [2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.5: Container 'openvidu' error:\ncould not parse config: yaml: unmarshal errors:\n  line 17: cannot unmarshal !!str `trueee` into bool\n\n[2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.4: Container 'openvidu' error:\ncould not parse config: yaml: unmarshal errors:\n  line 17: cannot unmarshal !!str `trueee` into bool\n

                                                                                                                                                                                                      As you can see, the log informs you about which Media Node is failing and the error that is causing the failure, so in this way you can fix the file which is causing the error. Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      And again, check the logs until no errors appear.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/in-depth/","title":"OpenVidu configuration system in depth","text":"

                                                                                                                                                                                                    OpenVidu utilizes a powerful and flexible system for configuring services by expanding global parameters defined in the configuration files. This mechanism ensures consistency and simplifies management by allowing global settings to be referenced across multiple service configurations. The variable expansion follows the same interpolation rules as Docker Compose, providing a familiar syntax for those accustomed to Docker.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/in-depth/#how-variable-interpolation-works","title":"How Variable Interpolation Works","text":"

                                                                                                                                                                                                    To understand how variable interpolation works in OpenVidu, it is important to consider two main types of configuration files: global configuration files and service configuration files.

                                                                                                                                                                                                    1. Global Configuration Files:

                                                                                                                                                                                                      • Global parameters are defined in the global configuration files such as openvidu.env, master_node.env, and media_node.env.
                                                                                                                                                                                                      • These files contain key-value pairs that define parameters than can be used in service configuration files.
                                                                                                                                                                                                    2. Service Configuration Files:

                                                                                                                                                                                                      • Each service configuration file can reference these global parameters using a specific syntax.
                                                                                                                                                                                                      • The syntax ${openvidu.ENV_VAR} is used to access and interpolate those values from the global configuration files.
                                                                                                                                                                                                      • If you are configuring a service of the Master Node which needs a specific variable of the Master Node, you can use ${master_node.ENV_VAR}.
                                                                                                                                                                                                      • If you are configuring a service of the Media Node which needs a specific variable of the Media Node, you can use ${media_node.ENV_VAR}.
                                                                                                                                                                                                    3. Interpolation Rules:

                                                                                                                                                                                                      • The interpolation follows the Docker Compose specification, which provides robust handling of global variables.
                                                                                                                                                                                                      • If a variable is mandatory and not set, the syntax ${VAR:?mandatory} can be used to throw an error if the parameter is not defined, ensuring required configurations are not missed. For more detailed information about the interpolation rules, you can refer to the Docker Compose documentation on variable interpolation.
                                                                                                                                                                                                    4. Example:

                                                                                                                                                                                                      Look at this part of the /opt/openvidu/config/media_node/livekit.yaml configuration file in the Master Node of an Elastic deployment:

                                                                                                                                                                                                      openvidu:\n    license: ${openvidu.OPENVIDU_PRO_LICENSE:?mandatory}\n    cluster_id: ${openvidu.DOMAIN_NAME:?mandatory}\n    node:\n        private_ip: ${media_node.MEDIA_NODE_PRIVATE_IP:?mandatory}\n

                                                                                                                                                                                                      This file uses global variables from the openvidu.env and media_node.env files to set up the license, cluster ID, and private IP address for the LiveKit service. The :?mandatory part means these variables must be defined; otherwise, an error will occur. Since this file is for a Media Node, it uses the media_node variables, allowing each Media Node to have different values for the same variable.

                                                                                                                                                                                                      To use a variable from the media_node.env file, write it as ${media_node.ENV_VAR}. Similarly, to use a variable from the openvidu.env or master_node.env file, write it as ${openvidu.ENV_VAR} or ${master_node.ENV_VAR} respectively.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/in-depth/#config-files-replication","title":"Config Files Replication","text":"

                                                                                                                                                                                                    In Elastic and High Availability deployments, the configuration files are replicated across all the Master Nodes in the cluster.

                                                                                                                                                                                                    This ensures that all nodes have the same configuration, making it easier to manage and maintain the cluster. The global configuration files are placed in the /opt/openvidu/config/cluster/ directory, while the node-specific configuration files are placed in the /opt/openvidu/config/node/ directory.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/reference/","title":"Configuration reference","text":""},{"location":"docs/self-hosting/configuration/reference/#openviduenv","title":"openvidu.env:","text":"

                                                                                                                                                                                                    This file defines global configuration parameters used by other services. Such as the domain name, credentials, etc.

                                                                                                                                                                                                    Parameter Description DOMAIN_NAME The domain name for the deployment. Use this domain name to access. OpenVidu APIs and services. LIVEKIT_API_KEY Global LiveKit API Key and Secret used for apps to connect to OpenVidu. LIVEKIT_API_SECRET Global LiveKit API Key and Secret used for apps to connect to OpenVidu. MINIO_ACCESS_KEY Access key for MinIO. MINIO_SECRET_KEY Secret key for MinIO. MONGO_ADMIN_USERNAME MongoDB admin username. MONGO_ADMIN_PASSWORD MongoDB admin password. DASHBOARD_ADMIN_USERNAME Admin username for OpenVidu Dashboard DASHBOARD_ADMIN_PASSWORD Admin password for OpenVidu Dashboard GRAFANA_ADMIN_USERNAME Admin username for Grafana GRAFANA_ADMIN_PASSWORD Admin password for Grafana OPENVIDU_PRO_LICENSE PRO OpenVidu Pro license key. Get an OpenVidu Pro License here. OPENVIDU_RTC_ENGINE PRO The WebRTC engine to use. Can be pion or mediasoup."},{"location":"docs/self-hosting/configuration/reference/#appenv","title":"app.env:","text":"

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu Call application.

                                                                                                                                                                                                    Parameter Description SERVER_PORT Port where the OpenVidu Call application will be running. LIVEKIT_URL The public URL of the LiveKit server which external clients will use to connect to the OpenVidu Call application. LIVEKIT_URL_PRIVATE The private URL of the LiveKit server which OpenVidu Call backend will use to connect to the LiveKit Server internally. LIVEKIT_API_KEY LiveKit API Key for the OpenVidu Call application to connect to the LiveKit server. CALL_PRIVATE_ACCESS If true, only authenticated users can access the OpenVidu Call application. CALL_USER Username for the OpenVidu Call application. CALL_SECRET Password for the OpenVidu Call application. CALL_ADMIN_USER Admin username for the OpenVidu Call application. CALL_ADMIN_SECRET Admin password for the OpenVidu Call application. CALL_S3_BUCKET S3 bucket name for OpenVidu Call application. It is used to store recordings. CALL_S3_SERVICE_ENDPOINT S3 service endpoint for OpenVidu Call application. CALL_S3_ACCESS_KEY S3 access key for OpenVidu Call application. CALL_S3_SECRET_KEY S3 secret key for OpenVidu Call application. CALL_AWS_REGION AWS region of the S3 Bucket application. CALL_S3_WITH_PATH_STYLE_ACCESS If true, use path-style access for S3. CALL_LOG_LEVEL Log level for OpenVidu Call application. Valid values are: error, warn, info, verbose, debug, silly."},{"location":"docs/self-hosting/configuration/reference/#pro-v2compatibilityenv","title":"PRO v2compatibility.env","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu V2 Compatibility is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu V2 Compatibility Server.

                                                                                                                                                                                                    Parameter Description OPENVIDU_PRO_LICENSE OpenVidu Pro license key. Get an OpenVidu Pro License here. V2COMPAT_OPENVIDU_SHIM_PORT Port where the OpenVidu V2 Compatibility will be running. By default is 4443 V2COMPAT_OPENVIDU_SHIM_URL Public URL used for openvidu v2 applications used by external clients to connect to the OpenVidu V2 Compatibility Server. V2COMPAT_OPENVIDU_SECRET OpenVidu Secret used by openvidu v2 applications to connect to the OpenVidu deployment. V2COMPAT_LIVEKIT_URL LiveKit URL used by external clients to connect to the OpenVidu V2 Compatibility Server using the LiveKit protocol. V2COMPAT_LIVEKIT_URL_PRIVATE LiveKit URL used by the OpenVidu V2 Compatibility Server to connect to the LiveKit Server internally. V2COMPAT_LIVEKIT_API_KEY LiveKit API Key used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server. V2COMPAT_LIVEKIT_API_SECRET LiveKit API Secret used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server. V2COMPAT_REDIS_HOST Redis host used by the OpenVidu V2 Compatibility Server to store session data. V2COMPAT_REDIS_PORT Redis port used by the OpenVidu V2 Compatibility Server to connect to the Redis server. V2COMPAT_REDIS_PASSWORD Redis password used by the OpenVidu V2 Compatibility Server to connect to the Redis server. V2COMPAT_REDIS_SENTINEL_HOST_LIST Redis Sentinel host list used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_SENTINEL_PASSWORD Redis Sentinel password used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_MASTER_NAME Redis Sentinel master name used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_DB Redis database used by the OpenVidu V2 Compatibility Server. Default value is 0. V2COMPAT_OPENVIDU_RECORDING_PATH Path where the OpenVidu V2 Compatibility Server will store recordings locally. By default in the deployments is /opt/openvidu/recordings. V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGE Where to store the recordings. Valid values are:
                                                                                                                                                                                                    • local: Store the recordings in the local filesystem at the path V2COMPAT_OPENVIDU_RECORDING_PATH
                                                                                                                                                                                                    • s3: Store the recordings in the configured S3 bucket
                                                                                                                                                                                                    Default value is local V2COMPAT_OPENVIDU_RECORDING_CUSTOM_LAYOUT_URL URL of the custom layout used by the OpenVidu V2 Compatibility Server to generate the recordings. V2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESS If true, use path-style access for S3. V2COMPAT_OPENVIDU_RECORDING_ZIP_FILES If true, save individual recordings as zip files V2COMPAT_OPENVIDU_RECORDING_RAW_FILES If true, save individual recordings as files directly V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET Default bucket name for recordings V2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINT S3 service endpoint for the recordings V2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEY Access key for the recordings S3 bucket V2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEY Secret key for the recordings S3 bucket V2COMPAT_OPENVIDU_PRO_AWS_REGION AWS region of the recordings S3 bucket V2COMPAT_OPENVIDU_WEBHOOK If true, the OpenVidu V2 Compatibility Server will send webhooks to V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT V2COMPAT_OPENVIDU_WEBHOOK_HEADERS JSON Array list of headers to send in the OpenVidu V2 Webhook events. For example: [\"Content-Type: application/json\"] V2COMPAT_OPENVIDU_WEBHOOK_EVENTS Comma-separated list of OpenVidu V2 Webhook events to send. All available events are:
                                                                                                                                                                                                    • sessionCreated
                                                                                                                                                                                                    • sessionDestroyed
                                                                                                                                                                                                    • participantJoined
                                                                                                                                                                                                    • participantLeft
                                                                                                                                                                                                    • webrtcConnectionCreated
                                                                                                                                                                                                    • webrtcConnectionDestroyed
                                                                                                                                                                                                    • recordingStatusChanged
                                                                                                                                                                                                    • signalSent
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/reference/#livekityaml","title":"livekit.yaml:","text":"

                                                                                                                                                                                                    As OpenVidu Server is built on top of LiveKit, the configuration of OpenVidu Server is done in the livekit.yaml file in its own openvidu section in this file. The rest of the configuration is the same as the LiveKit server configuration.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/reference/#community-openvidu-server-configuration","title":"COMMUNITY OpenVidu Server Configuration:","text":"
                                                                                                                                                                                                    openvidu:\n    analytics: # (1)\n        enabled: true # (2)\n        mongo_url: mongodb://<MONGO_ADMIN_USERNAME>:<MONGO_ADMIN_PASSWORD>@localhost:20000/ # (3)\n        interval: 10s # (4)\n        expiration: 768h # (5)\n
                                                                                                                                                                                                    1. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    2. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    3. MongoDB connection string. In OpenVidu Single Node, the MongoDB service is running on the same machine, so you can use localhost as the hostname. The default port in OpenVidu for MongoDB is 20000. MONGO_ADMIN_USERNAME and MONGO_ADMIN_PASSWORD are the credentials to access the MongoDB database.
                                                                                                                                                                                                    4. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    5. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/reference/#pro-openvidu-server-configuration","title":"PRO OpenVidu Server Configuration:","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Before deploying OpenVidu PRO, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    openvidu:\n    license: <YOUR_OPENVIDU_PRO_LICENSE> # (1)\n    cluster_id: <YOUR_DOMAIN_NAME> # (2)\n    analytics: # (3)\n        enabled: true # (4)\n        interval: 10s # (5)\n        expiration: 768h # (6)\n        mongo_url: <MONGO_URL> # (7)\n    rtc:\n        engine: pion # (8)\n    mediasoup:\n        debug: \"\" # (9)\n        log_level: error # (10)\n        log_tags: [info, ice, rtp, rtcp, message] # (11)\n
                                                                                                                                                                                                    1. Specify your OpenVidu Pro license key. If you don't have one, you can request one here.
                                                                                                                                                                                                    2. The cluster ID for the OpenVidu deployment. It is configured by default by OpenVidu Installer with the domain name of the deployment.
                                                                                                                                                                                                    3. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    4. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    5. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    6. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    7. MongoDB URL. This is the connection string to the MongoDB database where the analytics data will be stored.
                                                                                                                                                                                                    8. The rtc.engine parameter is set to pion by default. This is the WebRTC engine used by OpenVidu. Depending on your requirements, you can use:
                                                                                                                                                                                                      • pion
                                                                                                                                                                                                      • mediasoup
                                                                                                                                                                                                    9. Global toggle to enable debugging logs from Mediasoup. In most debugging cases, using just an asterisk (\"*\") here is enough, but this can be fine-tuned for specific log levels. More info.
                                                                                                                                                                                                      • Default is an empty string.
                                                                                                                                                                                                    10. Logging level for logs generated by Mediasoup. More info.
                                                                                                                                                                                                      • Valid values are: debug, warn, error, none.
                                                                                                                                                                                                      • Default is error.
                                                                                                                                                                                                    11. Comma-separated list of log tag names, for debugging. More info.
                                                                                                                                                                                                      • Valid values are: info, ice, dtls, rtp, srtp, rtcp, rtx, bwe, score, simulcast, svc, sctp, message.
                                                                                                                                                                                                      • Default is [info, ice, rtp, rtcp, message].
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/configuration/reference/#other-services-configuration","title":"Other Services Configuration","text":"

                                                                                                                                                                                                    OpenVidu comes with other services configured to work in the deployment. These are the configuration files for each service:

                                                                                                                                                                                                    Service Description Reference documentation OpenVidu Server Manage Rooms and Media Streams.
                                                                                                                                                                                                    • OpenVidu Config
                                                                                                                                                                                                    • LiveKit Config
                                                                                                                                                                                                    Ingress Service Imports video from other sources into OpenVidu rooms. LiveKit Ingress Config Egress Service Exports video from OpenVidu rooms for recording or streaming. LiveKit Egress Config Caddy Server Serves OpenVidu services and handles HTTPS. Caddy JSON Structure Grafana Service Used for visualizing monitoring data. Grafana Config Mimir Service Service for long-term prometheus storage Mimir Config Loki Service Used for log aggregation. Loki Config Prometheus Service Used for monitoring. Prometheus Config Promtail Service Collects logs and sends them to Loki. Promtail Config"},{"location":"docs/self-hosting/elastic/","title":"OpenVidu Elastic installation","text":"

                                                                                                                                                                                                    OpenVidu Elastic is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation: Set up OpenVidu Elastic on your own servers.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Elastic on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/","title":"OpenVidu Elastic Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    The deployment of OpenVidu Elastic on AWS is automated using AWS CloudFormation, with Media Nodes managed within an Auto Scaling Group. This group dynamically adjusts the number of instances based on a target average CPU utilization. Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises Elastic documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/#cluster-shutdown-and-startup","title":"Cluster Shutdown and Startup","text":"

                                                                                                                                                                                                    The Master Node is an EC2 instance, while the Media Nodes are part of an Auto Scaling Group. The process for starting and stopping these components differs. The following sections detail the procedures.

                                                                                                                                                                                                    Shutdown the ClusterStartup the Cluster

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Node. This way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to 0, and click on \"Update\".
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that there are no instances in the Auto Scaling Group.

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      It may happen that some instances are still in the \"Terminating:Wait\" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                    7. After confirming that all Media Node instances are terminated, go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.

                                                                                                                                                                                                    8. Right-click on the instance and select \"Stop instance\".

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.
                                                                                                                                                                                                    4. Right-click on the instance and select \"Start instance\".
                                                                                                                                                                                                    5. Wait until the instance is running.
                                                                                                                                                                                                    6. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    9. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. However, since the Media Nodes are part of an Auto Scaling Group, the process differs. The following section details the procedures.

                                                                                                                                                                                                    Master NodesMedia Nodes

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping the Master Node.

                                                                                                                                                                                                    1. Shutdown the cluster.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      You can stop only the Master Node instance to change its instance type, but it is recommended to stop the whole cluster to avoid any issues.

                                                                                                                                                                                                    2. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.

                                                                                                                                                                                                    3. Right-click on the instance and select \"Instance Settings > Change Instance Type\".
                                                                                                                                                                                                    4. Select the new instance type and click on \"Apply\".
                                                                                                                                                                                                    5. Start the cluster.
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Modify template (Create new version)\".
                                                                                                                                                                                                    5. In the \"Instance type\" section, select the new instance type and click on \"Create template version\".
                                                                                                                                                                                                    6. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. In the Launch Template section, select the new version of the launch template we just created at step 5, which is the highest version number.

                                                                                                                                                                                                      Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      By configuring \"Latest\" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                    9. Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/#media-nodes-autoscaling-configuration","title":"Media Nodes Autoscaling Configuration","text":"

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. To configure scaling policies, navigate to the \"Automatic scaling\" tab within the Auto Scaling Group Dashboard, select the unique \"Target tracking scaling\" autoscaling policy, and click on \"Actions > Edit\".
                                                                                                                                                                                                    6. It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      OpenVidu Elastic is by default configured with a \"Target tracking scaling\" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/#fixed-number-of-media-nodes","title":"Fixed Number of Media Nodes","text":"

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    Set Fixed Number of Media Nodes
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the fixed number of Media Nodes you require, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that the Auto Scaling Group has the fixed number of instances running.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Elastic Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Elastic Deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu Elastic deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" in the Master Node instance to apply the changes.

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/","title":"OpenVidu Elastic Installation: AWS","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment in AWS. Deployed services are the same as the On Premises Elastic Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu Elastic in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/latest/aws/cf-openvidu-elastic.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/3.0.0/aws/cf-openvidu-elastic.yaml\n
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    OpenVidu Elastic AWS Architecture

                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (for OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill in the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#domain-and-ssl-certificate-configuration","title":"Domain and SSL Certificate Configuration","text":"

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    Let's Encrypt Certificate (recommended)Self-Signed CertificateCustom Certificates

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let\u2019s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    You don\u2019t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#openvidu-elastic-configuration","title":"OpenVidu Elastic Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu Elastic deployment.

                                                                                                                                                                                                    OpenVidu Elastic Configuration

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#media-nodes-autoscaling-group-configuration","title":"Media Nodes Autoscaling Group Configuration","text":"

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#vpc-configuration","title":"VPC Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    The OpenViduMasterNodeSubnet and OpenViduMediaNodeSubnet parameters specify the subnets where the Master and Media Nodes will be deployed. All of them must be in the previously specified OpenViduVPC.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services in the Master Node and Media Nodes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Elastic deployment is ready to use. You can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/","title":"OpenVidu Elastic Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Elastic on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Elastic deployments.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu Elastic deployment, you can use the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS\napp                        docker.io/openvidu/openvidu-call                   \"docker-entrypoint.s\u2026\"   app                        12 seconds ago   Up 10 seconds\ncaddy                      docker.io/openvidu/openvidu-pro-caddy              \"/bin/caddy run --co\u2026\"   caddy                      12 seconds ago   Up 10 seconds\ndashboard                  docker.io/openvidu/openvidu-pro-dashboard          \"./openvidu-dashboard\"   dashboard                  12 seconds ago   Up 10 seconds\ngrafana                    docker.io/grafana/grafana                          \"/run.sh\"                grafana                    11 seconds ago   Up 8 seconds\nloki                       docker.io/grafana/loki                             \"/usr/bin/loki -conf\u2026\"   loki                       11 seconds ago   Up 9 seconds\nmimir                      docker.io/grafana/mimir                            \"/bin/mimir -config.\u2026\"   mimir                      11 seconds ago   Up 9 seconds\nminio                      docker.io/bitnami/minio                            \"/opt/bitnami/script\u2026\"   minio                      11 seconds ago   Up 9 seconds\nmongo                      docker.io/mongo                                    \"docker-entrypoint.s\u2026\"   mongo                      11 seconds ago   Up 9 seconds\nopenvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        \"/bin/server\"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds\noperator                   docker.io/openvidu/openvidu-operator               \"/bin/operator\"          operator                   12 seconds ago   Up 10 seconds\npromtail                   docker.io/grafana/promtail                         \"/usr/bin/promtail -\u2026\"   promtail                   11 seconds ago   Up 9 seconds\nredis                      docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis                      12 seconds ago   Up 10 seconds\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS\negress       docker.io/livekit/egress                       \"/entrypoint.sh\"         egress       53 seconds ago   Up 51 seconds\ningress      docker.io/livekit/ingress                      \"ingress\"                ingress      53 seconds ago   Up 52 seconds\nopenvidu     docker.io/openvidu/openvidu-server-pro         \"/livekit-server --c\u2026\"   openvidu     53 seconds ago   Up 52 seconds\nprometheus   docker.io/prom/prometheus                      \"/bin/prometheus --c\u2026\"   prometheus   53 seconds ago   Up 51 seconds\npromtail     docker.io/grafana/promtail                     \"/usr/bin/promtail -\u2026\"   promtail     53 seconds ago   Up 52 seconds\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on:

                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Nodes Logs\": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Services Logs\": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#adding-media-nodes","title":"Adding Media Nodes","text":"

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#removing-media-nodes-gracefully","title":"Removing Media Nodes Gracefully","text":"

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    #!/bin/bash\n# Stop OpenVidu, Ingress, and Egress containers gracefully (1)\ndocker container kill --signal=SIGINT openvidu || true\ndocker container kill --signal=SIGINT ingress || true\ndocker container kill --signal=SIGINT egress || true\n\n# Wait for the containers to stop (2)\nwhile [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == \"true\" ]; do\n    echo \"Waiting for containers to stop...\"\n    sleep 5\ndone\n
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. This script waits for the containers to stop before exiting.

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#removing-media-nodes-forcefully","title":"Removing Media Nodes Forcefully","text":"

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/","title":"OpenVidu Elastic Installation: On-premises","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment on-premises. The deployment requires one Master Node and any number of Media Nodes. Media Nodes are elastic and can be scaled up and down according to the workload.

                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Elastic On Premises

                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (For TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates. Provides optional TLS for the TURN server.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 2 machines, each with a minimum of 4GB RAM, 4 CPU cores, and Linux installed (Ubuntu is recommended). One machine will serve as the Master Node, while the others will function as Media Nodes.
                                                                                                                                                                                                    • Significant disk space on the Master Node, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • Each machine must be assigned a Public IP. Additionally, the machine designated as the Master Node must have a Fully Qualified Domain Name (FQDN) that resolves to its Public IP.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#port-rules-master-node","title":"Port rules (Master Node)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Node.

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP traffic to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 1935 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest RTMP streams using Ingress service. TCP 9000 0.0.0.0/0, ::/0 (Optional), only needed if you want to expose MinIO publicly. TCP 4443 Media Nodes (Optional. Only needed when 'OpenVidu v2 Compatibility' module is used) Media Nodes need access to this port to reach OpenVidu V2 compatibility service TCP 6080 Media Nodes (Optional. Only needed when 'Default App' module is used) Media Nodes need access to this port to reach OpenVidu Call (Default Application). TCP 3100 Media Nodes (Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Loki. TCP 9009 Media Nodes (Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Mimir. TCP 7000 Media Nodes Media Nodes need access to this port to reach Redis Service. TCP 9100 Media Nodes Media Nodes need access to this port to reach MinIO. TCP 20000 Media Nodes Media Nodes need access to this port to reach MongoDB.

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional). Only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Master Node (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Node needs access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Master Node (Optional). Only needed if you want to expose TURN service with TLS. Master Node needs access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Node LiveKit API. Master Node needs access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Node (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Node needs access to this port to reach WHIP HTTP service."},{"location":"docs/self-hosting/elastic/on-premises/install/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Node and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu Elastic, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=elastic\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write the 'Master Node' Private IP: Write the private IP of the machine where you are going to install the Master Node.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup(Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Node': These rules are the same as those specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Node) may not appear (Optional ports). Double-check and modify it if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Node': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='elastic' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command in your Master Node to install it. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Elastic 'Master Node' Installation Finished Successfully! \ud83c\udf89   <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n
                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as those defined previously as with the Master Node. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='elastic' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Elastic 'Media Node' Installation Finished Successfully! \ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials for all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='selfsigned'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --master-node-private-ip='1.2.3.4' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • The --master-node-private-ip is the private IP of the Master Node. Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • At the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/elastic/on-premises/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/","title":"OpenVidu High Availability installation","text":"

                                                                                                                                                                                                    OpenVidu High Availability is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation (DNS Load Balancing): Set up OpenVidu High Availability on your own servers with a DNS Load Balancing mechanism.
                                                                                                                                                                                                    • On-premises Installation (Network Load Balancer): Set up OpenVidu High Availability on your own servers with a Network Load Balancer.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Elastic on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/","title":"OpenVidu High Availability Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    The deployment of OpenVidu High Availability on AWS is automated using AWS CloudFormation, with 4 EC2 Instances as Master Nodes and any number of Media Nodes managed within an Auto Scaling Group. The Auto Scaling Group of Media Nodes is configured to scale based on the target average CPU utilization.

                                                                                                                                                                                                    Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises High Availability documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/#cluster-shutdown-and-startup","title":"Cluster Shutdown and Startup","text":"

                                                                                                                                                                                                    You can start and stop the OpenVidu High Availability cluster at any time. The following sections detail the procedures.

                                                                                                                                                                                                    Shutdown the ClusterStartup the Cluster

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Nodes; this way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to 0, and click on \"Update\".
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that there are no instances in the Auto Scaling Group.

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      It may happen that some instances are still in the \"Terminating:Wait\" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                    7. Navigate to the EC2 Dashboard on AWS.

                                                                                                                                                                                                    8. Stop all the Master Nodes instances by selecting them and clicking on \"Stop instance\".
                                                                                                                                                                                                    9. Wait until the instances are stopped.

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. Start all the Master Nodes instances by selecting them and clicking on \"Start instance\".
                                                                                                                                                                                                    3. Wait until the instances are running.
                                                                                                                                                                                                    4. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    5. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    6. Locate the resource with the logical ID: OpenViduMasterNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Master Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". For the Master Nodes auto scaling group, the number of instances must be 4.
                                                                                                                                                                                                    9. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    10. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    11. Click on \"Actions > Edit\".
                                                                                                                                                                                                    12. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    13. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. The following section details the procedures.

                                                                                                                                                                                                    Master NodesMedia Nodes

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping all the Master Nodes and starting them again with the new instance type.

                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. Stop all the Master Nodes instances by selecting them and clicking on \"Stop instance\".
                                                                                                                                                                                                    3. Wait until the instances are stopped.
                                                                                                                                                                                                    4. For each node you want to change the instance type, select it, and click on \"Instance settings > Change instance type\".
                                                                                                                                                                                                    5. Select the new instance type and click on \"Change\".
                                                                                                                                                                                                    6. Repeat the process for all the Master Nodes.
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Modify template (Create new version)\".
                                                                                                                                                                                                    5. In the \"Instance type\" section, select the new instance type and click on \"Create template version\".
                                                                                                                                                                                                    6. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. In the Launch Template section, select the new version of the launch template we just created at step 5 which is the highest version number.

                                                                                                                                                                                                      Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      By configuring \"Latest\" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                    9. Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/#media-nodes-autoscaling-configuration","title":"Media Nodes Autoscaling Configuration","text":"

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. To configure scaling policies, navigate to the \"Automatic scaling\" tab within the Auto Scaling Group Dashboard, select the unique \"Target tracking scaling\" autoscaling policy, and click on \"Actions > Edit\".
                                                                                                                                                                                                    6. It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      OpenVidu High Availability is by default configured with a \"Target tracking scaling\" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/#fixed-number-of-media-nodes","title":"Fixed Number of Media Nodes","text":"

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    Set Fixed Number of Media Nodes
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the fixed number of Media Nodes you require, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that the Auto Scaling Group has the fixed number of instances running.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises High Availability Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu High Availability Deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu High Availability deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" in the Master Node instance to apply the changes.

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/","title":"OpenVidu High Availability Installation: AWS","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu High Availability deployment in AWS. Deployed services are the same as the On Premises High Availability Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu High Availability in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/latest/aws/cf-openvidu-ha.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/3.0.0/aws/cf-openvidu-ha.yaml\n

                                                                                                                                                                                                    This is how the architecture of the deployment looks like.

                                                                                                                                                                                                    Architecture overviewArchitecture overview with TURN over TLS

                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture

                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.

                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture with TURN over TLS

                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • An additional Load Balancer is created to route TURN over TLS traffic to the TURN server running on the Media Nodes. It is used to allow users behind restrictive firewalls to connect to the Media Nodes.
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#domain-and-load-balancer-configuration","title":"Domain and Load Balancer configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the domain name and the SSL certificate to use from AWS Certificate Manager.

                                                                                                                                                                                                    Domain and Load Balancer configuration

                                                                                                                                                                                                    The parameters in this section might look like this:

                                                                                                                                                                                                    Set the DomainName parameter to the domain name you intend to use for your OpenVidu deployment. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    For the OpenViduCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in DomainName.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#openvidu-ha-configuration","title":"OpenVidu HA Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu HA deployment.

                                                                                                                                                                                                    OpenVidu Elastic Configuration

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest Amazon Linux AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#media-nodes-autoscaling-group-configuration","title":"Media Nodes Autoscaling Group Configuration","text":"

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#vpc-configuration","title":"VPC Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    The OpenViduMasterNodeSubnets specifies the subnets where the Master Nodes will be deployed. You can specify a maximum of 4 subnets.

                                                                                                                                                                                                    The OpenViduMediaNodeSubnets specifies the subnets where the Media Nodes will be deployed. There is no limit on the number of subnets you can specify.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    • It is recommended to deploy in a region with at least 4 availability zones and deploy the Master Nodes in 4 subnets, one in each availability zone. This is to ensure high availability.
                                                                                                                                                                                                    • You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    For the TurnCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in TurnDomainName.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#volumes-configuration","title":"Volumes Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the configuration for the EBS volumes that will be created for the Master Nodes. Master Nodes will host all the recordings and metrics data replicated across all of them. The disk size of the EBS volumes is the same for all Master Nodes.

                                                                                                                                                                                                    Volumes Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The RetainVolumes parameter specifies whether the EBS volumes should be retained when the stack is deleted. If you set this parameter to true, the EBS volumes will not be deleted when the stack is deleted. This is useful if you want to keep the recordings and metrics data after deleting the stack. If you set this parameter to false, the EBS volumes will be deleted when the stack is deleted. In any case, it is recommended to create a snapshot backup policy.

                                                                                                                                                                                                    The DiskSize parameter specifies the size of the EBS volumes in GB.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services in all the Master Nodes and Media Nodes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu High Availability deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/","title":"OpenVidu High Availability Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu High Availability on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu High Availability deployments.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu High Availability deployment, you can use the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS\napp                        docker.io/openvidu/openvidu-call                   \"docker-entrypoint.s\u2026\"   app                        12 seconds ago   Up 10 seconds\ncaddy                      docker.io/openvidu/openvidu-pro-caddy              \"/bin/caddy run --co\u2026\"   caddy                      12 seconds ago   Up 10 seconds\ndashboard                  docker.io/openvidu/openvidu-pro-dashboard          \"./openvidu-dashboard\"   dashboard                  12 seconds ago   Up 10 seconds\ngrafana                    docker.io/grafana/grafana                          \"/run.sh\"                grafana                    11 seconds ago   Up 8 seconds\nloki                       docker.io/grafana/loki                             \"/usr/bin/loki -conf\u2026\"   loki                       11 seconds ago   Up 9 seconds\nmimir                      docker.io/grafana/mimir                            \"/bin/mimir -config.\u2026\"   mimir                      11 seconds ago   Up 9 seconds\nminio                      docker.io/bitnami/minio                            \"/opt/bitnami/script\u2026\"   minio                      11 seconds ago   Up 9 seconds\nmongo                      docker.io/mongo                                    \"docker-entrypoint.s\u2026\"   mongo                      11 seconds ago   Up 9 seconds\nopenvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        \"/bin/server\"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds\noperator                   docker.io/openvidu/openvidu-operator               \"/bin/operator\"          operator                   12 seconds ago   Up 10 seconds\npromtail                   docker.io/grafana/promtail                         \"/usr/bin/promtail -\u2026\"   promtail                   11 seconds ago   Up 9 seconds\nredis-sentinel             docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis-sentinel             10 seconds ago   Up 10 seconds\nredis-server               docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis-server               10 seconds ago   Up 10 seconds\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS\ncaddy        docker.io/openvidu/openvidu-caddy:main         \"/bin/caddy run --co\u2026\"   caddy        53 seconds ago   Up 53 seconds\negress       docker.io/livekit/egress                       \"/entrypoint.sh\"         egress       53 seconds ago   Up 51 seconds\ningress      docker.io/livekit/ingress                      \"ingress\"                ingress      53 seconds ago   Up 52 seconds\nopenvidu     docker.io/openvidu/openvidu-server-pro         \"/livekit-server --c\u2026\"   openvidu     53 seconds ago   Up 52 seconds\nprometheus   docker.io/prom/prometheus                      \"/bin/prometheus --c\u2026\"   prometheus   53 seconds ago   Up 51 seconds\npromtail     docker.io/grafana/promtail                     \"/usr/bin/promtail -\u2026\"   promtail     53 seconds ago   Up 52 seconds\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on:

                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Nodes Logs\": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Services Logs\": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#adding-media-nodes","title":"Adding Media Nodes","text":"

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#removing-media-nodes-gracefully","title":"Removing Media Nodes Gracefully","text":"

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    #!/bin/bash\n# Stop OpenVidu, Ingress, and Egress containers gracefully (1)\ndocker container kill --signal=SIGINT openvidu || true\ndocker container kill --signal=SIGINT ingress || true\ndocker container kill --signal=SIGINT egress || true\n\n# Wait for the containers to stop (2)\nwhile [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == \"true\" ]; do\n    echo \"Waiting for containers to stop...\"\n    sleep 5\ndone\n
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. This script waits for the containers to stop before exiting.

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#removing-media-nodes-forcefully","title":"Removing Media Nodes Forcefully","text":"

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/","title":"OpenVidu High Availability Installation: On-premises with DNS Load Balancing","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing DNS for load balancing traffic. DNS allows multiple records, even of the same kind, to be registered, enabling the listing of multiple hosts under the same domain name. Such a mechanism allows for the distribution of traffic among the Master Nodes, offering an alternative to Network Load Balancers.

                                                                                                                                                                                                    Advantages of DNS Load Balancing:

                                                                                                                                                                                                    • Simplicity: Easier to configure compared to Network Load Balancing.
                                                                                                                                                                                                    • Cost: More cost-effective than Network Load Balancing.

                                                                                                                                                                                                    Disadvantages of DNS Load Balancing:

                                                                                                                                                                                                    • Health Checks: Less reliable for health checks compared to Network Load Balancing.
                                                                                                                                                                                                    • Caching Issues: IP addresses of the Master Nodes can be cached, causing issues if the server's IP changes.
                                                                                                                                                                                                    • DNS Round Robin: Some clients may not adhere to DNS Round Robin, potentially leading to uneven traffic distribution.
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu High Availability Architecture with DNS Load Balancing

                                                                                                                                                                                                    • The Master Nodes act as Load Balancers, managing the traffic and distributing it among the other Master Nodes and Media Nodes.
                                                                                                                                                                                                    • Each Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                    • All machines must have their own public IP.
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to all the public IPs of the Master Nodes. Simply create 4 A records in your DNS provider pointing to the public IPs of the Master Nodes using the same domain name.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#port-rules-master-nodes","title":"Port rules (Master Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 1935 0.0.0.0/0, ::/0 (Optional) For ingesting RTMP streams using Ingress service. TCP 9000 0.0.0.0/0, ::/0 (Optional) To expose MinIO publicly. TCP 3000 Master Nodes (Optional) For load balancing requests to Grafana (Observability module). TCP 5000 Master Nodes For load balancing requests to OpenVidu Dashboard. TCP 9101 Master Nodes For load balancing requests to MinIO Console. TCP 7946-7947 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 9095-9096 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 3100 Media Nodes (Optional) For Loki (Observability module). TCP 9009 Media Nodes (Optional) For Mimir (Observability module). TCP 4443 Master Nodes, Media Nodes (Optional) For OpenVidu V2 compatibility service. TCP 6080 Master Nodes, Media Nodes (Optional) For OpenVidu Call (Default Application). TCP 7000-7001 Master Nodes, Media Nodes For internal Redis communication TCP 9100 Master Nodes, Media Nodes For internal MinIO communication TCP 20000 Master Nodes, Media Nodes For internal Mongo communication

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Master Nodes (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Master Nodes (Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Nodes LiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Nodes (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service."},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=ha\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select No. It means that you are going to use DNS Load Balancing.
                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check them and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89\ud83c\udf89 OpenVidu HA 'Master Node' Installation Finished Successfully! \ud83c\udf89\ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu HA 'Media Node' Installation Finished Successfully! \ud83c\udf89         <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node on each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='selfsigned'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. Define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-dlb/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/","title":"OpenVidu High Availability Installation: On-premises with Network Load Balancer","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing a Network Load Balancer in front of the cluster. Network Load Balancing is a method of distributing incoming network traffic across multiple servers. It is a highly available, scalable, and fault-tolerant solution that ensures your OpenVidu deployment is always up and running. Compared to DNS Load Balancing, Network Load Balancing is more reliable for health checks and ensures that traffic is evenly distributed across all nodes.

                                                                                                                                                                                                    Advantages of Network Load Balancing:

                                                                                                                                                                                                    • More control over the load balancing process.
                                                                                                                                                                                                    • Possibility to use custom health checks to determine the status of the nodes.

                                                                                                                                                                                                    Disadvantages of Network Load Balancing:

                                                                                                                                                                                                    • More complex to set up than DNS Load Balancing.
                                                                                                                                                                                                    • Requires a Load Balancer to be deployed in front of the cluster.
                                                                                                                                                                                                    • More expensive than DNS Load Balancing.
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    OpenVidu High Availability Architecture with Network Load Balancer

                                                                                                                                                                                                    • The Load Balancer must be a Network Load Balancer that supports TCP and UDP traffic.
                                                                                                                                                                                                    • The Load Balancer distributes traffic across all Master Nodes.
                                                                                                                                                                                                    • If RTMP or TURN with TLS is enabled, the Load Balancer must also distribute traffic across all Media Nodes. (You can use a different Load Balancer for this purpose)
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • Media Nodes must have a public IP. This is required because Media traffic is sent directly to these nodes. Master Nodes can have private IPs and will be accessed through the Load Balancer.
                                                                                                                                                                                                    • A Load Balancer that supports TCP and UDP traffic. You can use a hardware load balancer or a software load balancer like HAProxy, Nginx, or AWS Network Load Balancer.
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to the Load Balancer. This domain name will be used to access the OpenVidu services.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#port-rules-master-nodes","title":"Port rules (Master Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 7880 Load Balancer Allows access to the following to the Load Balancer:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 7946-7947 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 9095-9096 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 3100 Media Nodes (Optional) For Loki (Observability module). TCP 9009 Media Nodes (Optional) For Mimir (Observability module). TCP 4443 Media Nodes (Optional) For OpenVidu V2 compatibility service. TCP 6080 Media Nodes (Optional) For OpenVidu Call (Default Application). TCP 7000-7001 Master Nodes, Media Nodes For internal Redis communication TCP 9100 Master Nodes, Media Nodes For internal Minio communication TCP 20000 Master Nodes, Media Nodes For internal Mongo communication

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Load Balancer (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Load Balancer (Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Nodes LiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Nodes (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service."},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=ha\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select Yes. We will use a Network Load Balancer in front of the cluster.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) TURN domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the Load Balancer you will use and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89\ud83c\udf89 OpenVidu HA 'Master Node' Installation Finished Successfully! \ud83c\udf89\ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu HA 'Media Node' Installation Finished Successfully! \ud83c\udf89         <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#load-balancer-configuration","title":"Load Balancer Configuration","text":"

                                                                                                                                                                                                    To configure the Load Balancer, you must create a new TCP listener for each port that the Master Nodes use. The Load Balancer should be set up to distribute traffic evenly across all Master Nodes, targeting their private IP addresses. Additionally, optional features like RTMP and TURN with TLS should be directed to use the private IP addresses of the Media Nodes. This ensures that traffic for these services is properly routed to the Media Nodes.

                                                                                                                                                                                                    Below is an example using NGINX as a Load Balancer:

                                                                                                                                                                                                    NGINX Load Balancer ConfigurationNGINX Load Balancer Configuration (With TLS for TURN)

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    events {\n    worker_connections 10240;\n}\n\nstream {\n\n    upstream openvidu_master_nodes {\n        server <MASTER_NODE_IP_1>:7880;\n        server <MASTER_NODE_IP_2>:7880;\n        server <MASTER_NODE_IP_3>:7880;\n        server <MASTER_NODE_IP_4>:7880;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    upstream openvidu_media_nodes_rtmp {\n        server <MEDIA_NODE_IP_1>:1935;\n        server <MEDIA_NODE_IP_2>:1935;\n        # Add more media nodes if needed\n    }\n\n    server {\n        listen 443 ssl;\n        server_name openvidu.example.com;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;\n        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_master_nodes;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    server {\n        listen 1935 ssl;\n        server_name openvidu.example.com;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;\n        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_media_nodes_rtmp;\n    }\n\n}\n
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and you should configure it in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem and openvidu-key.pem must be valid SSL certificates for your domain.
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    events {\n    worker_connections 10240;\n}\n\nstream {\n\n    upstream openvidu_master_nodes {\n        server <MASTER_NODE_IP_1>:7880;\n        server <MASTER_NODE_IP_2>:7880;\n        server <MASTER_NODE_IP_3>:7880;\n        server <MASTER_NODE_IP_4>:7880;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    upstream openvidu_media_nodes_rtmp {\n        server <MEDIA_NODE_IP_1>:1935;\n        server <MEDIA_NODE_IP_2>:1935;\n        # Add more media nodes if needed\n    }\n\n    upstream turn_tls {\n        server <MEDIA_NODE_IP_1>:5349;\n        server <MEDIA_NODE_IP_2>:5349;\n        # Add more media nodes if needed\n    }\n\n    map $ssl_server_name $targetBackend {\n        openvidu.example.com openvidu_master_nodes;\n        turn.example.com turn_tls;\n    }\n\n    map $ssl_server_name $targetCert {\n        openvidu.example.com /etc/nginx/ssl/openvidu-cert.pem;\n        turn.example.com /etc/nginx/ssl/turn-cert.pem;\n    }\n\n    map $ssl_server_name $targetCertKey {\n        openvidu.example.com /etc/nginx/ssl/openvidu-key.pem;\n        turn.example.com /etc/nginx/ssl/turn-key.pem;\n    }\n\n    server {\n        listen 443 ssl;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     $targetCert;\n        ssl_certificate_key $targetCertKey;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass $targetBackend;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    server {\n        listen 1935 ssl;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     $targetCert;\n        ssl_certificate_key $targetCertKey;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_media_nodes_rtmp;\n    }\n\n}\n
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and turn.example.com is the domain name you have chosen for your TURN with TLS. Both domains should be configured in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem, openvidu-key.pem, turn-cert.pem, and turn-key.pem must be valid SSL certificates for your domains.
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    To install a Master Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --external-load-balancer\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/ha/on-premises/install-nlb/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/","title":"How To Guides","text":"

                                                                                                                                                                                                    OpenVidu deployments are installed with sane defaults, but you may want to customize your deployment to suit your needs. This section contains guides on how to configure OpenVidu for specific use cases, so you can get the most out of your deployment.

                                                                                                                                                                                                    • How to configure an external S3 bucket for recordings instead of the default MinIO
                                                                                                                                                                                                    • Force all traffic including WebRTC to go through 443 with TLS
                                                                                                                                                                                                    • Enable webhooks
                                                                                                                                                                                                    • Enable and Disable modules
                                                                                                                                                                                                    • Create and configurate AWS certificate for HA deployment
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/create-configure-AWS-certificate/","title":"Create AWS certificate for OpenVidu HA deployment","text":"

                                                                                                                                                                                                    You will need this certificate to be able to deploy the High Availability deployment. This guide is meant to show you how to do it.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/create-configure-AWS-certificate/#prerequisites","title":"Prerequisites","text":"

                                                                                                                                                                                                    Is important to notice that in your AWS you will need to have access to the Certificate Manager. As well as having access to a domain provider. You will need to have one domain to be able to create and vinculate the certificate.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/create-configure-AWS-certificate/#creation","title":"Creation","text":"AWS Certificate creation

                                                                                                                                                                                                    Those are the steps you need to follow to create the AWS certificate, keep in mind that you need a domain.

                                                                                                                                                                                                    First go to AWS Certificate Manager and request a new public certificate. The following parameter is the most important. Domain configuration

                                                                                                                                                                                                    You need to replace yourdesiredname for whatever name you want and yourdomain for the name of the domain that you own.

                                                                                                                                                                                                    Next leave the rest of the parameters as they are and click request.

                                                                                                                                                                                                    The next page will prompt out the certificate status, here you will need to create a record in your domain provider to validate the status, first you will have status pending.

                                                                                                                                                                                                    Create record in your domain providerCreate record in Route 53

                                                                                                                                                                                                    Here you will need to create a new CNAME record in the domain you own by using as subdomain the CNAME name until the domain name and the CNAME value as the value of that record.

                                                                                                                                                                                                    In AWS Certificate Manager you can check the CNAME name and value clicking into the certificate you want.

                                                                                                                                                                                                    Create record in Route 53

                                                                                                                                                                                                    You need to click the button called Create records in Route 53. This will lead you to the next image where you just click Create records and that's it.

                                                                                                                                                                                                    Create record for certificate

                                                                                                                                                                                                    Please verify that you have a new entry in the records table of the specified Hosted Zone in Route 53 with the CNAME of the certificate you just created.

                                                                                                                                                                                                    Try to refresh until you reach the Issued status in green.

                                                                                                                                                                                                    Finally when deploying the HA stack in CloudFormation follow these steps

                                                                                                                                                                                                    Configuration of Load Balancer

                                                                                                                                                                                                    Load balancer configuration

                                                                                                                                                                                                    Those are parameters related to the certificate you just created.

                                                                                                                                                                                                    You have to fill field DomainName with the domain name that appears in the certificate that you created, the one that matches yourdesiredname.yourdomain mentioned earlier.

                                                                                                                                                                                                    Next for the OpenViduCertificateARN, you can find it at the top of the same page I mentioned earlier, it is called ARN, as you can see in the image below.

                                                                                                                                                                                                    Domain name and ARN location

                                                                                                                                                                                                    When everything is up and running you will need to create a new record in the Hosted Zone referring to the Load Balancer resource created in the stack.

                                                                                                                                                                                                    Vinculating Load Balancer

                                                                                                                                                                                                    Create Load Balancer record

                                                                                                                                                                                                    Note that Alias is checked.

                                                                                                                                                                                                    In subdomain you just have to put the same as you put in yourdesiredname creating the AWS certificate. In Choose endpoint you just have to select Alias to Network Load Balancer, and in Choose Region select your region where the stack is deployed. After selecting the endpoint and region a new field will appear, select there the load balancer that belongs to the stack you have deployed.

                                                                                                                                                                                                    For the other fields, leave them as they are.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/enable-disable-modules/","title":"Enable and disable modules","text":"

                                                                                                                                                                                                    OpenVidu allows you to enable or disable modules to customize your deployment. These modules are:

                                                                                                                                                                                                    • app: The OpenVidu Default App (OpenVidu Call)
                                                                                                                                                                                                    • observability: Grafana, Loki, Mimir, and Promtail observability services.
                                                                                                                                                                                                    • v2compatibility: OpenVidu V2 Compatibility. (Only available in OpenVidu Pro)

                                                                                                                                                                                                    These modules are configured in the parameter COMPOSE_PROFILES at:

                                                                                                                                                                                                    • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                    • Elastic / High Availability:
                                                                                                                                                                                                      • Master Node: /opt/openvidu/config/cluster/node/master_node.env
                                                                                                                                                                                                      • Media Node: /opt/openvidu/config/cluster/node/media_node.env

                                                                                                                                                                                                    This parameter is one of the parameters that is not replicated per node in the cluster. To enable or disable a module, you need to modify the parameter in all the nodes where you want to apply the changes.

                                                                                                                                                                                                    For example, to enable only v2compatibility and app, the parameter should look like this:

                                                                                                                                                                                                    COMPOSE_PROFILES=app,v2compatibility\n

                                                                                                                                                                                                    After modifying the parameter, you need to restart the node to apply the changes:

                                                                                                                                                                                                    systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/enable-webhooks/","title":"Enable Webhooks","text":"

                                                                                                                                                                                                    If you need to integrate OpenVidu with other services, you can use webhooks to send notifications about events that occur in your OpenVidu deployment. This guide explains how to enable webhooks.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/enable-webhooks/#openvidu-server-configuration","title":"OpenVidu Server Configuration","text":"
                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add to the file livekit.yaml the following configuration:

                                                                                                                                                                                                      webhook:\n    api_key: ${openvidu.LIVEKIT_API_KEY:?mandatory}\n    urls:\n    ...\n        - https://<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                      The file is located at:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/livekit.yaml
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/livekit.yaml

                                                                                                                                                                                                      Make sure the webhook section exists in the file, and if it doesn't, add it as stated in the previous snippet. Then, add the URL where you want to receive the webhook notifications. In this example, <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                    3. Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/enable-webhooks/#pro-v2-compatibility-configuration","title":"PRO V2 Compatibility Configuration","text":"

                                                                                                                                                                                                    If you are using the V2 Compatibility module, you can also enable webhooks for the V2 Compatibility layer.

                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add to the file v2compatibility.env the following parameters:

                                                                                                                                                                                                      V2COMPAT_OPENVIDU_WEBHOOK=true\nV2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=https://<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                      Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                      Check in the Configuration Reference all the webhook events that you can receive setting up the parameter V2COMPAT_OPENVIDU_WEBHOOK_EVENTS.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/enable-webhooks/#send-webhooks-to-a-local-application-server","title":"Send Webhooks to a Local Application Server","text":"

                                                                                                                                                                                                    When developing locally pointing to a production deployment and webhooks events are required by your application, you will face issues because OpenVidu cannot access your local application server.

                                                                                                                                                                                                    To receive webhooks from OpenVidu on your local machine, you need to expose your local application server to the internet. This exposure allows OpenVidu to send webhooks directly to your application server.

                                                                                                                                                                                                    The following images illustrate the difference between an unreachable and a reachable local application server:

                                                                                                                                                                                                    Unreachable local application server

                                                                                                                                                                                                    Reachable local application server

                                                                                                                                                                                                    Exposing your local application server to the internet is a common practice when developing applications locally. Tools like Ngrok, LocalTunnel, LocalXpose and Zrok can help you achieve this.

                                                                                                                                                                                                    These tools provide you with a public URL that forwards requests to your local application server. You can use this URL to receive webhooks from OpenVidu, configuring it in the OpenVidu Server as explained in the previous section.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/external-s3/","title":"Configuring external S3 for OpenVidu recordings","text":"

                                                                                                                                                                                                    By default, OpenVidu uses MinIO for storing recordings. You can configure it to use an external S3 bucket instead. This guide uses AWS S3, but can be adapted for other S3-compatible services.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/external-s3/#global-configuration-with-openviduenv","title":"Global Configuration with openvidu.env","text":"

                                                                                                                                                                                                    The openvidu.env file defines global parameters used in service configurations. So we can use it to define our S3 configuration details and afterwards use them in the services that need them.

                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add these variables to openvidu.env:

                                                                                                                                                                                                      RECORDINGS_S3_BUCKET=openvidu-recordings\nRECORDINGS_S3_ENDPOINT=https://s3.us-east-2.amazonaws.com\nRECORDINGS_AWS_ACCESS_KEY=<YOUR_AWS_ACCESS_KEY>\nRECORDINGS_AWS_SECRET_KEY=<YOUR_AWS_ACCESS_SECRET>\nRECORDINGS_AWS_REGION=us-east-2\nRECORDINGS_S3_FORCE_PATH_STYLE=false\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/openvidu.env

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      In AWS it is necessary to specify the region in the endpoint URL as you can see in RECORDINGS_S3_ENDPOINT. Check the AWS S3 endpoints documentation for more information.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The parameters defined at openvidu.env can be used in other configuration files by using the ${openvidu.VARIABLE_NAME} syntax. If you want to know more about the configuration system of OpenVidu, check the Configuration In-depth section.

                                                                                                                                                                                                    3. Update egress.yaml to use these variables:

                                                                                                                                                                                                      s3:\n    access_key: ${openvidu.RECORDINGS_AWS_ACCESS_KEY}\n    secret: ${openvidu.RECORDINGS_AWS_SECRET_KEY}\n    region: ${openvidu.RECORDINGS_AWS_REGION}\n    endpoint: ${openvidu.RECORDINGS_S3_ENDPOINT}\n    bucket: ${openvidu.RECORDINGS_S3_BUCKET}\n    force_path_style: ${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n
                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/egress.yaml
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/egress.yaml
                                                                                                                                                                                                    4. Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/external-s3/#additional-configuration-for-default-app-and-v2-compatibility","title":"Additional Configuration for Default App and V2 Compatibility","text":"

                                                                                                                                                                                                    If using the Default App (OpenVidu Call) or V2 Compatibility, additional configurations are required.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/external-s3/#openvidu-default-app-openvidu-call","title":"OpenVidu Default App (OpenVidu Call)","text":"
                                                                                                                                                                                                    1. Update app.env with:

                                                                                                                                                                                                      CALL_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}\nCALL_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}\nCALL_S3_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}\nCALL_S3_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}\nCALL_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}\nCALL_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/app.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/app.env
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/external-s3/#pro-v2-compatibility","title":"PRO V2 Compatibility","text":"
                                                                                                                                                                                                    1. Update v2compatibility.env with:

                                                                                                                                                                                                      V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGE=s3\nV2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}\nV2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}\nV2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}\nV2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}\nV2COMPAT_OPENVIDU_PRO_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}\nV2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/v2compatibility.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/v2compatibility.env
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/force-443-tls/","title":"Force all traffic including WebRTC to go through 443 with TLS","text":"

                                                                                                                                                                                                    In certain scenarios, users may be behind restrictive firewalls or network policies that only permit traffic through port 443 using TLS. By default, OpenVidu is configured to allow traffic through port 443 with TLS if a TURN domain name is specified during the installation process. However, users in less restrictive environments can still utilize other ports to establish WebRTC connections.

                                                                                                                                                                                                    In some cases, it is necessary to ensure that all traffic, including WebRTC, is routed through port 443 with TLS due to network policies, security requirements, or other considerations.

                                                                                                                                                                                                    To enforce this configuration, OpenVidu must be installed with a TURN domain name, which is an optional step in the installation process. If this was not done initially, you will need to reinstall OpenVidu with a TURN domain name.

                                                                                                                                                                                                    Once OpenVidu is installed with a TURN domain name, ensure that the following ports are not open or are explicitly closed:

                                                                                                                                                                                                    Single Node closed Ports

                                                                                                                                                                                                    Node Port Protocol OpenVidu Server 443 UDP OpenVidu Server 50000-60000 UDP

                                                                                                                                                                                                    Elastic and High Availability closed Ports

                                                                                                                                                                                                    Node Port Protocol Media Node 443 UDP Media Node 50000-60000 UDP

                                                                                                                                                                                                    In this way, all the traffic will go through port 443 with TLS using the TURN domain name configured in the installation process.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/how-to-guides/force-443-tls/#considerations","title":"Considerations","text":"
                                                                                                                                                                                                    • Media over UDP using WebRTC does not mean that the media is not encrypted. WebRTC encrypts the media using SRTP and DTLS. WebRTC is designed to be encrypted by default.

                                                                                                                                                                                                    • Media going through 443 with TLS has a penalty in the media quality and CPU usage. This is because of the TLS roundtrip, TCP being used and media processed twice by the TURN server and the Media Server. This can lead to a worse user experience and higher CPU usage in the Media Server. We recommend using this configuration only if it is strictly necessary.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/","title":"Production ready","text":"

                                                                                                                                                                                                    OpenVidu is designed to be self-hosted, whether it is on premises or in a cloud provider. It brings to your own managed service advanced capabilities usually reserved only for SaaS solutions. There are two main reasons why you may need to self-host the real-time solution yourself:

                                                                                                                                                                                                    • Privacy: you can't afford to let your client's data get out of your reach. OpenVidu allows you to meet all your privacy and regulatory requirements: no data at all is sent to any third-party server. Everything is self-contained on your own servers.
                                                                                                                                                                                                    • Leverage your resources: your organization has access to its own infrastructure that can be used to host these services. SaaS solutions generally offer complete freedom from infrastructure management, but this comes with generally high prices that cover both the provider's infrastructure and their service surcharge. OpenVidu allows taking full advantage of your own infrastructure, reducing costs and increasing performance.

                                                                                                                                                                                                    It is important to mention that when we talk about self-hosting OpenVidu, we don't just mean installing it in bare-metal servers or private VPCs. OpenVidu also supports deployments in the most popular cloud providers, using their native services when possible. AWS is now supported, and others are coming soon. You can learn more about the different options to deploy OpenVidu in the deployment types section.

                                                                                                                                                                                                    One of OpenVidu's main goals is offering a self-hosted, production-ready live-video platform with all the advanced capabilities typically reserved for SaaS solutions. This includes outstanding performance, scalability, fault tolerance and observability:

                                                                                                                                                                                                    • Performance

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                      Learn more about performance

                                                                                                                                                                                                    • Scalability

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                      Learn more about scalability

                                                                                                                                                                                                    • Fault Tolerance

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable high-availability cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                      Learn more about fault tolerance

                                                                                                                                                                                                    • Observability

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs, and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                      Learn more about observability

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/","title":"Fault Tolerance","text":"

                                                                                                                                                                                                    Real-time media is particularly sensitive to downtime events, as they directly affect the user experience in a very disruptive way. OpenVidu is designed from the ground up to be fault tolerant in all its services in case of node downtime, especially in its High Availability deployment.

                                                                                                                                                                                                    The extent of fault tolerance depends on the OpenVidu deployment type:

                                                                                                                                                                                                    • OpenVidu Single Node: it is not fault tolerant. Fault tolerance requires a multi-node deployment.
                                                                                                                                                                                                    • OpenVidu Elastic: fault tolerant only for Media Nodes.
                                                                                                                                                                                                    • OpenVidu High Availability: fault tolerant for both Media Nodes and Master Nodes.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#fault-tolerance-in-openvidu-elastic","title":"Fault tolerance in OpenVidu Elastic","text":""},{"location":"docs/self-hosting/production-ready/fault-tolerance/#master-node","title":"Master Node","text":"

                                                                                                                                                                                                    An OpenVidu Elastic deployment has a single Master Node, so a failure on this node is fatal and any ongoing video Rooms will be interrupted. The service won't be restored until the Master Node is recovered.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#media-nodes","title":"Media Nodes","text":"

                                                                                                                                                                                                    You can have any number of Media Nodes in an OpenVidu Elastic deployment. Media Nodes are stateless, meaning that they do not store critical information about the Rooms, Egress or Ingress processes they are handling. This means that they can be easily replicated in any other Media Node in case of a failure.

                                                                                                                                                                                                    In the event of a Media Node failure, there are 3 services affected with the following behaviors:

                                                                                                                                                                                                    • Active Rooms hosted by the failed Media Node will suffer a temporary interruption of about 5 seconds (this is the time the clients take to realize the Media Node has crashed). After that time has elapsed, the Room will be automatically reconstructed in a healthy Media Node. Every participant and track will be recreated and the Room will be fully operational again.
                                                                                                                                                                                                    • Active Egress hosted by the failed Media Node will be interrupted. If the node's disk is still accessible, egress output files can still be recovered. See Recovering Egress from node failures.
                                                                                                                                                                                                    • Active Ingress hosted by the failed Media Node will be interrupted. The participants of the Room will receive the proper events indicating the Ingress participant has left the Room: TrackUnpublished and ParticipantDisconnected. Some famous tools for streaming such as OBS Studio will automatically try to reconnect the stream when they detect a connection loss, so in this case interruption will be minimal and the Ingress tracks will be restored on their own on a healthy Media Node.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#fault-tolerance-in-openvidu-high-availability","title":"Fault tolerance in OpenVidu High Availability","text":"

                                                                                                                                                                                                    OpenVidu High Availability delivers the highest possible degree of fault tolerance. This is achieved by running all of the services in the Master Nodes and the Media Nodes in their High Availability flavour.

                                                                                                                                                                                                    An OpenVidu High Availability deployment runs Master Nodes and Media Nodes in separated groups. Let's see the extent of fault tolerance for each node group:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#master-nodes","title":"Master Nodes","text":"

                                                                                                                                                                                                    The number of Master Nodes in an OpenVidu High Availability deployment is 4. This minimum number of nodes ensures that every service running in the Master Nodes is fault tolerant.

                                                                                                                                                                                                    If one Master Node fails, the service won't be affected. Some users may trigger event Reconnecting closely followed by Reconnected, but the service will remain fully operational.

                                                                                                                                                                                                    When two or more Master Nodes fail simultaneously, there can be some degradation of the service:

                                                                                                                                                                                                    • If two Master Nodes fail, the service will still be operational for the most part. Only active Egress might be affected, as they won't be stored in the Minio storage. See Recovering Egress from node failures.
                                                                                                                                                                                                    • If three or four Master Nodes fail, the service will be interrupted.

                                                                                                                                                                                                    In the event of Master Node failures, the service will be automatically restored as soon as the failed node(s) are recovered.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#media-nodes_1","title":"Media Nodes","text":"

                                                                                                                                                                                                    Fault tolerance of Media Nodes in OpenVidu Elastic behaves the same as in OpenVidu High Availability.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#recovering-egress-from-node-failures","title":"Recovering Egress from node failures","text":"

                                                                                                                                                                                                    Egress processes can be affected by the crash of a Master Node or a Media Node. To recover Egress from...

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#from-master-node-failures","title":"From Master Node failures","text":"

                                                                                                                                                                                                    This only applies to OpenVidu High Availability

                                                                                                                                                                                                    If 2 Master Nodes crash, the Egress process won't be able to use the Minio storage. This has different consequences depending on the configured outputs for your Egress process:

                                                                                                                                                                                                    • For MP4, OGG or WEBM files, if the Egress is stopped when 2 Master Nodes are down, the output files will not be uploaded to Minio.
                                                                                                                                                                                                    • For HLS, the segments will stop being uploaded to Minio. If you are consuming these segments from another process, note that new segments will stop appearing.

                                                                                                                                                                                                    In both cases, files are not lost and can be recovered. They will be available in the Egress backup path of the Media Node hosting the Egress process (by default /opt/openvidu/egress_data/home/egress/backup_storage).

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/fault-tolerance/#from-a-media-node-failure","title":"From a Media Node failure","text":"

                                                                                                                                                                                                    This applies to both OpenVidu High Availability and OpenVidu Elastic

                                                                                                                                                                                                    If the Media Node hosting an ongoing Egress process crashes, then the Egress process will be immediately interrupted. But as long as the disk of the crashed Media Node is still accessible, you may recover the output files. They will be available in the Media Node at path /opt/openvidu/egress_data/home/egress/tmp.

                                                                                                                                                                                                    It is possible that if the crashed Egress had MP4 as configured output (which is an option available for Room Composite and Track Composite) the recovered file may not be directly playable and it may require a repair process.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/","title":"Performance","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    OpenVidu is able to handle up to 2x the load in a single server, doubling the amount of media Tracks that can be transmitted compared to base LiveKit. By not only building upon the giant Open-Source shoulders of LiveKit, but also pushing the bar further, OpenVidu uses the best-in-class technologies to bring considerable performance improvements to the table.

                                                                                                                                                                                                    The key element of any WebRTC server solution is the ability to exchange media between participants of a room, in the so-called WebRTC SFU. LiveKit implements its own SFU, and that's where OpenVidu makes a different choice by using mediasoup.

                                                                                                                                                                                                    The key points of how this works are:

                                                                                                                                                                                                    • On the surface, OpenVidu is the same than LiveKit, and for the most part features work equally, such as connection establishment, participant management, and SDK support.
                                                                                                                                                                                                    • Internally however, mediasoup is used to replace the original WebRTC engine implementation of LiveKit. mediasoup is built with the most efficient technologies and has outstanding low-level optimizations, which translates in a 2x improvement with respect to the original LiveKit Open Source performance.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#about-mediasoup-integration","title":"About mediasoup integration","text":""},{"location":"docs/self-hosting/production-ready/performance/#architecture","title":"Architecture","text":"

                                                                                                                                                                                                    LiveKit created its own WebRTC SFU, based on the Pion library to route media between participants:

                                                                                                                                                                                                    OpenVidu is built by a team of expert WebRTC developers who know all the ins and outs of low-level WebRTC development, so it was possible to replace LiveKit's own implementation with an alternative, and mediasoup was the clear best choice given its fantastic performance characteristics:

                                                                                                                                                                                                    This means that applications built on top of LiveKit will continue to work exactly the same, while the internal WebRTC engine inside the server can be swapped at will and applications can benefit from that change, without having to be rebuilt.

                                                                                                                                                                                                    In terms of the signaling protocol, API and SDKs, OpenVidu maintains the original LiveKit implementation. LiveKit's API is very well designed, with a simple but powerful set of concepts, and the amount of SDKs available is very large.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#choice-of-technology","title":"Choice of technology","text":"

                                                                                                                                                                                                    Both LiveKit and Pion are written in the Go programming language, and this has some implications for speed and efficiency. While Go is popular for its simplicity, readability, and approach to concurrency, when it comes to performance other alternatives rank higher in common benchmarks.

                                                                                                                                                                                                    First and foremost, the two most defining limitations of Go is that it requires a quite heavy runtime that is able to handle all of the low-level features of the language, such as goroutines and memory allocations. Also, speaking of memory management, Go requires a Garbage Collector, which knowledgeable readers will recognize as a hindrance for performance-critical applications.

                                                                                                                                                                                                    mediasoup, on the other hand, focuses all of its efforts on maximum efficiency. It is written in C++, and it is ultra-optimized for the specific task of routing media packets. C++ is a language that provides fully manual management of all resources, and direct access to the hardware, with the benefit of software that is as fast as it can be on any machine.

                                                                                                                                                                                                    We believe that by combining the best of the LiveKit stack with a top-notch WebRTC engine like mediasoup, OpenVidu is the best option for those who need a self-hosted and high-performance real-time solution.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#limitations","title":"Limitations","text":"

                                                                                                                                                                                                    OpenVidu developers are hard at work with integrating mediasoup as a WebRTC engine within LiveKit, aiming to provide feature parity with the original Pion engine.

                                                                                                                                                                                                    Currently there are two client SDK events that are not triggered when using mediasoup:

                                                                                                                                                                                                    • No ConnectionQualityChanged event (LiveKit JS reference).
                                                                                                                                                                                                    • No TrackStreamStateChanged event (LiveKit JS reference).
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#benchmarking","title":"Benchmarking","text":"

                                                                                                                                                                                                    Numerous load tests have been performed to determine the true capabilities of OpenVidu on different hardware. To do so we have developed the tool Openvidu LoadTest: an in development project that aims to improve the precision of load and performance tests in WebRTC systems.

                                                                                                                                                                                                    We have compared OpenVidu using the original Pion WebRTC engine (this is the default LiveKit Open Source implementation) and using mediasoup as WebRTC engine. We tested the performance for both cases in the scenario below.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#results-conference-rooms","title":"Results: Conference rooms","text":"

                                                                                                                                                                                                    This tests increasingly adds Rooms of 8 Participants each, every one sending 1 video Track and 1 audio Track, and subscribing to all remote Tracks.

                                                                                                                                                                                                    The following plot shows the number of Participants that can be added to a Room in OpenVidu using Pion and using mediasoup as WebRTC engines:

                                                                                                                                                                                                    The conclusion is that for multiple Rooms, mediasoup performs much better than Pion, almost doubling the total number of Participants (and Tracks) that fit in the server.

                                                                                                                                                                                                    Below there is the deatiled connection progression for each Participant in each test.

                                                                                                                                                                                                    The X axis reflects the point of time in seconds. For each Participant there is a bar indicating its connection status:

                                                                                                                                                                                                    • An orange bar indicates that the browser is up, but the connection to the media server is still in progress.
                                                                                                                                                                                                    • A green bar indicates that the connection is up and running.
                                                                                                                                                                                                    • A red bar indicates that the connection has failed, indicating the time that it's down.

                                                                                                                                                                                                    CPU load of the server is also shown with a black marked plot (from 0 to 1, representing 0% to 100% CPU load).

                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with Pion

                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with mediasoup"},{"location":"docs/self-hosting/production-ready/performance/#benchmarking-technical-details","title":"Benchmarking technical details","text":"
                                                                                                                                                                                                    • Each participant sending video and audio to the media server uses the following video in loop: Video. The video is in YUV4MPEG2 format and with a 640x480 resolution. The audio is in WAV format: Audio.
                                                                                                                                                                                                    • All tests were done using AWS EC2 instances. The media server runs with a m6in.xlarge instance type, an instance type with 4 vCPUs and better network capabilities compared to other instance types.
                                                                                                                                                                                                    • The workers running the browsers that act as participants ran in c5.xlarge instances, an instance type with 4 vCPUs with better computing capabilities.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#benchmarking-methodology","title":"Benchmarking methodology","text":"

                                                                                                                                                                                                    Each test begins with no participants on the media server. First, the test controller creates EC2 instances to host the browsers. The controller then sends a request to create a number of participants (this number is known as the batch size). After each browser sends confirmation to the controller that it is connected, the controller sends another request to add more participants (as many participants as the batch size specifies). A participant is considered connected to the room if:

                                                                                                                                                                                                    • If the participants sends video and audio, the participant is connected after confirming that both local tracks are being sent correctly.
                                                                                                                                                                                                    • If the participant acts as viewer (is only receiving video and audio from a different participant), the participant is connected when it confirms that it is receiving at least both tracks from a user in the room.

                                                                                                                                                                                                    The test stops when it determines that no more users can be added to a room. This happens when a user has 5 failed connections. A connection is considered to have failed when it terminates with a fatal error (in LiveKit this is captured when a Disconnected event occurs) or when the connection times out. A failure in connection can occur when trying to join a room (ending usually in timeout) or during the connection (a Disconnected event is thrown). Each time a failure is communicated to the controller, it will kill that browser and restart it again, effectively restarting the connection (up to 5 times, as mentioned before).

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/performance/#about-openvidu-loadtest","title":"About OpenVidu LoadTest","text":"

                                                                                                                                                                                                    Tools like livekit-cli simulate participants directly using WebRTC SDKs, but we found out that browsers add significant more load that these kind of systems. This makes Openvidu LoadTest give results that are closer to real-world scenarios, as it uses real browsers. Using real browsers also allows for the collection of useful data related to connections, events and WebRTC statistics. On the other hand, tests performed with Openvidu LoadTest are more expensive, as they require real instances to host the browsers.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/scalability/","title":"Scalability","text":"

                                                                                                                                                                                                    Scalability is a very broad term with implications on many levels. In the case of real-time applications, it usually refers to the number of simultaneous Rooms you can host and the maximum number of participants in each Room, or more accurately, the number of media tracks sent and received in each Room.

                                                                                                                                                                                                    OpenVidu offers scalability out-of-the-box for typical videoconferencing use cases, but also for large low-latency live streams with hundreds of viewers. With OpenVidu Elastic and OpenVidu High Availability you can easily scale your deployment to host many simultaneous videoconferences and live streams. And it is also possible to scale automatically with our autoscaling feature, so you can truly adapt your resources to the demand.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/scalability/#scalability-depending-on-the-use-case","title":"Scalability depending on the use case","text":""},{"location":"docs/self-hosting/production-ready/scalability/#small-and-medium-videoconferences","title":"Small and medium videoconferences","text":"

                                                                                                                                                                                                    OpenVidu allows you to host multiple small and medium videoconferences (up to 10 participants). The number of simultaneous rooms depends on the deployment used and the power of machines.

                                                                                                                                                                                                    • Single Node deployment (OpenVidu Community): In this deployment, OpenVidu can manage up to XXX simultaneous videoconferences of 10 participants in a 4 CPU server. If you need more videoconferences at the same time, you can use more powerful server. This is known as vertical scalability. The limit here is usually the maximum computational power available for a single server and the maximum network bandwidth for it.

                                                                                                                                                                                                    • Elastic and High Availability deployments (OpenVidu Pro): In these deployments, OpenVidu is able to distribute the videoconferences in multiple media servers. This is known as horizontal scalability. In this case, the maximum number of simultaneous videoconferences depends on the number of media server used and the computational power of each of them. Also, the service used to coordinate the media servers (Redis) can be the bottleneck and limit the number of videoconferences. In High Availability deployments, Redis is distributed in 4 master nodes, so it is able to handle more load than in the Elastic deployment (with only one master node).

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/scalability/#big-live-streams","title":"Big live streams","text":"

                                                                                                                                                                                                    Live streaming is different from a video conference. In a videoconference, usually all participants can publish audio and video. Instead, in a live stream, only one participant can publish audio and video (known as the publisher) and others can view it (known as viewers).

                                                                                                                                                                                                    OpenVidu is able to manage live streams with up to XXX viewers (1 publisher and XXX subscribers) in a single Room hosted in a server with 4 CPUs. To manage more than one live stream simultaneously, an Elastic or High Availability deployment is needed with several media servers.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/scalability/#big-videoconferences-and-massive-live-streams-working-on-it","title":"Big videoconferences and massive live streams (Working on it! )","text":"

                                                                                                                                                                                                    For big videoconferences with many participants (in the order of 100- or even 1000-) and massive live streams with few publishers and thousands of viewers, OpenVidu will offer in the near future two distinct strategies:

                                                                                                                                                                                                    • Distributing participants of one Room in multiple servers: By connecting multiple media servers between them, OpenVidu will be able to manage Rooms with unlimited number of participants and live streams with unlimited number of viewers.
                                                                                                                                                                                                    • Only show last speakers: A browser or mobile app is able to show a limited number of participants. A powerful computer can visualize up to 10 simultaneous videoconference participants at the same time with high video quality. To allow big videoconferences, OpenVidu will provide features on its frontend SDKs to show only last speakers in the videoconference.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/scalability/#autoscaling","title":"Autoscaling","text":"

                                                                                                                                                                                                    OpenVidu Elastic and OpenVidu High Availability have multiple Media Nodes to handle the load.

                                                                                                                                                                                                    • Rooms are distributed among the available nodes prioritizing the less-loaded nodes.
                                                                                                                                                                                                    • It is possible to dynamically add new Media Nodes to the cluster when the load increases.
                                                                                                                                                                                                    • It is possible to remove Media Nodes from the cluster when the load decreases. If the Media Node is hosting ongoing Rooms, it won't accept new Rooms and will wait until the ongoing Rooms finish before terminating.

                                                                                                                                                                                                    When deploying on AWS, OpenVidu will automatically add and remove Media Nodes according to load, thanks to Auto Scaling Groups. When deploying On Premises you are responsible of monitoring the load of your Media Nodes and triggering the addition of new Media Nodes or removal of existing Media Nodes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/","title":"Observability","text":"

                                                                                                                                                                                                    Any production software needs to be observable. But in real-time applications this becomes an absolute priority. You must be able to:

                                                                                                                                                                                                    • Detect and solve networking issues that may prevent your users from connecting to your Rooms.
                                                                                                                                                                                                    • Monitor the quality of the video and audio streams, that will reflect in your users' experience.
                                                                                                                                                                                                    • Analyze the load in your hardware to detect bottlenecks and scale your deployment accordingly.
                                                                                                                                                                                                    • Store historical data to analyze past issues and trends to make future decisions based on them.

                                                                                                                                                                                                    OpenVidu brings everything you need to fulfill these requirements. We collect events, metrics and logs from your deployment and provide OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/","title":"Grafana Stack","text":"

                                                                                                                                                                                                    OpenVidu also provides different Grafana dashboards to monitor metrics from OpenVidu Server and logs from your cluster.

                                                                                                                                                                                                    Grafana is available at https://your.domain/grafana/ and can be accessed using your Grafana admin credentials.

                                                                                                                                                                                                    Dashboards can be found in the OpenVidu folder at https://your.domain/grafana/dashboards/f/openvidu-dashboards/openvidu.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#services","title":"Services","text":"

                                                                                                                                                                                                    The Grafana stack that comes with OpenVidu is composed of the following services:

                                                                                                                                                                                                    • Grafana : Tool for querying, visualizing, alerting on and exploring metrics, logs and traces. It queries different data sources to show data in beautiful dashboards. In OpenVidu, contains all dashboards built from Mimir/Prometheus and Loki data sources to monitor OpenVidu Server and logs from your cluster.
                                                                                                                                                                                                    • Prometheus : System monitoring and alerting toolkit. It collects and stores metrics from different targets as time series data. In OpenVidu, it collects metrics from OpenVidu Server of each Media Node and sends them to Mimir.
                                                                                                                                                                                                    • Mimir: Grafana software project that provides multi-tenant, long-term storage for Prometheus metrics. In OpenVidu, it is used to store metrics collected by Prometheus.
                                                                                                                                                                                                    • Promtail: Agent that ships the contents of local logs to a Loki instance. In OpenVidu, it is used to collect logs from all services in your cluster and send them to Loki.
                                                                                                                                                                                                    • Loki: Horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. In OpenVidu, it is used to store logs collected by Promtail.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#dashboards","title":"Dashboards","text":""},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-server-metrics","title":"OpenVidu Server Metrics","text":"

                                                                                                                                                                                                    This dashboard provides metrics about OpenVidu Server. It includes charts about active rooms, active participants, published tracks, subscribed tracks, send/receive bytes, packet loss percentage and quality score.

                                                                                                                                                                                                    In case you are using OpenVidu PRO and you have more than one Media Node deployed, you will see all metrics from all nodes combined in the same chart.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-media-nodes-server-metrics","title":"OpenVidu Media Nodes Server Metrics","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    This dashboard provides the same metrics as the OpenVidu Server Metrics dashboard, but grouped by Media Node.

                                                                                                                                                                                                    You can select the Media Node you want to see metrics from in the media_node dropdown. You will see different charts in the same panel according to the selected Media Nodes.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you add new Media Nodes to your OpenVidu deployment, you will have to refresh the page in order to see the new Media Nodes in the dropdown.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-logs","title":"OpenVidu Logs","text":"

                                                                                                                                                                                                    In case you are using OpenVidu COMMUNITY, this dashboard provides different visualizations for logs from your OpenVidu Single Node deployment.

                                                                                                                                                                                                    There is a panel showing all containers logs,

                                                                                                                                                                                                    another panel to filter logs by room_id and participant_id,

                                                                                                                                                                                                    and one row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-cluster-nodes-logs","title":"OpenVidu Cluster Nodes Logs","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by node.

                                                                                                                                                                                                    First of all, there is a panel showing all containers logs from all nodes.

                                                                                                                                                                                                    Then, there is a row for each selected node, containing all logs, warnings and errors from that node. Besides, each row contains a panel for each selected container, showing all its logs.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Note that some panels have no data. This is because some containers are running in Master Nodes and others in Media Nodes.

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-cluster-services-logs","title":"OpenVidu Cluster Services Logs","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by service.

                                                                                                                                                                                                    First of all, there is a panel to filter logs by room_id and participant_id.

                                                                                                                                                                                                    Then, there is a row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/grafana-stack/#limitations","title":"Limitations","text":"

                                                                                                                                                                                                    For now, in OpenVidu High Availability deployments, we have decided to not implement Grafana in High Availability (HA) mode. This decision is based on the fact that Grafana needs a configured HA MySQL or PostgreSQL database to work in HA mode, and we want to keep the deployment as simple as possible.

                                                                                                                                                                                                    There are 4 instances of Grafana in an OpenVidu High Availability deployment, one for each Master Node, but they are not synchronized between them. Therefore, if you make any change (change your admin password, create a new dashboard...) in one Grafana instance and the Master Node suddenly goes down, you will be redirected to another Grafana instance where the changes will not be reflected. That is the reason why we disable user signups and saving dashboard or datasource modifications in Grafana.

                                                                                                                                                                                                    However, all metrics and logs from all nodes are available in all Grafana instances, so you can monitor your OpenVidu cluster without any problem.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/","title":"OpenVidu Dashboard","text":"

                                                                                                                                                                                                    It is a web application designed to provide OpenVidu administrators with a comprehensive view of usage statistics and real-time monitoring of video Rooms. OpenVidu Dashboard is included by default in any OpenVidu deployment.

                                                                                                                                                                                                    To access OpenVidu Dashboard, go to https://your.domain/dashboard/ and log in using your admin credentials.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#views","title":"Views","text":""},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#analytics","title":"Analytics","text":"

                                                                                                                                                                                                    Display graphical analytics for client SDKs, connection types, bandwidth usage, unique participants, rooms and egresses created over different time periods (last 24 hours, last 7 days, last 28 days or current month).

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#rooms","title":"Rooms","text":"

                                                                                                                                                                                                    Review the total count of active rooms and active participants, along with a roster of currently active rooms and a history of closed rooms within the last 28 days. Detailed information on each room is accessible by clicking on the respective row.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#room-details","title":"Room Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Retrieve in-depth information about a specific room, including its duration, bandwidth consumption, participants and related events. A chart illustrating the active participants count over time is also provided.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#participant-details","title":"Participant Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Obtain detailed insights into each participant, covering their duration, bandwidth usage, average audio and video quality score, information about the client they are connecting with, connection stats, published tracks and related events.

                                                                                                                                                                                                    A participant may connect and disconnect from a room multiple times while it remains open. Each instance of connection using the same participant identity is referred to as a participant session. If multiple sessions occur, we will aggregate all participant sessions together and organize them into a timeline at the top of the participant details view. You can easily switch between participant sessions by clicking on each corresponding row:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#egress-ingress","title":"Egress-Ingress","text":"

                                                                                                                                                                                                    Review an overview of all egresses and ingresses, including their duration and status. Detailed information for each egress or ingress can be accessed by clicking on the respective row.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#egress-details","title":"Egress Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Access comprehensive details about a specific egress, including its duration, current status, type, associated room, destinations, status timeline and request information.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/production-ready/observability/openvidu-dashboard/#ingress-details","title":"Ingress Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Explore detailed information about a specific ingress, including its total duration, status and a list of all associated rooms.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/","title":"OpenVidu Single Node installation","text":"

                                                                                                                                                                                                    OpenVidu Single Node is part of the COMMUNITY edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation: Set up OpenVidu Single Node on your own servers.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Single Node on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/admin/","title":"OpenVidu Single Node Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    AWS deployment of OpenVidu Single Node is internally identical to the on-premises deployment, so you can follow the same instructions from the On Premises Single Node for administration and configuration. The only difference is that the deployment is automated with AWS CloudFormation.

                                                                                                                                                                                                    However, there are certain things worth mentioning:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/admin/#start-and-stop-openvidu-through-aws-console","title":"Start and stop OpenVidu through AWS Console","text":"

                                                                                                                                                                                                    You can start and stop all services as explained in the On Premises Single Node section. But you can also start and stop the EC2 instance directly from the AWS Console. This will stop all services running in the instance and reduce AWS costs.

                                                                                                                                                                                                    Stop OpenVidu Single NodeStart OpenVidu Single Node
                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. Right-click on the instance you want to start and select \"Stop instance\".

                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. Right-click on the instance you want to start and select \"Start instance\".

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    You can change the instance type of the OpenVidu Single Node instance to adapt it to your needs. To do this, follow these steps:

                                                                                                                                                                                                    1. Stop the instance.
                                                                                                                                                                                                    2. Right-click on the instance and select \"Instance Settings > Change Instance Type\".

                                                                                                                                                                                                      Change instance type

                                                                                                                                                                                                    3. Select the new instance type and click on \"Apply\".

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Single Node Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Single Node.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Single Node deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu Single Node deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" to apply the changes to the Master Node.

                                                                                                                                                                                                    The changes will be applied automatically.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/","title":"OpenVidu Single Node Installation: AWS","text":"

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment in AWS. Deployed services are the same as the On Premises Single Node Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu Single Node in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/latest/aws/cf-openvidu-singlenode.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/3.0.0/aws/cf-openvidu-singlenode.yaml\n
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Single Node AWS Architecture

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#domain-and-ssl-certificate-configuration","title":"Domain and SSL Certificate Configuration","text":"

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    Let's Encrypt Certificate (recommended)Self-Signed CertificateCustom Certificates

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let\u2019s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    You don\u2019t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instance that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at InstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Single Node deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/","title":"OpenVidu Single Node Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Single Node on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Single Node deployments.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    You can start, stop, and restart the OpenVidu services using the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                        COMMAND                  SERVICE      CREATED          STATUS\napp          docker.io/openvidu/openvidu-call             \"docker-entrypoint.s\u2026\"   app          19 seconds ago   Up 16 seconds\ncaddy        docker.io/openvidu/openvidu-caddy            \"/bin/caddy run --co\u2026\"   caddy        19 seconds ago   Up 16 seconds\ndashboard    docker.io/openvidu/openvidu-dashboard        \"./openvidu-dashboard\"   dashboard    19 seconds ago   Up 16 seconds\negress       docker.io/livekit/egress                     \"/entrypoint.sh\"         egress       18 seconds ago   Up 14 seconds\ngrafana      docker.io/grafana/grafana                    \"/run.sh\"                grafana      18 seconds ago   Up 13 seconds\ningress      docker.io/livekit/ingress                    \"ingress\"                ingress      19 seconds ago   Up 14 seconds\nloki         docker.io/grafana/loki                       \"/usr/bin/loki -conf\u2026\"   loki         18 seconds ago   Up 14 seconds\nminio        docker.io/bitnami/minio                      \"/opt/bitnami/script\u2026\"   minio        18 seconds ago   Up 14 seconds\nmongo        docker.io/mongo                              \"docker-entrypoint.s\u2026\"   mongo        18 seconds ago   Up 15 seconds\nopenvidu     docker.io/openvidu/openvidu-server           \"/livekit-server --c\u2026\"   openvidu     19 seconds ago   Up 14 seconds\nprometheus   docker.io/prom/prometheus                    \"/bin/prometheus --c\u2026\"   prometheus   18 seconds ago   Up 14 seconds\npromtail     docker.io/grafana/promtail                   \"/usr/bin/promtail -\u2026\"   promtail     18 seconds ago   Up 14 seconds\nredis        docker.io/redis                              \"docker-entrypoint.s\u2026\"   redis        19 seconds ago   Up 15 seconds\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on \"OpenVidu > OpenVidu Logs\". All the logs will be displayed there.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall OpenVidu, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/","title":"OpenVidu Single Node Installation: On-premises","text":"

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment on-premises. It is a deployment based on Docker and Docker Compose, which will automatically configure all the necessary services for OpenVidu to work properly.

                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Single Node On Premises Architecture

                                                                                                                                                                                                    All services are deployed on a single machine, which includes:

                                                                                                                                                                                                    • OpenVidu Server (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#prerequisites","title":"Prerequisites","text":"

                                                                                                                                                                                                    Before starting the installation process, make sure you have the following prerequisites:

                                                                                                                                                                                                    • A machine with at least 4GB RAM and 4 CPU cores and Linux installed (Ubuntu recommended).
                                                                                                                                                                                                    • Generous disk space (100GB recommended) if you are going to record your sessions.
                                                                                                                                                                                                    • The machine must have a Public IP and an FQDN (Fully Qualified Domain Name) pointing to it.
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#port-rules","title":"Port rules","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your machine.

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP traffic to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • LiveKit API.
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    UDP 443 0.0.0.0/0, ::/0 STUN/TURN server over UDP. TCP 1935 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest RTMP streams using Ingress service. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest WebRTC using WHIP protocol. TCP 9000 0.0.0.0/0, ::/0 (Optional), only needed if you want to expose MinIO publicly. UDP 50000 - 60000 0.0.0.0/0, ::/0 WebRTC Media traffic.

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that your machine meets the prerequisites and the port rules. Then, execute the following command on the machine where you want to deploy OpenVidu:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh)\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    When the installation process finishes, you will see the following message:

                                                                                                                                                                                                    > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Community Installation Finished Successfully! \ud83c\udf89               <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                    OpenVidu will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                    systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • URL: The value in .env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    If you want to automate the installation process, you can generate a command with all the parameters needed to install OpenVidu by answering the wizard questions. You can do this by running the following command:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=single_node\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    This is going to generate a command like this, but it may vary depending on the answers you provide. Here are three examples of the command you can run depending on the certificate type you choose:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='selfsigned' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    You can run that command in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some notes about the command:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack) and app (Default App - OpenVidu Call).
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media.

                                                                                                                                                                                                    To start OpenVidu, remember to run:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"docs/self-hosting/single-node/on-premises/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Single Node deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/","title":"Advanced Features Tutorials","text":"

                                                                                                                                                                                                    Explore more advanced features of LiveKit! For now, we have implemented a basic recording tutorial and an advanced one, but our tutorials for streaming and ingesting are coming soon.

                                                                                                                                                                                                    Recording Basic

                                                                                                                                                                                                    Recording Advanced

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/","title":"Advanced Recording Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial improves the basic recording tutorial by doing the following:

                                                                                                                                                                                                    • Complete recording metadata: Listen to webhook events and save all necessary metadata in a separate file.
                                                                                                                                                                                                    • Real time recording status notification: Implement a custom notification system to inform participants about the recording status by listening to webhook events and updating room metadata.
                                                                                                                                                                                                    • Recording deletion notification: Implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.
                                                                                                                                                                                                    • Direct access to recording files: Add an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/advanced-features/recording-advanced/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#3-run-the-application","title":"3. Run the application","text":"

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-advanced-node\n
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    npm install\n
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Limitation: Playing recordings with the S3 strategy from other devices in your local network is not possible due to MinIO not being exposed. To play recordings from other devices, you need to change the environment variable RECORDING_PLAYBACK_STRATEGY to PROXY.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#enhancements","title":"Enhancements","text":""},{"location":"docs/tutorials/advanced-features/recording-advanced/#refactoring-backend","title":"Refactoring backend","text":"

                                                                                                                                                                                                    The backend has been refactored to prevent code duplication and improve readability. The main changes are:

                                                                                                                                                                                                    • Endpoints have been moved to the controllers folder, creating a controller for each set of related endpoints:

                                                                                                                                                                                                      • RoomController for the room creation endpoint.
                                                                                                                                                                                                      • RecordingController for the recording endpoints.
                                                                                                                                                                                                      • WebhookController for the webhook endpoint.
                                                                                                                                                                                                    • The index.js file now simply sets the route for each controller:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      app.use(\"/token\", roomController);\napp.use(\"/recordings\", recordingController);\napp.use(\"/livekit/webhook\", webhookController);\n
                                                                                                                                                                                                    • The configuration of environment variables and constants has been moved to the config.js file:

                                                                                                                                                                                                      config.js
                                                                                                                                                                                                      export const SERVER_PORT = process.env.SERVER_PORT || 6080;\nexport const APP_NAME = \"openvidu-recording-advanced-node\";\n\n// LiveKit configuration\nexport const LIVEKIT_URL = process.env.LIVEKIT_URL || \"http://localhost:7880\";\nexport const LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\";\nexport const LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\";\n\n// S3 configuration\nexport const S3_ENDPOINT = process.env.S3_ENDPOINT || \"http://localhost:9000\";\nexport const S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || \"minioadmin\";\nexport const S3_SECRET_KEY = process.env.S3_SECRET_KEY || \"minioadmin\";\nexport const AWS_REGION = process.env.AWS_REGION || \"us-east-1\";\nexport const S3_BUCKET = process.env.S3_BUCKET || \"openvidu\";\n\nexport const RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? \"recordings/\";\nexport const RECORDINGS_METADATA_PATH = \".metadata/\";\nexport const RECORDING_PLAYBACK_STRATEGY = process.env.RECORDING_PLAYBACK_STRATEGY || \"S3\"; // PROXY or S3\nexport const RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // 5MB\n
                                                                                                                                                                                                    • Operations of the EgressClient and functions related to recording management have been moved to the RecordingService class within the services folder.

                                                                                                                                                                                                    After refactoring and implementing the improvements, the backend of the application has the following structure:

                                                                                                                                                                                                    src\n\u251c\u2500\u2500 controllers\n\u2502   \u251c\u2500\u2500 recording.controller.js\n\u2502   \u251c\u2500\u2500 room.controller.js\n\u2502   \u2514\u2500\u2500 webhook.controller.js\n\u251c\u2500\u2500 services\n\u2502   \u251c\u2500\u2500 recording.service.js\n\u2502   \u251c\u2500\u2500 room.service.js\n\u2502   \u2514\u2500\u2500 s3.service.js\n\u251c\u2500\u2500 config.js\n\u251c\u2500\u2500 index.js\n

                                                                                                                                                                                                    Where room.service.js defines the RoomService class, that contains the logic to manage rooms using the RoomServiceClient.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#adding-room-metadata","title":"Adding room metadata","text":"

                                                                                                                                                                                                    In order to store the recording status in the room metadata, we have to create the room explicitly the first time a user joins it, setting the metadata field with an object that contains the recording status. This object also contains the app name, which is used to identify webhook events related to the application. This is done in the POST /token endpoint:

                                                                                                                                                                                                    room.controller.js
                                                                                                                                                                                                    roomController.post(\"/\", async (req, res) => {\n    const roomName = req.body.roomName;\n    const participantName = req.body.participantName;\n\n    if (!roomName || !participantName) {\n        res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n        return;\n    }\n\n    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {\n        identity: participantName\n    });\n    at.addGrant({ room: roomName, roomJoin: true, roomRecord: true });\n    const token = await at.toJwt();\n\n    try {\n        // Create room if it doesn't exist\n        const exists = await roomService.exists(roomName); // (1)!\n\n        if (!exists) {\n            await roomService.createRoom(roomName); // (2)!\n        }\n\n        res.json({ token });\n    } catch (error) {\n        console.error(\"Error creating room.\", error);\n        res.status(500).json({ errorMessage: \"Error creating room\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the room exists.
                                                                                                                                                                                                    2. Create the room if it doesn't exist.

                                                                                                                                                                                                    After generating the access token with the required permissions, this endpoint does the following:

                                                                                                                                                                                                    1. Checks if the room exists by calling the exists method of the RoomService with the roomName as a parameter. This method returns a boolean indicating whether the room obtained from the getRoom method is not null. This other method lists all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter, and returns the first element of the list if it exists:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async getRoom(roomName) {\n    const rooms = await this.roomClient.listRooms([roomName]); // (1)!\n    return rooms.length > 0 ? rooms[0] : null; // (2)!\n}\n\nasync exists(roomName) {\n    const room = await this.getRoom(roomName);\n    return room !== null;\n}\n
                                                                                                                                                                                                      1. List all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter.
                                                                                                                                                                                                      2. Return the first element of the list if it exists.
                                                                                                                                                                                                    2. Creates the room if it doesn't exist by calling the createRoom method of the RoomService with the roomName as a parameter. This method creates a room with the roomName and sets the metadata field with an object that contains the app name (defined in the config.js file) and the recording status initialized to STOPPED. To achieve this, the method calls the createRoom method of the RoomServiceClient with an object indicating the room name and metadata:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async createRoom(roomName) {\n    const roomOptions = {\n        name: roomName,\n        metadata: JSON.stringify({\n            createdBy: APP_NAME, // (1)!\n            recordingStatus: \"STOPPED\" // (2)!\n        })\n    };\n    return this.roomClient.createRoom(roomOptions); // (3)!\n}\n
                                                                                                                                                                                                      1. Set the app name.
                                                                                                                                                                                                      2. Set the recording status to STOPPED.
                                                                                                                                                                                                      3. Create the room with the roomOptions object by calling the createRoom method of the RoomServiceClient.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#handling-webhook-events","title":"Handling webhook events","text":"

                                                                                                                                                                                                    In previous tutorials, we listened to all webhook events and printed them in the console without doing anything else. In this tutorial, we have to first check if the webhook is related to the application and then act accordingly depending on the event type. This is done in the POST /livekit/webhook endpoint:

                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    webhookController.post(\"/\", async (req, res) => {\n    try {\n        const webhookEvent = await webhookReceiver.receive(req.body, req.get(\"Authorization\"));\n        const isWebhookRelatedToMe = await checkWebhookRelatedToMe(webhookEvent); // (1)!\n\n        if (isWebhookRelatedToMe) {\n            console.log(webhookEvent);\n            const { event: eventType, egressInfo } = webhookEvent; // (2)!\n\n            switch (eventType) {\n                case \"egress_started\": // (3)!\n                case \"egress_updated\":\n                    await notifyRecordingStatusUpdate(egressInfo);\n                    break;\n                case \"egress_ended\": // (4)!\n                    await handleEgressEnded(egressInfo);\n                    break;\n            }\n        }\n    } catch (error) {\n        console.error(\"Error validating webhook event.\", error);\n    }\n\n    res.status(200).send();\n});\n
                                                                                                                                                                                                    1. Check if the webhook is related to the application.
                                                                                                                                                                                                    2. Destructure the event type and egress info from the webhook event.
                                                                                                                                                                                                    3. If the event type is egress_started or egress_updated, notify the recording status update.
                                                                                                                                                                                                    4. If the event type is egress_ended, handle the egress ended.

                                                                                                                                                                                                    After receiving the webhook event, this endpoint does the following:

                                                                                                                                                                                                    1. Checks if the webhook is related to the application by calling the checkWebhookRelatedToMe function with the webhook event as a parameter. This function returns a boolean indicating whether the app name obtained from the metadata field of the room related to the webhook event is equal to the app name defined in the config.js file:

                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      const checkWebhookRelatedToMe = async (webhookEvent) => {\n    const { room, egressInfo, ingressInfo } = webhookEvent; // (1)!\n    let roomInfo = room;\n    // (2)!\n    if (!room || !room.metadata) {\n        const roomName = room?.name ?? egressInfo?.roomName ?? ingressInfo?.roomName; // (3)!\n        roomInfo = await roomService.getRoom(roomName); // (4)!\n\n        if (!roomInfo) {\n            return false;\n        }\n    }\n\n    const metadata = roomInfo.metadata ? JSON.parse(roomInfo.metadata) : null; // (5)!\n    return metadata?.createdBy === APP_NAME; // (6)!\n};\n
                                                                                                                                                                                                      1. Destructure the room, egress info, and ingress info from the webhook event.
                                                                                                                                                                                                      2. Check if the room and metadata fields exist.
                                                                                                                                                                                                      3. If the room or metadata fields don't exist, get the room name from the room, egress info, or ingress info.
                                                                                                                                                                                                      4. Get the room info by calling the getRoom method of the RoomService with the roomName as a parameter.
                                                                                                                                                                                                      5. Parse the metadata field of the room info.
                                                                                                                                                                                                      6. Return whether the app name is equal to the app name defined in the config.js file.
                                                                                                                                                                                                    2. Destructures the event type and egress info from the webhook event.

                                                                                                                                                                                                    3. If the event type is egress_started or egress_updated, calls the notifyRecordingStatusUpdate function with the egress info as a parameter. This function notifies all participants in the room related to the egress info about the recording status update. See the Notifying recording status update section for more information.

                                                                                                                                                                                                    4. If the event type is egress_ended, calls the handleEgressEnded function with the egress info as a parameter. This function saves the recording metadata in a separate file (see the Saving recording metadata section) and notifies all participants in the room related to the egress info that the recording has been stopped:

                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      const handleEgressEnded = async (egressInfo) => {\n    try {\n        await recordingService.saveRecordingMetadata(egressInfo); // (1)!\n    } catch (error) {\n        console.error(\"Error saving recording metadata.\", error);\n    }\n\n    await notifyRecordingStatusUpdate(egressInfo); // (2)!\n};\n
                                                                                                                                                                                                      1. Save the recording metadata.
                                                                                                                                                                                                      2. Notify all participants in the room that the recording has been stopped.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#notifying-recording-status-update","title":"Notifying recording status update","text":"

                                                                                                                                                                                                    When the recording status changes, all participants in the room have to be notified. This is done by updating the metadata field of the room with the new recording status, which will trigger the RoomEvent.RoomMetadataChanged event in the client side. This is implemented in the notifyRecordingStatusUpdate function:

                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    const notifyRecordingStatusUpdate = async (egressInfo) => {\n    const roomName = egressInfo.roomName; // (1)!\n    const recordingStatus = recordingService.getRecordingStatus(egressInfo.status); // (2)!\n\n    try {\n        await roomService.updateRoomMetadata(roomName, recordingStatus); // (3)!\n    } catch (error) {\n        console.error(\"Error updating room metadata.\", error);\n    }\n};\n
                                                                                                                                                                                                    1. Get the room name from the egress info.
                                                                                                                                                                                                    2. Get the recording status from the egress info status.
                                                                                                                                                                                                    3. Update the room metadata with the new recording status.

                                                                                                                                                                                                    After getting the room name from the egress info, this function does the following:

                                                                                                                                                                                                    1. Gets the recording status by calling the getRecordingStatus method of the RecordingService with the egress info status as a parameter. This method returns the recording status based on the egress info status:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getRecordingStatus(egressStatus) {\n    switch (egressStatus) {\n        case EgressStatus.EGRESS_STARTING:\n            return \"STARTING\";\n        case EgressStatus.EGRESS_ACTIVE:\n            return \"STARTED\";\n        case EgressStatus.EGRESS_ENDING:\n            return \"STOPPING\";\n        case EgressStatus.EGRESS_COMPLETE:\n            return \"STOPPED\";\n        default:\n            return \"FAILED\";\n    }\n}\n

                                                                                                                                                                                                      We distinguish between the following recording statuses:

                                                                                                                                                                                                      • STARTING: The recording is starting.
                                                                                                                                                                                                      • STARTED: The recording is active.
                                                                                                                                                                                                      • STOPPING: The recording is stopping.
                                                                                                                                                                                                      • STOPPED: The recording has stopped.
                                                                                                                                                                                                      • FAILED: The recording has failed.
                                                                                                                                                                                                    2. Updates the room metadata with the new recording status by calling the updateRoomMetadata method of the RoomService with the roomName and recordingStatus as parameters. This method updates the metadata field of the room with an object that contains the app name and the new recording status by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async updateRoomMetadata(roomName, recordingStatus) {\n    const metadata = {\n        createdBy: APP_NAME,\n        recordingStatus // (1)!\n    };\n    return this.roomClient.updateRoomMetadata(roomName, JSON.stringify(metadata)); // (2)!\n}\n
                                                                                                                                                                                                      1. Update the recording status.
                                                                                                                                                                                                      2. Update the room metadata with the new metadata by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#saving-recording-metadata","title":"Saving recording metadata","text":"

                                                                                                                                                                                                    When the recording ends, the metadata related to the recording has to be saved in a separate file. This is done in the saveRecordingMetadata function:

                                                                                                                                                                                                    recording.service.js
                                                                                                                                                                                                    async saveRecordingMetadata(egressInfo) {\n    const recordingInfo = this.convertToRecordingInfo(egressInfo); // (1)!\n    const key = this.getMetadataKey(recordingInfo.name); // (2)!\n    await s3Service.uploadObject(key, recordingInfo); // (3)!\n}\n
                                                                                                                                                                                                    1. Convert the egress info to a recording info object.
                                                                                                                                                                                                    2. Get the metadata key from the recording info name.
                                                                                                                                                                                                    3. Upload the recording metadata to the S3 bucket.

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    1. Converts the egress info to a recording info object by calling the convertToRecordingInfo method:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      convertToRecordingInfo(egressInfo) {\n    const file = egressInfo.fileResults[0];\n    return {\n        id: egressInfo.egressId,\n        name: file.filename.split(\"/\").pop(),\n        roomName: egressInfo.roomName,\n        roomId: egressInfo.roomId,\n        startedAt: Number(egressInfo.startedAt) / 1_000_000,\n        duration: Number(file.duration) / 1_000_000_000,\n        size: Number(file.size)\n    };\n}\n

                                                                                                                                                                                                      Getting recording metadata

                                                                                                                                                                                                      In this tutorial, we can access detailed information about the recording directly from the metadata file stored in the S3 bucket, without needing to make additional requests. This is made possible by saving all the necessary data retrieved from the egress info object. Compared to the basic recording tutorial, we are now storing additional details such as the recording name, duration and size.

                                                                                                                                                                                                    2. Gets the metadata key from the recordings path and the recordings metadata path, both defined in the config.js file, and the recording name replacing the .mp4 extension with .json:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getMetadataKey(recordingName) {\n    return RECORDINGS_PATH + RECORDINGS_METADATA_PATH + recordingName.replace(\".mp4\", \".json\");\n}\n
                                                                                                                                                                                                    3. Uploads the recording metadata to the S3 bucket by calling the uploadObject method of the S3Service with the key and recordingInfo as parameters. This method uploads an object to the S3 bucket by sending a PutObjectCommand with the key and the stringified object as parameters:

                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      async uploadObject(key, body) {\n    const params = {\n        Bucket: S3_BUCKET,\n        Key: key,\n        Body: JSON.stringify(body)\n    };\n    const command = new PutObjectCommand(params);\n    return this.run(command);\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#notifying-recording-deletion","title":"Notifying recording deletion","text":"

                                                                                                                                                                                                    When a recording is deleted, all participants in the room have to be notified. This is done by sending a data message to all participants in the room. To achieve this, the DELETE /recordings/:recordingName endpoint has been modified as follows:

                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.delete(\"/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const exists = await recordingService.existsRecording(recordingName);\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        const { roomName } = await recordingService.getRecordingMetadata(recordingName); // (1)!\n        await recordingService.deleteRecording(recordingName);\n\n        // Notify to all participants that the recording was deleted\n        const existsRoom = await roomService.exists(roomName); // (2)!\n\n        if (existsRoom) {\n            await roomService.sendDataToRoom(roomName, { recordingName }); // (3)!\n        }\n\n        res.json({ message: \"Recording deleted\" });\n    } catch (error) {\n        console.error(\"Error deleting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error deleting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Get the room name from the recording metadata.
                                                                                                                                                                                                    2. Check if the room exists.
                                                                                                                                                                                                    3. Send a data message to the room indicating that the recording was deleted.

                                                                                                                                                                                                    Before deleting the recording, we get the room name from the recording metadata. After deleting the recording, we check if the room exists and, if it does, send a data message to the room indicating that the recording was deleted. This is done by calling the sendDataToRoom method of the RoomService with the roomName and an object containing the recordingName as parameters:

                                                                                                                                                                                                    room.service.js
                                                                                                                                                                                                    async sendDataToRoom(roomName, rawData) {\n    const data = encoder.encode(JSON.stringify(rawData)); // (1)!\n    const options = {\n        topic: \"RECORDING_DELETED\", // (2)!\n        destinationSids: [] // (3)!\n    };\n\n    try {\n        await this.roomClient.sendData(roomName, data, DataPacket_Kind.RELIABLE, options); // (4)!\n    } catch (error) {\n        console.error(\"Error sending data to room\", error);\n    }\n}\n
                                                                                                                                                                                                    1. Encodes the raw data.
                                                                                                                                                                                                    2. Sets the topic to RECORDING_DELETED.
                                                                                                                                                                                                    3. Sets the destination SIDs to an empty array (all participants in the room).
                                                                                                                                                                                                    4. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters.

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    1. Encodes the raw data by calling the encode method of the TextEncoder with the stringified raw data as a parameter.
                                                                                                                                                                                                    2. Sets the topic of the data message to RECORDING_DELETED.
                                                                                                                                                                                                    3. Sets the destination SIDs to an empty array, which means that the message will be sent to all participants in the room.
                                                                                                                                                                                                    4. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters. The DataPacket_Kind.RELIABLE parameter indicates that the message will be sent reliably.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#accessing-recording-files-directly-from-the-s3-bucket","title":"Accessing recording files directly from the S3 bucket","text":"

                                                                                                                                                                                                    In this tutorial, we have added an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL. To accomplish this, we have created a new endpoint (GET /recordings/:recordingName/url) to get the recording URL depending on the playback strategy defined in the environment variable RECORDING_PLAYBACK_STRATEGY, whose value can be PROXY or S3:

                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.get(\"/:recordingName/url\", async (req, res) => {\n    const { recordingName } = req.params;\n    const exists = await recordingService.existsRecording(recordingName); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    // If the recording playback strategy is \"PROXY\", return the endpoint URL\n    if (RECORDING_PLAYBACK_STRATEGY === \"PROXY\") {\n        res.json({ recordingUrl: `/recordings/${recordingName}` }); // (2)!\n        return;\n    }\n\n    try {\n        // If the recording playback strategy is \"S3\", return a signed URL to access the recording directly from S3\n        const recordingUrl = await recordingService.getRecordingUrl(recordingName); // (3)!\n        res.json({ recordingUrl });\n    } catch (error) {\n        console.error(\"Error getting recording URL.\", error);\n        res.status(500).json({ errorMessage: \"Error getting recording URL\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists.
                                                                                                                                                                                                    2. Return the GET /recordings/:recordingName endpoint URL if the playback strategy is PROXY.
                                                                                                                                                                                                    3. Create a presigned URL to access the recording directly from the S3 bucket if the playback strategy is S3.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists. If it does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. If the playback strategy is PROXY, it returns the GET /recordings/:recordingName endpoint URL to get the recording file from the backend.
                                                                                                                                                                                                    4. If the playback strategy is S3, it creates a presigned URL to access the recording directly from the S3 bucket by calling the getRecordingUrl method of the RecordingService with the recordingName as a parameter. This method simply calls the getObjectUrl method of the S3Service with the key of the recording as a parameter:

                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      async getObjectUrl(key) {\n    const params = {\n        Bucket: S3_BUCKET,\n        Key: key\n    };\n    const command = new GetObjectCommand(params);\n    return getSignedUrl(this.s3Client, command, { expiresIn: 86400 }); // 24 hours\n}\n

                                                                                                                                                                                                      This method creates a presigned URL to access the object in the S3 bucket by calling the getSignedUrl function from the @aws-sdk/s3-request-presigner package, indicating the S3Client, GetObjectCommand and the expiration time in seconds as parameters. In this case, the expiration time is set to 24 hours.

                                                                                                                                                                                                      Presigned URLs

                                                                                                                                                                                                      Presigned URLs are URLs that provide access to an S3 object for a limited time. This is useful when you want to share an object with someone for a limited time without providing them with your AWS credentials.

                                                                                                                                                                                                      Compared to the proxy strategy, accessing recording files directly from the S3 bucket via presigned URLs is more efficient, as it reduces server load. However, it presents a security risk, as the URL, once generated, can be used by anyone until it expires.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-advanced/#handling-new-room-events-in-the-client-side","title":"Handling new room events in the client side","text":"

                                                                                                                                                                                                    In the client side, we have to handle the new room events related to the recording status and the recording deletion. This is done by listening to the RoomEvent.RoomMetadataChanged and RoomEvent.DataReceived events in the joinRoom method:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // ...\n    // When recording status changes...\n    room.on(LivekitClient.RoomEvent.RoomMetadataChanged, async (metadata) => {\n        const { recordingStatus } = JSON.parse(metadata);\n        await updateRecordingInfo(recordingStatus);\n    });\n\n    // When a message is received...\n    room.on(LivekitClient.RoomEvent.DataReceived, async (payload, _participant, _kind, topic) => {\n        // If the message is a recording deletion notification, remove the recording from the list\n        if (topic === \"RECORDING_DELETED\") {\n            const { recordingName } = JSON.parse(new TextDecoder().decode(payload));\n            deleteRecordingContainer(recordingName);\n        }\n    });\n    // ...\n}\n

                                                                                                                                                                                                    When a new RoomEvent.RoomMetadataChanged event is received, we parse the metadata to get the recording status and update the recording info accordingly. The updateRecordingInfo function has been updated to handle the new recording statuses.

                                                                                                                                                                                                    In addition to handling this event, we need to update the recording info in the UI the first time a user joins the room. Once the user has joined, we retrieve the current room metadata and update the UI accordingly. Recordings will be listed unless the recording status is STOPPED or FAILED, to prevent listing recordings twice:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // ...\n    // Update recording info\n    const { recordingStatus } = JSON.parse(room.metadata);\n    await updateRecordingInfo(recordingStatus);\n\n    if (recordingStatus !== \"STOPPED\" && recordingStatus !== \"FAILED\") {\n        const roomId = await room.getSid();\n        await listRecordings(room.name, roomId);\n    }\n    // ...\n}\n

                                                                                                                                                                                                    When a new RoomEvent.DataReceived event is received, we check if the topic of the message is RECORDING_DELETED. If it is, we decode the payload using a TextDecoder and parse the message to get the recording name. Then, we remove the recording from the list by calling the deleteRecordingContainer function.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/","title":"Basic Recording Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application, built upon Node.js server and JavaScript client tutorials, and extends them by adding recording capabilities:

                                                                                                                                                                                                    • Start and stop recording a room.
                                                                                                                                                                                                    • List all recordings in a room.
                                                                                                                                                                                                    • Play a recording.
                                                                                                                                                                                                    • Delete a recording.
                                                                                                                                                                                                    • List all available recordings and filter them by room name.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/advanced-features/recording-basic/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#3-run-the-application","title":"3. Run the application","text":"

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-basic-node\n
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    npm install\n
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This application consists of two essential backend files under the src directory:

                                                                                                                                                                                                    • index.js: This file holds the server application and defines the REST API endpoints.
                                                                                                                                                                                                    • s3.service.js: This file encapsulates the operations to interact with the S3 bucket.

                                                                                                                                                                                                    And the following essential frontend files under the public directory:

                                                                                                                                                                                                    • index.html: This is the client application's main HTML file.
                                                                                                                                                                                                    • app.js: This is the main JavaScript file that interacts with the server application and handles the client application's logic and functionality.
                                                                                                                                                                                                    • style.css: This file contains the client application's styling.
                                                                                                                                                                                                    • recordings.html: This file defines the HTML for the general recording page.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#backend","title":"Backend","text":"

                                                                                                                                                                                                    The server application extends the Node.js server tutorial by adding the following REST API endpoints:

                                                                                                                                                                                                    • POST /recordings/start: Starts the recording of a room.
                                                                                                                                                                                                    • POST /recordings/stop: Stops the recording of a room.
                                                                                                                                                                                                    • GET /recordings: Lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID.
                                                                                                                                                                                                    • GET /recordings/:recordingName: Retrieves a recording from the S3 bucket and returns it as a stream.
                                                                                                                                                                                                    • DELETE /recordings/:recordingName: This endpoint deletes a recording from the S3 bucket.

                                                                                                                                                                                                    Before we dive into the code of each endpoint, let's first see the changes introduced in the index.js file:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const SERVER_PORT = process.env.SERVER_PORT || 6080;\n\n// LiveKit configuration\nconst LIVEKIT_URL = process.env.LIVEKIT_URL || \"http://localhost:7880\"; // (1)!\nconst LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\";\nconst LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\";\n\nconst RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? \"recordings/\"; // (2)!\nconst RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // (3)!\n\nconst app = express();\n\napp.use(cors());\napp.use(express.json());\napp.use(express.raw({ type: \"application/webhook+json\" }));\n\n// Set the static files location\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\napp.use(express.static(path.join(__dirname, \"../public\"))); // (4)!\n
                                                                                                                                                                                                    1. The URL of the LiveKit server.
                                                                                                                                                                                                    2. The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    3. The portion size of the recording that will be sent to the client in each request. This value is set to 5 MB.
                                                                                                                                                                                                    4. Set the public directory as the static files location.

                                                                                                                                                                                                    There are three new environment variables:

                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server.
                                                                                                                                                                                                    • RECORDINGS_PATH: The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    • RECORDING_FILE_PORTION_SIZE: The portion size of the recording that will be sent to the client in each request.

                                                                                                                                                                                                    Besides, the index.js file configures the server to serve static files from the public directory.

                                                                                                                                                                                                    It also initializes the EgressClient, which will help interacting with Egress API to manage recordings, and the S3Service, which will help interacting with the S3 bucket:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const egressClient = new EgressClient(LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET);\nconst s3Service = new S3Service();\n

                                                                                                                                                                                                    The POST /token endpoint has been modified to add the roomRecord permission to the access token, so that participants can start recording a room:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/token\", async (req, res) => {\n    const roomName = req.body.roomName;\n    const participantName = req.body.participantName;\n\n    if (!roomName || !participantName) {\n        res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n        return;\n    }\n\n    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {\n        identity: participantName\n    });\n    at.addGrant({ roomJoin: true, room: roomName, roomRecord: true }); // (1)!\n    const token = await at.toJwt();\n    res.json({ token });\n});\n
                                                                                                                                                                                                    1. Add the roomRecord permission to the access token.

                                                                                                                                                                                                    Now let's explore the code for each recording feature:

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#start-recording","title":"Start recording","text":"

                                                                                                                                                                                                    The POST /recordings/start endpoint starts the recording of a room. It receives the room name of the room to record as parameter and returns the recording metadata:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/recordings/start\", async (req, res) => {\n    const { roomName } = req.body;\n\n    if (!roomName) {\n        res.status(400).json({ errorMessage: \"roomName is required\" });\n        return;\n    }\n\n    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!\n\n    // Check if there is already an active recording for this room\n    if (activeRecording) {\n        res.status(409).json({ errorMessage: \"Recording already started for this room\" }); // (2)!\n        return;\n    }\n\n    // Use the EncodedFileOutput to save the recording to an MP4 file\n    // (3)!\n    const fileOutput = new EncodedFileOutput({\n        fileType: EncodedFileType.MP4, // (4)!\n        filepath: `${RECORDINGS_PATH}{room_name}-{room_id}-{time}` // (5)!\n    });\n\n    try {\n        // Start a RoomCompositeEgress to record all participants in the room\n        const egressInfo = await egressClient.startRoomCompositeEgress(roomName, { file: fileOutput }); // (6)!\n        const recording = {\n            name: egressInfo.fileResults[0].filename.split(\"/\").pop(), // (7)!\n            startedAt: Number(egressInfo.startedAt) / 1_000_000\n        };\n        res.json({ message: \"Recording started\", recording }); // (8)!\n    } catch (error) {\n        console.error(\"Error starting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error starting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. If there is already an active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    3. Use the EncodedFileOutput class to export the recording to an external file.
                                                                                                                                                                                                    4. Define the file type as MP4.
                                                                                                                                                                                                    5. Define the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID and timestamp, respectively. Check out all available filename templates.
                                                                                                                                                                                                    6. Start a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with the roomName and fileOutput as parameters.
                                                                                                                                                                                                    7. Extract the recording name from the fileResults array.
                                                                                                                                                                                                    8. Return the recording metadata to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. Check if there is already an active recording for the room. If there is, it returns a 409 error to prevent starting a new recording. To accomplish this, we use the getActiveRecordingByRoom function, which lists all active egresses for a specified room by calling the listEgress method of the EgressClient with the roomName and active parameters, and then returns the egress ID of the first active egress found:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getActiveRecordingByRoom = async (roomName) => {\n    try {\n        // List all active egresses for the room\n        const egresses = await egressClient.listEgress({ roomName, active: true });\n        return egresses.length > 0 ? egresses[0].egressId : null;\n    } catch (error) {\n        console.error(\"Error listing egresses.\", error);\n        return null;\n    }\n};\n
                                                                                                                                                                                                    3. Initializes an EncodedFileOutput object to export the recording to an external file. It sets the file type as MP4 and defines the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID, and timestamp, respectively. Check out all available filename templates.

                                                                                                                                                                                                      Saving recording metadata

                                                                                                                                                                                                      The EncodedFileOutput class allows you to save the recording metadata to an external file. If you don't explicitly set the disableManifest property to true, the metadata will be saved in the same folder and with the same name as the recording file, but with a .json extension. This metadata file will contain information such as the egress ID, the recording start time, and the name and ID of the room recorded.

                                                                                                                                                                                                      This information may be insufficient depending on your requirements (e.g., you can't get the recording duration). If this is the case, you can follow the steps described in the advanced recording tutorial, where we show how to save all necessary metadata in a separate file listening to webhook events.

                                                                                                                                                                                                    4. Starts a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with roomName and fileOutput as parameters.

                                                                                                                                                                                                    5. Extracts the recording name from the fileResults array.
                                                                                                                                                                                                    6. Returns the recording metadata to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#stop-recording","title":"Stop recording","text":"

                                                                                                                                                                                                    The POST /recordings/stop endpoint stops the recording of a room. It receives the room name of the room to stop recording as a parameter and returns the updated recording metadata:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/recordings/stop\", async (req, res) => {\n    const { roomName } = req.body;\n\n    if (!roomName) {\n        res.status(400).json({ errorMessage: \"roomName is required\" });\n        return;\n    }\n\n    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!\n\n    // Check if there is an active recording for this room\n    if (!activeRecording) {\n        res.status(409).json({ errorMessage: \"Recording not started for this room\" }); // (2)!\n        return;\n    }\n\n    try {\n        // Stop the egress to finish the recording\n        const egressInfo = await egressClient.stopEgress(activeRecording); // (3)!\n        const file = egressInfo.fileResults[0];\n        const recording = {\n            name: file.filename.split(\"/\").pop(),\n            startedAt: Number(egressInfo.startedAt) / 1_000_000,\n            size: Number(file.size)\n        };\n        res.json({ message: \"Recording stopped\", recording }); // (4)!\n    } catch (error) {\n        console.error(\"Error stopping recording.\", error);\n        res.status(500).json({ errorMessage: \"Error stopping recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. If there is no active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    3. Stop the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    4. Return the updated recording metadata to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. Retrieves all active egresses for the room. If there is no active egress for the room, it returns a 409 error to prevent stopping a non-existent recording.
                                                                                                                                                                                                    3. Extracts the egressId from the active egress.
                                                                                                                                                                                                    4. Stops the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    5. Returns the updated recording metadata to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#list-recordings","title":"List recordings","text":"

                                                                                                                                                                                                    The GET /recordings endpoint lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get(\"/recordings\", async (req, res) => {\n    const roomName = req.query.roomName?.toString();\n    const roomId = req.query.roomId?.toString();\n\n    try {\n        const keyStart = RECORDINGS_PATH + (roomName ? `${roomName}-` + (roomId ? roomId : \"\") : \"\"); // (1)!\n        const keyEnd = \".mp4.json\";\n        const regex = new RegExp(`^${keyStart}.*${keyEnd}$`); // (2)!\n\n        // List all egress metadata files in the recordings path that match the regex\n        const payloadKeys = await s3Service.listObjects(RECORDINGS_PATH, regex); // (3)!\n        const recordings = await Promise.all(payloadKeys.map((payloadKey) => getRecordingInfo(payloadKey))); // (4)!\n        const sortedRecordings = filterAndSortRecordings(recordings, roomName, roomId); // (5)!\n        res.json({ recordings: sortedRecordings }); // (6)!\n    } catch (error) {\n        console.error(\"Error listing recordings.\", error);\n        res.status(500).json({ errorMessage: \"Error listing recordings\" });\n    }\n});\n
                                                                                                                                                                                                    1. Define the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    2. Create a regex pattern with the start and end of the key.
                                                                                                                                                                                                    3. List all Egress metadata files in the recordings path in the S3 bucket that match the regex.
                                                                                                                                                                                                    4. Retrieve the recording metadata for each recording that matches the regex.
                                                                                                                                                                                                    5. Filter the recordings by room name and room ID and sort them by start time.
                                                                                                                                                                                                    6. Return the list of recordings to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the roomName and roomId query parameters from the request.
                                                                                                                                                                                                    2. Defines the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    3. Creates a regex pattern with the start and end of the key.
                                                                                                                                                                                                    4. Lists all Egress metadata files in the recordings path in the S3 bucket that match the regex. To accomplish this, we use the listObjects method of the S3Service with the RECORDINGS_PATH and regex as parameters.
                                                                                                                                                                                                    5. Retrieves the recording metadata for each recording that matches the regex. To accomplish this, we use the getRecordingInfo function, which retrieves the egress metadata file as JSON and the recording file size by calling the getObjectAsJson and getObjectSize methods of the S3Service, respectively. It then extracts the recording name from the recording key and returns the recording metadata:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingInfo = async (payloadKey) => {\n    // Get the egress metadata file as JSON\n    const data = await s3Service.getObjectAsJson(payloadKey); // (1)!\n\n    // Get the recording file size\n    const recordingKey = payloadKey.replace(\".json\", \"\");\n    const size = await s3Service.getObjectSize(recordingKey); // (2)!\n\n    const recordingName = recordingKey.split(\"/\").pop();\n    const recording = {\n        id: data.egress_id,\n        name: recordingName,\n        roomName: data.room_name,\n        roomId: data.room_id,\n        startedAt: Number(data.started_at) / 1000000,\n        size: size\n    };\n    return recording;\n};\n
                                                                                                                                                                                                      1. Get the egress metadata file as JSON.
                                                                                                                                                                                                      2. Get the recording file size.
                                                                                                                                                                                                    6. Filter the recordings by room name and room ID and sort them by start time. To accomplish this, we use the filterAndSortRecordings function:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const filterAndSortRecordings = (recordings, roomName, roomId) => {\n    let filteredRecordings = recordings;\n\n    if (roomName || roomId) {\n        filteredRecordings = recordings.filter((recording) => {\n            return (!roomName || recording.roomName === roomName) && (!roomId || recording.roomId === roomId); // (1)!\n        });\n    }\n\n    return filteredRecordings.sort((a, b) => b.startedAt - a.startedAt); // (2)!\n};\n
                                                                                                                                                                                                      1. Filter the recordings by room name and room ID if they are provided.
                                                                                                                                                                                                      2. Sort the recordings by start time in descending order.
                                                                                                                                                                                                    7. Returns the list of recordings to the client.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#get-recording","title":"Get recording","text":"

                                                                                                                                                                                                    The GET /recordings/:recordingName endpoint retrieves a specific portion of a recording from the S3 bucket and returns it as a stream. The server sends the recording file in portions of 5 MB each time the client requests a range of the recording file. This is done to prevent loading the entire recording file into memory and to allow the client to play the recording while it is being downloaded and seek to a specific time:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get(\"/recordings/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const { range } = req.headers;\n    const key = RECORDINGS_PATH + recordingName;\n    const exists = await s3Service.exists(key); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        // Get the recording file from S3\n        const { stream, size, start, end } = await getRecordingStream(recordingName, range); // (2)!\n\n        // Set the response headers\n        res.status(206); // (3)!\n        res.setHeader(\"Cache-Control\", \"no-cache\"); // (4)!\n        res.setHeader(\"Content-Type\", \"video/mp4\"); // (5)!\n        res.setHeader(\"Accept-Ranges\", \"bytes\"); // (6)!\n        res.setHeader(\"Content-Range\", `bytes ${start}-${end}/${size}`); // (7)!\n        res.setHeader(\"Content-Length\", end - start + 1); // (8)!\n\n        // Pipe the recording file to the response\n        body.pipe(res).on(\"finish\", () => res.end()); // (9)!\n    } catch (error) {\n        console.error(\"Error getting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error getting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. Get the recording file from the S3 bucket.
                                                                                                                                                                                                    3. Set the response status code to 206 Partial Content.
                                                                                                                                                                                                    4. Set the Cache-Control header as no-cache.
                                                                                                                                                                                                    5. Set the Content-Type header as video/mp4.
                                                                                                                                                                                                    6. Set the Accept-Ranges header as bytes.
                                                                                                                                                                                                    7. Set the Content-Range header with the start and end of the recording file and its size.
                                                                                                                                                                                                    8. Set the Content-Length header as the size of the recording file portion.
                                                                                                                                                                                                    9. Pipe the recording file to the response.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. Gets the requested range of the recording file by calling the getRecordingStream function:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingStream = async (recordingName, range) => {\n    const key = RECORDINGS_PATH + recordingName;\n    const size = await s3Service.getObjectSize(key); // (1)!\n\n    // Get the requested range\n    const parts = range?.replace(/bytes=/, \"\").split(\"-\");\n    const start = range ? parseInt(parts[0], 10) : 0; // (2)!\n    const endRange = parts[1] ? parseInt(parts[1], 10) : start + RECORDING_FILE_PORTION_SIZE; // (3)!\n    const end = Math.min(endRange, size - 1); // (4)!\n\n    const stream = await s3Service.getObject(key, { start, end }); // (5)!\n    return { stream, size, start, end };\n};\n
                                                                                                                                                                                                      1. Get the size of the recording file.
                                                                                                                                                                                                      2. Get the start of the requested range.
                                                                                                                                                                                                      3. Get the end of the requested range or set it to the start plus the established portion size.
                                                                                                                                                                                                      4. Get the minimum between the end of the requested range and the size of the recording file minus one.
                                                                                                                                                                                                      5. Get the recording file from the S3 bucket with the requested range.

                                                                                                                                                                                                      This function does the following:

                                                                                                                                                                                                      1. Gets the size of the recording file by calling the getObjectSize method of the S3Service with the key as a parameter.
                                                                                                                                                                                                      2. Extracts the start of the requested range from the range header.
                                                                                                                                                                                                      3. Extracts the end of the requested range from the range header. If the end is not provided, it sets the end to the start plus the established portion size.
                                                                                                                                                                                                      4. Gets the minimum between the end of the requested range and the size of the recording file minus one. This is done to prevent requesting a range that exceeds the recording file size.
                                                                                                                                                                                                      5. Gets the recording file from the S3 bucket with the requested range by calling the getObject method of the S3Service with the key and range as parameters.
                                                                                                                                                                                                    4. Sets the response headers:

                                                                                                                                                                                                      • Cache-Control: no-cache.
                                                                                                                                                                                                      • Content-Type: video/mp4.
                                                                                                                                                                                                      • Accept-Ranges: bytes.
                                                                                                                                                                                                      • Content-Range: The start and end of the recording file and its size.
                                                                                                                                                                                                      • Content-Length: The size of the recording file portion.
                                                                                                                                                                                                    5. Pipes the recording file to the response.

                                                                                                                                                                                                    Direct access to S3 bucket

                                                                                                                                                                                                    With this approach, the backend acts as a proxy between the client and S3, which may result in increased server resource usage. To avoid this, it is more efficient to provide the client with a presigned URL, allowing direct access to the recording files from the S3 bucket. In the advanced recording tutorial, we show how to implement this method, along with a discussion of its advantages and disadvantages.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#delete-recording","title":"Delete recording","text":"

                                                                                                                                                                                                    The DELETE /recordings/:recordingName endpoint deletes a recording from the S3 bucket:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.delete(\"/recordings/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const key = RECORDINGS_PATH + recordingName;\n    const exists = await s3Service.exists(key); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        // Delete the recording file and metadata file from S3\n        await Promise.all([s3Service.deleteObject(key), s3Service.deleteObject(`${key}.json`)]); // (2)!\n        res.json({ message: \"Recording deleted\" });\n    } catch (error) {\n        console.error(\"Error deleting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error deleting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. Delete the recording file and metadata file from the S3 bucket.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. Deletes the recording file and metadata file from the S3 bucket by calling the deleteObject method of the S3Service with the key and ${key}.json as a parameter, respectively.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#s3-service","title":"S3 service","text":"

                                                                                                                                                                                                    Finally, let's take a look at the s3.service.js file, which encapsulates the operations to interact with the S3 bucket:

                                                                                                                                                                                                    s3.service.js
                                                                                                                                                                                                    // S3 configuration\nconst S3_ENDPOINT = process.env.S3_ENDPOINT || \"http://localhost:9000\"; // (1)!\nconst S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || \"minioadmin\"; // (2)!\nconst S3_SECRET_KEY = process.env.S3_SECRET_KEY || \"minioadmin\"; // (3)!\nconst AWS_REGION = process.env.AWS_REGION || \"us-east-1\"; // (4)!\nconst S3_BUCKET = process.env.S3_BUCKET || \"openvidu\"; // (5)!\n\nexport class S3Service {\n    static instance;\n\n    constructor() {\n        if (S3Service.instance) {\n            return S3Service.instance;\n        }\n        // (6)!\n        this.s3Client = new S3Client({\n            endpoint: S3_ENDPOINT,\n            credentials: {\n                accessKeyId: S3_ACCESS_KEY,\n                secretAccessKey: S3_SECRET_KEY\n            },\n            region: AWS_REGION,\n            forcePathStyle: true\n        });\n\n        S3Service.instance = this;\n        return this;\n    }\n    // (7)!\n    async exists(key) {\n        try {\n            await this.headObject(key);\n            return true;\n        } catch (error) {\n            return false;\n        }\n    }\n    // (8)!\n    async headObject(key) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key\n        };\n        const command = new HeadObjectCommand(params);\n        return this.run(command);\n    }\n    // (9)!\n    async getObjectSize(key) {\n        const { ContentLength: size } = await this.headObject(key);\n        return size;\n    }\n    // (10)!\n    async getObject(key, range) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key,\n            Range: range ? `bytes=${range.start}-${range.end}` : undefined\n        };\n        const command = new GetObjectCommand(params);\n        const { Body: body } = await this.run(command);\n        return body;\n    }\n    // (11)!\n    async getObjectAsJson(key) {\n        const body = await this.getObject(key);\n        const stringifiedData = await body.transformToString();\n        return JSON.parse(stringifiedData);\n    }\n    // (12)!\n    async listObjects(prefix, regex) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Prefix: prefix\n        };\n        const command = new ListObjectsV2Command(params);\n        const { Contents: objects } = await this.run(command);\n\n        // Filter objects by regex and return the keys\n        return objects?.filter((object) => regex.test(object.Key)).map((payload) => payload.Key) ?? [];\n    }\n    // (13)!\n    async deleteObject(key) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key\n        };\n        const command = new DeleteObjectCommand(params);\n        return this.run(command);\n    }\n    // (14)!\n    async run(command) {\n        return this.s3Client.send(command);\n    }\n}\n
                                                                                                                                                                                                    1. The URL of the S3 server.
                                                                                                                                                                                                    2. The access key of the S3 server.
                                                                                                                                                                                                    3. The secret key of the S3 server.
                                                                                                                                                                                                    4. The AWS region of the S3 server.
                                                                                                                                                                                                    5. The name of the S3 bucket.
                                                                                                                                                                                                    6. Initialize the S3Client with the provided configuration.
                                                                                                                                                                                                    7. Check if an object exists in the S3 bucket.
                                                                                                                                                                                                    8. Retrieve the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    9. Retrieve the size of an object in the S3 bucket.
                                                                                                                                                                                                    10. Retrieve a specified range of bytes from an object in the S3 bucket.
                                                                                                                                                                                                    11. Retrieve an object from the S3 bucket as JSON.
                                                                                                                                                                                                    12. List objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    13. Delete an object from the S3 bucket.
                                                                                                                                                                                                    14. Execute an S3 command.

                                                                                                                                                                                                    This file loads environment variables for the S3 configuration:

                                                                                                                                                                                                    • S3_ENDPOINT: The URL of the S3 server.
                                                                                                                                                                                                    • S3_ACCESS_KEY: The access key of the S3 server.
                                                                                                                                                                                                    • S3_SECRET_KEY: The secret key of the S3 server.
                                                                                                                                                                                                    • AWS_REGION: The AWS region of the S3 server.
                                                                                                                                                                                                    • S3_BUCKET: The name of the S3 bucket.

                                                                                                                                                                                                    Then, it defines the S3Service class as a singleton, which initializes the S3Client with the provided configuration. The class encapsulates the following methods to interact with the S3 bucket:

                                                                                                                                                                                                    • exists: Checks if an object exists in the S3 bucket.
                                                                                                                                                                                                    • headObject: Retrieves the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    • getObjectSize: Retrieves the size of an object in the S3 bucket.
                                                                                                                                                                                                    • getObject: Retrieves an object from the S3 bucket.
                                                                                                                                                                                                    • getObjectAsJson: Retrieves an object from the S3 bucket as JSON.
                                                                                                                                                                                                    • listObjects: Lists objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    • deleteObject: Deletes an object from the S3 bucket.
                                                                                                                                                                                                    • run: Executes an S3 command.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#frontend","title":"Frontend","text":"

                                                                                                                                                                                                    The client application extends the JavaScript client tutorial by adding recording features, introducing new buttons to facilitate actions such as starting and stopping recording a room, as well as listing, playing and deleting recordings. When these newly introduced buttons are interacted with, the client triggers requests to the REST API endpoints of the server application.

                                                                                                                                                                                                    In order to update the user interface of all participants in the room according to the recording status, the client application subscribes to the RoomEvent.RecordingStatusChanged event, which is triggered when the room changes from being recorded to not being recorded, and vice versa. When this event is triggered, the updateRecordingInfo function is called to update the recording information of the room displayed on the screen. This function is also called when a participant joins the room, using the current value of the room.recording property at that moment. This is done in the joinRoom function of the app.js file:

                                                                                                                                                                                                    Limitations of the RoomEvent.RecordingStatusChanged event

                                                                                                                                                                                                    By using the RoomEvent.RecordingStatusChanged event, we can only detect when the recording has started or stopped, but not other states like starting, stopping or failed. Additionally, when the recording stops, the event is not triggered until the recorder participant leaves the room, causing a delay of 20 seconds approximately between the stop and when participants are notified.

                                                                                                                                                                                                    To overcome these limitations, you can follow the steps described in the advanced recording tutorial, where we implement a custom notification system. This system informs participants about the recording status by listening to webhook events and updating room metadata.

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new LivekitClient.Room();\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    // When recording status changes...\n    room.on(LivekitClient.RoomEvent.RecordingStatusChanged, async (isRecording) => {\n        await updateRecordingInfo(isRecording);\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value;\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName);\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token);\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName;\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone();\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n\n        // Update recording info\n        await updateRecordingInfo(room.isRecording);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n        await leaveRoom();\n    }\n}\n

                                                                                                                                                                                                    The updateRecordingInfo function updates the recording information of the room by changing the recording button's text and color according to the recording status. It also shows or hides the alert message that informs the user that the room is being recorded. Finally, it updates the recording list by calling the listRecordings function.

                                                                                                                                                                                                    This function retrieves all recordings available for the room from the backend and displays their relevant information by invoking the showRecordingList function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function showRecordingList(recordings) {\n    const recordingsList = document.getElementById(\"recording-list\");\n\n    if (recordings.length === 0) {\n        recordingsList.innerHTML = \"<span>There are no recordings available</span>\";\n    } else {\n        recordingsList.innerHTML = \"\";\n    }\n\n    recordings.forEach((recording) => {\n        const recordingName = recording.name;\n        const recordingSize = formatBytes(recording.size ?? 0);\n        const recordingDate = new Date(recording.startedAt).toLocaleString();\n\n        const recordingContainer = document.createElement(\"div\");\n        recordingContainer.className = \"recording-container\";\n        recordingContainer.id = recordingName;\n\n        recordingContainer.innerHTML = `\n            <i class=\"fa-solid fa-file-video\"></i>\n            <div class=\"recording-info\">\n                <p class=\"recording-name\">${recordingName}</p>\n                <p class=\"recording-size\">${recordingSize}</p>\n                <p class=\"recording-date\">${recordingDate}</p>\n            </div>\n            <div class=\"recording-actions\">\n                <button title=\"Play\" class=\"icon-button\" onclick=\"displayRecording('${recordingName}')\">\n                    <i class=\"fa-solid fa-play\"></i>\n                </button>\n                <button title=\"Delete\" class=\"icon-button delete-button\" onclick=\"deleteRecording('${recordingName}')\">\n                    <i class=\"fa-solid fa-trash\"></i>\n                </button>\n            </div>\n        `;\n\n        recordingsList.append(recordingContainer);\n    });\n}\n

                                                                                                                                                                                                    The showRecordingList function creates a new div element for each recording available in the room and appends it to the recording-list container. Each div element contains the recording name, size, and start date, as well as buttons to play and delete the recording.

                                                                                                                                                                                                    Recording deletion

                                                                                                                                                                                                    When a recording is deleted, it is removed from the recording list, but only for the user who initiated the deletion. Other users will continue to see the recording in their list until it is refreshed.

                                                                                                                                                                                                    In the advanced recording tutorial, we show how to implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.

                                                                                                                                                                                                    When the user clicks the play button, the displayRecording function is called to play the recording. This function opens a dialog window with an embedded video element and sets the source of the video to the get recording endpoint of the server application:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function displayRecording(recordingName) {\n    const recordingVideoDialog = document.getElementById(\"recording-video-dialog\");\n    recordingVideoDialog.showModal();\n    const recordingVideo = document.getElementById(\"recording-video\");\n    recordingVideo.src = `/recordings/${recordingName}`;\n}\n
                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    <dialog id=\"recording-video-dialog\">\n    <video id=\"recording-video\" autoplay controls></video>\n    <button class=\"btn btn-secondary\" id=\"close-recording-video-dialog\" onclick=\"closeRecording()\">Close</button>\n</dialog>\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/advanced-features/recording-basic/#general-recording-page","title":"General recording page","text":"

                                                                                                                                                                                                    The recordings.html file defines the HTML for the general recording page. This page lists all available recordings from all rooms and allows the user to filter them by room name. It also provides buttons to play and delete each recording.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/","title":"Angular Components Tutorials","text":"Angular Components

                                                                                                                                                                                                    In the following tutorials you can learn how to use each one of the available Angular Components to build your application UI tailored to your needs:

                                                                                                                                                                                                    • Custom UI: learn how to customize the UI, changing colors, shapes and add your branding logo.
                                                                                                                                                                                                    • Custom toolbar: learn how to replace the default toolbar with your own.
                                                                                                                                                                                                    • Toolbar buttons: learn how to add custom buttons to the toolbar.
                                                                                                                                                                                                    • Toolbar panel buttons: learn how to add custom panel buttons to the toolbar.
                                                                                                                                                                                                    • Custom layout: learn how to replace the default layout with your own.
                                                                                                                                                                                                    • Custom stream: learn how to replace the default stream with your own.
                                                                                                                                                                                                    • Custom panels: learn how to replace the default panels with your own.
                                                                                                                                                                                                    • Additional panel: learn how to add a new extra panel besides the default ones.
                                                                                                                                                                                                    • Custom chat panel: learn how to replace the default chat panel with your own.
                                                                                                                                                                                                    • Custom activities panel: learn how to replace the default activities panel with your own.
                                                                                                                                                                                                    • Custom participants panel: learn how to replace the default participants panel with your own.
                                                                                                                                                                                                    • Custom participant panel item: learn how to replace the default participants panel item with your own.
                                                                                                                                                                                                    • Custom participant panel item element: learn how to replace the default participants panel item element with your own.
                                                                                                                                                                                                    • Toggle hand: learn how to add extra features to the videoconference.
                                                                                                                                                                                                    • Admin dashboard: learn how to add an admin dashboard to the videoconference.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/","title":"Additional panels using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-additional-panels tutorial demonstrates how to add new panels to the videoconference, providing a more tailored user experience.

                                                                                                                                                                                                    Adding new videoconference panels is made simple with the AdditionalPanelsDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Additional Panel

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalPanelButtonsDirective and the AdditionalPanelsDirective to add new buttons to the toolbar and new panels to the videoconference. If you want to learn how to add new buttons to the toolbar, you can check the openvidu-toolbar-panel-buttons tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#4-run-the-openvidu-additional-panels-tutorial","title":"4. Run the openvidu-additional-panels tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-additional-panels\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Additional Toolbar Buttons -->\n      <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleMyPanel('my-panel1')\">\n          <mat-icon>360</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleMyPanel('my-panel2')\">\n          <mat-icon>star</mat-icon>\n        </button>\n      </div>\n\n      <!-- Additional Panels -->\n      <div *ovAdditionalPanels id=\"my-panels\">\n        @if (showExternalPanel) {\n        <div id=\"my-panel1\">\n          <h2>NEW PANEL 1</h2>\n          <p>This is my new additional panel</p>\n        </div>\n        } @if (showExternalPanel2) {\n        <div id=\"my-panel2\">\n          <h2>NEW PANEL 2</h2>\n          <p>This is another new panel</p>\n        </div>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-additional-panels';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Flags to control the visibility of external panels\n  showExternalPanel: boolean = false; // (5)!\n  showExternalPanel2: boolean = false; // (6)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    this.subscribeToPanelToggling(); // (7)!\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (8)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to panel toggling events\n  subscribeToPanelToggling() {\n    this.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => { // (9)!\n      this.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';\n      this.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';\n    });\n  }\n\n  // Toggle the visibility of external panels\n  toggleMyPanel(type: string) { // (10)!\n    this.panelService.togglePanel(type);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    6. showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    7. subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    8. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    9. panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    10. toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    • showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    • subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    • toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-additional-panels/#adding-new-panels","title":"Adding new panels","text":"

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            [toolbarDisplayRoomName]=\"false\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Additional Toolbar Buttons -->\n            <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n                <button mat-icon-button (click)=\"toggleMyPanel('my-panel1')\">\n                    <mat-icon>360</mat-icon>\n                </button>\n                <button mat-icon-button (click)=\"toggleMyPanel('my-panel2')\">\n                    <mat-icon>star</mat-icon>\n                </button>\n            </div>\n\n            <!-- Additional Panels -->\n            <div *ovAdditionalPanels id=\"my-panels\">\n                @if (showExternalPanel) {\n                <div id=\"my-panel1\">\n                    <h2>NEW PANEL 1</h2>\n                    <p>This is my new additional panel</p>\n                </div>\n                } @if (showExternalPanel2) {\n                <div id=\"my-panel2\">\n                    <h2>NEW PANEL 2</h2>\n                    <p>This is another new panel</p>\n                </div>\n                }\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add new buttons to the toolbar and the *ovAdditionalPanels directive is used to add new panels to the videoconference.

                                                                                                                                                                                                    When the user clicks on the buttons, the toggleMyPanel method is called to toggle the visibility of the new panels. These new panels are handled by the showExternalPanel and showExternalPanel2 flags.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/","title":"Create admin dashboard using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-admin-dashboard tutorial demonstrates how to create an admin dashboard to manage the recordings of a videoconference using the OpenVidu Components Angular library.

                                                                                                                                                                                                    OpenVidu Components - Admin Login

                                                                                                                                                                                                    OpenVidu Components - Admin Dashboard"},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#4-run-the-openvidu-admin-dashboard-tutorial","title":"4. Run the openvidu-admin-dashboard tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-admin-dashboard\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-admin-dashboard/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-admin-login component to create a login form and the ov-admin-dashboard component to create the admin dashboard.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    @if (logged) {\n    <ov-admin-dashboard\n      [recordingsList]=\"recordings()\"\n      (onLogoutRequested)=\"onLogoutRequested()\"\n      (onRefreshRecordingsRequested)=\"onRefreshRecordingsRequested()\"\n      (onLoadMoreRecordingsRequested)=\"onLoadMoreRecordingsRequested()\"\n      (onRecordingDeleteRequested)=\"onRecordingDeleteRequested($event)\"\n    ></ov-admin-dashboard>\n    } @else {\n    <ov-admin-login (onLoginRequested)=\"onLoginRequested($event)\">\n    </ov-admin-login>\n    }\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n\n  roomName = 'openvidu-admin-dashboard'; // (1)!\n\n  logged: boolean = false; // (2)!\n\n  // Recordings list to show in the dashboard\n  // This is a dummy list, you should replace it with your own list from the server\n  recordings: WritableSignal<RecordingInfo[]> = signal([ // (3)!\n    {\n      id: 'recording1',\n      roomName: this.roomName,\n      roomId: 'roomId1',\n      outputMode: RecordingOutputMode.COMPOSED,\n      status: RecordingStatus.READY,\n      filename: 'sampleRecording.mp4',\n      startedAt: new Date().getTime(),\n      endedAt: new Date().getTime(),\n      duration: 0,\n      size: 100,\n      location: 'http://localhost:8080/recordings/recording1',\n    }\n  ]);\n\n  constructor() {}\n\n  onLoginRequested(credentials: { username: string; password: string }) { // (4)!\n    console.log(`Login button clicked ${credentials}`);\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    this.logged = true;\n  }\n\n  onLogoutRequested() { // (5)!\n    console.log('Logout button clicked');\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    this.logged = false;\n  }\n\n  onRefreshRecordingsRequested() { // (6)!\n    console.log('Refresh recording clicked');\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    // Getting the recordings from the server\n    this.recordings.update(() => [\n      {\n        id: 'recording1',\n        roomName: this.title,\n        roomId: 'roomId1',\n        outputMode: RecordingOutputMode.COMPOSED,\n        status: RecordingStatus.READY,\n        filename: 'sampleRecording1.mp4',\n        startedAt: new Date().getTime(),\n        endedAt: new Date().getTime(),\n        duration: 0,\n        size: 100,\n        location: 'http://localhost:8080/recordings/recording1',\n      },\n    ]);\n  }\n\n  onLoadMoreRecordingsRequested() { // (7)!\n    console.log('Load more recordings clicked');\n  }\n\n  onRecordingDeleteRequested(recording: RecordingDeleteRequestedEvent) { // (8)!\n    console.log(`Delete recording clicked ${recording.recordingId}`);\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    // Deleting the recording from the server\n    this.recordings.update((recordings) =>\n      recordings.filter((rec) => rec.id !== recording.recordingId)\n    );\n\n    console.log(this.recordings());\n  }\n}\n
                                                                                                                                                                                                    1. roomName: OpenVidu Room name.
                                                                                                                                                                                                    2. logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    3. recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    4. onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    5. onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    6. onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    7. onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    8. onRecordingDeleteRequested method that fires when the delete recording button is clicked.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • roomName: OpenVidu Room name.
                                                                                                                                                                                                    • logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    • recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    • onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    • onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    • onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    • onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    • onRecordingDeleteRequested method that fires when the delete recording button is clicked.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/","title":"Custom activities panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-activities-panel tutorial demonstrates how to customize the activities panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default activities panel is made simple with the ActivitiesPanelDirective, which offers a straightforward way to replace and adapt the ActivitiesPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Activities Panel"},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#4-run-the-openvidu-custom-activities-panel-tutorial","title":"4. Run the openvidu-custom-activities-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-activities-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n        <!-- Custom activities panel -->\n        <div *ovActivitiesPanel id=\"my-panel\">\n            <h3>ACTIVITIES</h3>\n            <div>CUSTOM ACTIVITIES</div>\n        </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-activities-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-activities-panel/#customizing-chat-panel","title":"Customizing chat panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovActivitiesPanel directive with the aim of replacing the default activities panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom activities panel -->\n            <div *ovActivitiesPanel id=\"my-panel\">\n                <h3>ACTIVITIES</h3>\n                <div>CUSTOM ACTIVITIES</div>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/","title":"Custom chat panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-chat-panel tutorial demonstrates how to customize the chat panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default chat panel is made simple with the ChatPanelDirective, which offers a straightforward way to replace and adapt the ChatPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Chat Panel"},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#4-run-the-openvidu-custom-chat-panel-tutorial","title":"4. Run the openvidu-custom-chat-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-chat-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  DataPacket_Kind,\n  DataPublishOptions,\n  DataTopic,\n  ParticipantService,\n  RemoteParticipant,\n  Room,\n  RoomEvent,\n  OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      [toolbarDisplayRoomName]=\"false\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n      (onRoomCreated)=\"onRoomCreated($event)\"\n    >\n      <!-- Chat Panel -->\n      <div *ovChatPanel id=\"my-panel\">\n        <h3>Chat</h3>\n        <div>\n          <ul>\n            @for (msg of messages; track msg) {\n            <li>{{ msg }}</li>\n            }\n          </ul>\n        </div>\n        <input value=\"Hello\" #input />\n        <button (click)=\"send(input.value)\">Send</button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-chat-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  messages: string[] = []; // (5)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (6)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  /**\n   * Handles the creation of a new room and sets up an event listener for receiving data.\n   *\n   * @param room - The Room object that was created.\n   */\n  onRoomCreated(room: Room) { // (7)!\n    // Set up an event listener for the RoomEvent.DataReceived event.\n    room.on(RoomEvent.DataReceived, ( // (8)!\n      payload: Uint8Array,\n      participant?: RemoteParticipant,\n      _?: DataPacket_Kind,\n      topic?: string\n    ) => {\n      // Check if the received data topic is related to chat messages.\n      if (topic === DataTopic.CHAT) {\n        // Decode the payload from Uint8Array to a string and parse it as JSON.\n        const { message } = JSON.parse(new TextDecoder().decode(payload));\n\n        // Get the participant's name or default to 'Unknown' if not available.\n        const participantName = participant?.name || 'Unknown';\n\n        // Add the received message to the messages array.\n        this.messages.push(message);\n\n        // Log the received message and the participant's name to the console.\n        console.log(`Message received from ${participantName}:`, message);\n      }\n    });\n  }\n\n  // Function to send a chat message\n  async send(message: string): Promise<void> { // (9)!\n    const strData = JSON.stringify({ message });\n    const data: Uint8Array = new TextEncoder().encode(strData);\n    const options: DataPublishOptions = { topic: DataTopic.CHAT };\n    await this.participantService.publishData(data, options);\n    this.messages.push(message);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (10)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. messages array that stores the chat messages.
                                                                                                                                                                                                    6. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    7. onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    8. Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    9. send method that sends a chat message.
                                                                                                                                                                                                    10. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • messages array that stores the chat messages.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    • Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    • send method that sends a chat message.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-chat-panel/#customizing-chat-panel","title":"Customizing chat panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovChatPanel directive with the aim of replacing the default chat panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n            (onRoomCreated)=\"onRoomCreated($event)\"\n        >\n            <!-- Chat Panel -->\n            <div *ovChatPanel id=\"my-panel\">\n                <h3>Chat</h3>\n                <div>\n                    <ul>\n                        @for (msg of messages; track msg) {\n                        <li>{{ msg }}</li>\n                        }\n                    </ul>\n                </div>\n                <input value=\"Hello\" #input />\n                <button (click)=\"send(input.value)\">Send</button>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/","title":"Custom layout using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-layout tutorial demonstrates how to replace the default layout of the OpenVidu Components Angular library with a custom layout.

                                                                                                                                                                                                    Replacing the default layout is made simple with the LayoutDirective, which offers a straightforward way to customize the LayoutComponent.

                                                                                                                                                                                                    OpenVidu Components - Custom Layout"},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#4-run-the-openvidu-custom-layout-tutorial","title":"4. Run the openvidu-custom-layout tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-layout\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantModel, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Custom Layout for Video Streams -->\n        <div *ovLayout>\n          <div class=\"container\">\n            <!-- Local Participant's Tracks -->\n            @for (track of localParticipant.tracks; track track) {\n            <div\n              class=\"item\"\n              [ngClass]=\"{\n                hidden:\n                  track.isAudioTrack && !track.participant.onlyHasAudioTracks\n              }\"\n            >\n              <ov-stream [track]=\"track\"></ov-stream>\n            </div>\n            }\n\n            <!-- Remote Participants' Tracks -->\n            @for (track of remoteParticipants | tracks; track track) {\n            <div\n              class=\"item\"\n              [ngClass]=\"{\n                hidden:\n                  track.isAudioTrack && !track.participant.onlyHasAudioTracks\n              }\"\n            >\n              <ov-stream [track]=\"track\"></ov-stream>\n            </div>\n            }\n          </div>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: `\n    /* css styles */\n  `,\n  standalone: true,\n    imports: [OpenViduComponentsModule, NgClass],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-layout';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Participant-related properties\n  localParticipant!: ParticipantModel; // (5)!\n  remoteParticipants!: ParticipantModel[]; // (6)!\n  localParticipantSubs!: Subscription; // (7)!\n  remoteParticipantsSubs!: Subscription; // (8)!\n\n  constructor(private httpClient: HttpClient,   private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    // Subscribe to participants' updates\n    this.subscribeToParticipants();\n  }\n\n  ngOnDestroy() {\n    // Unsubscribe from participant updates to prevent memory leaks\n    this.localParticipantSubs?.unsubscribe();\n    this.remoteParticipantsSubs?.unsubscribe();\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (9)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to updates for local and remote participants\n  private subscribeToParticipants() { // (10)!\n    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {\n      if (p) this.localParticipant = p;\n    });\n\n    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {\n      this.remoteParticipants = participants;\n    });\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. localParticipant: Local participant model.
                                                                                                                                                                                                    6. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    7. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    8. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-layout/#adding-custom-buttons-to-the-toolbar","title":"Adding custom buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovLayout that allows you to customize the default layout of the videoconference. In this tutorial, we are creating a very basic layout just for demonstration purposes.

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom Layout for Video Streams -->\n            <div *ovLayout>\n                <div class=\"container\">\n                    <!-- Local Participant's Tracks -->\n                    @for (track of localParticipant.tracks; track track) {\n                    <div\n                        class=\"item\"\n                        [ngClass]=\"{\n                            hidden:\n                                track.isAudioTrack && !track.participant.onlyHasAudioTracks\n                        }\"\n                    >\n                        <ov-stream [track]=\"track\"></ov-stream>\n                    </div>\n                    }\n\n                    <!-- Remote Participants' Tracks -->\n                    @for (track of remoteParticipants | tracks; track track) {\n                    <div\n                        class=\"item\"\n                        [ngClass]=\"{\n                            hidden:\n                                track.isAudioTrack && !track.participant.onlyHasAudioTracks\n                        }\"\n                    >\n                        <ov-stream [track]=\"track\"></ov-stream>\n                    </div>\n                    }\n                </div>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovLayout directive is used to customize the layout of the videoconference. The layout is divided into two sections: one for the local participant's tracks and another for the remote participants' tracks.

                                                                                                                                                                                                    The repeater directive @for is used to iterate over the tracks of the local participant and the remote participants and display them in the layout using the ov-stream component.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/","title":"Custom panels using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-panels tutorial demonstrates how to replace the default panels with a custom ones, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the videoconference panels is made simple with the PanelDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Panels"},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#4-run-the-openvidu-custom-panels-tutorial","title":"4. Run the openvidu-custom-panels tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-panels\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Custom Panels -->\n        <ov-panel *ovPanel>\n          <!-- Custom Chat Panel -->\n          <div *ovChatPanel id=\"my-chat-panel\">This is my custom chat panel</div>\n\n          <!-- Custom Participants Panel -->\n          <div *ovParticipantsPanel id=\"my-participants-panel\">\n            This is my custom participants panel\n          </div>\n\n          <!-- Custom Activities Panel -->\n          <div *ovActivitiesPanel id=\"my-activities-panel\">\n            This is my custom activities panel\n          </div>\n        </ov-panel>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-panels';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-panels/#customizing-the-panels","title":"Customizing the panels","text":"

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom Panels -->\n            <ov-panel *ovPanel>\n                <!-- Custom Chat Panel -->\n                <div *ovChatPanel id=\"my-chat-panel\">This is my custom chat panel</div>\n\n                <!-- Custom Participants Panel -->\n                <div *ovParticipantsPanel id=\"my-participants-panel\">\n                    This is my custom participants panel\n                </div>\n\n                <!-- Custom Activities Panel -->\n                <div *ovActivitiesPanel id=\"my-activities-panel\">\n                    This is my custom activities panel\n                </div>\n            </ov-panel>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovPanel directive is used to replace the default videoconference panels with custom ones. The *ovChatPanel, *ovParticipantsPanel, and *ovActivitiesPanel directives are used to replace the default chat, participants, and activities panels with custom ones.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/","title":"Custom participants panel item element using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item-element tutorial demonstrates how to replace the default participant item element inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participant item element is made simple with the ParticipantsPanelItemElementsDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item Element"},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#4-run-the-openvidu-custom-participant-panel-item-element-tutorial","title":"4. Run the openvidu-custom-participant-panel-item-element tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item-element\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Participant Panel Item Elements -->\n      <div *ovParticipantPanelItemElements=\"let participant\">\n        <!-- Leave Button for Local Participant -->\n        @if (participant.isLocal) {\n        <button (click)=\"leaveSession()\">Leave</button>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participant-panel-item-element';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Function to leave the session\n  async leaveSession() { // (6)!\n    await this.openviduService.disconnectRoom();\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (7)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    7. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#customizing-participant-item-element","title":"Customizing participant item element","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Participant Panel Item Elements -->\n            <div *ovParticipantPanelItemElements=\"let participant\">\n                <!-- Leave Button for Local Participant -->\n                @if (participant.isLocal) {\n                <button (click)=\"leaveSession()\">Leave</button>\n                }\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItemElements directive is used to replace the default participant item element, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    The *ovParticipantPanelItemElements directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/","title":"Custom participants panel item using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item tutorial demonstrates how to replace the default participant item inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participant item is made simple with the ParticipantsPanelItemDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item"},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#4-run-the-openvidu-custom-participant-panel-item-tutorial","title":"4. Run the openvidu-custom-participant-panel-item tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n        <!-- Participant Panel Items -->\n        <div *ovParticipantPanelItem=\"let participant\" style=\"display: flex\">\n            <p>{{ participant.name }}</p>\n\n            <!-- More Options Menu -->\n            <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n                <mat-icon>more_vert</mat-icon>\n            </button>\n\n            <!-- Menu Content -->\n            <mat-menu #menu=\"matMenu\">\n                <button mat-menu-item>Button 1</button>\n                <button mat-menu-item>Button 2</button>\n            </mat-menu>\n        </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [\n    OpenViduComponentsModule,\n    MatIconButton,\n    MatMenuTrigger,\n    MatIcon,\n    MatMenu,\n    MatMenuItem,\n  ],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participant-panel-item';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#customizing-participant-item","title":"Customizing participant item","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Participant Panel Items -->\n            <div *ovParticipantPanelItem=\"let participant\" style=\"display: flex\">\n                <p>{{ participant.name }}</p>\n\n                <!-- More Options Menu -->\n                <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n                    <mat-icon>more_vert</mat-icon>\n                </button>\n\n                <!-- Menu Content -->\n                <mat-menu #menu=\"matMenu\">\n                    <button mat-menu-item>Button 1</button>\n                    <button mat-menu-item>Button 2</button>\n                </mat-menu>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [\n        OpenViduComponentsModule,\n        MatIconButton,\n        MatMenuTrigger,\n        MatIcon,\n        MatMenu,\n        MatMenuItem,\n    ],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItem directive is used to replace the default participant item inside of the participants panel with a custom one. The *ovParticipantPanelItem directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/","title":"Custom participants panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participants-panel tutorial demonstrates how to customize the participants panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participants panel is made simple with the ParticipantsPanelDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel"},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#4-run-the-openvidu-custom-participants-panel-tutorial","title":"4. Run the openvidu-custom-participants-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participants-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Custom Participants Panel -->\n      <div *ovParticipantsPanel id=\"my-panel\">\n        <ul id=\"local\">\n          <li>{{ localParticipant.name }}</li>\n        </ul>\n        <ul id=\"remote\">\n          @for (p of remoteParticipants; track p) {\n          <li>{{ p.name }}</li>\n          }\n        </ul>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participants-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Participant-related properties\n  localParticipant!: ParticipantModel; // (5)!\n  remoteParticipants!: ParticipantModel[]; // (6)!\n  localParticipantSubs!: Subscription; // (7)!\n  remoteParticipantsSubs!: Subscription; // (8)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    // Subscribe to participants' updates\n    this.subscribeToParticipants();\n  }\n\n  ngOnDestroy() {\n    // Unsubscribe from participant updates to prevent memory leaks\n    this.localParticipantSubs?.unsubscribe();\n    this.remoteParticipantsSubs?.unsubscribe();\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (9)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to updates for local and remote participants\n  private subscribeToParticipants() { // (10)!\n    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {\n      if (p) this.localParticipant = p;\n    });\n\n    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {\n      this.remoteParticipants = participants;\n    });\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. localParticipant: Local participant model.
                                                                                                                                                                                                    6. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    7. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    8. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-participants-panel/#customizing-participants-panel","title":"Customizing participants panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantsPanel directive with the aim of replacing the default participant panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Custom Participants Panel -->\n      <div *ovParticipantsPanel id=\"my-panel\">\n        <ul id=\"local\">\n          <li>{{ localParticipant.name }}</li>\n        </ul>\n        <ul id=\"remote\">\n          @for (p of remoteParticipants; track p) {\n          <li>{{ p.name }}</li>\n          }\n        </ul>\n      </div>\n    </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent implements OnInit, OnDestroy{\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/","title":"Custom stream using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-stream tutorial demonstrates how to replace the default video stream with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the video stream component is made simple with the StreamDirective, which offers a straightforward way to replace and adapt the StreamComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Stream"},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#4-run-the-openvidu-custom-stream-tutorial","title":"4. Run the openvidu-custom-stream tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-stream\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n        <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Display Video Streams -->\n        <div *ovStream=\"let track\">\n          <!-- Video Stream Component -->\n          <ov-stream [track]=\"track\" [displayParticipantName]=\"false\"></ov-stream>\n\n          <!-- Display Participant's Name -->\n          <p>{{ track.participant.name }}</p>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-stream';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-stream/#customizing-the-video-stream","title":"Customizing the video stream","text":"

                                                                                                                                                                                                    The *ovStream directive is used to replace the default video stream with a custom one and allows you to customize the video stream component to your needs. It provides a way to access the video stream track and the participant name.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Display Video Streams -->\n            <div *ovStream=\"let track\">\n                <!-- Video Stream Component -->\n                <ov-stream [track]=\"track\" [displayParticipantName]=\"false\"></ov-stream>\n\n                <!-- Display Participant's Name -->\n                <p>{{ track.participant.name }}</p>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovStream directive provides access to the ParticipantTrackPublication object, which contains the video stream track and the participant name.

                                                                                                                                                                                                    The track object is passed to the ov-stream component to display the video stream. The track.participant.name object is used to display the participant's name.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/","title":"Custom toolbar using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-toolbar tutorial demonstrates how to replace the default toolbar with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the toolbar is made simple with the ToolbarDirective, which offers a straightforward way to replace and adapt the ToolbarComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Toolbar"},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#4-run-the-openvidu-custom-toolbar-tutorial","title":"4. Run the openvidu-custom-toolbar tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-toolbar\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbar style=\"text-align: center;\">\n        <button (click)=\"toggleVideo()\">Toggle Video</button>\n        <button (click)=\"toggleAudio()\">Toggle Audio</button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-toolbar';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Toggles the camera on and off.\n  async toggleVideo() { // (6)!\n    const isCameraEnabled = this.participantService.isMyCameraEnabled();\n    await this.participantService.setCameraEnabled(!isCameraEnabled);\n  }\n\n  // Toggles the microphone on and off.\n  async toggleAudio() { // (7)!\n    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (8)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    7. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    8. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-toolbar/#customizing-the-toolbar","title":"Customizing the toolbar","text":"

                                                                                                                                                                                                    The *ov-toolbar directive allows you to replace the default toolbar with a custom one. This directive is applied to a div element that contains the custom toolbar elements.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbar style=\"text-align: center;\">\n        <button (click)=\"toggleVideo()\">Toggle Video</button>\n        <button (click)=\"toggleAudio()\">Toggle Audio</button>\n      </div>\n\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ov-toolbar directive is applied to a div element that contains two buttons. These buttons are used to toggle the camera and microphone on and off.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/","title":"Custom UI using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    Creating a unique and intuitive user interface (UI) is essential for ensuring a great user experience. OpenVidu Components Angular allows for flexibility in UI customization to fit your application's design requirements.

                                                                                                                                                                                                    OpenVidu Components - Custom UI"},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#4-run-the-openvidu-custom-ui-tutorial","title":"4. Run the openvidu-custom-ui tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-ui\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-ui';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#customizing-the-ui","title":"Customizing the UI","text":"

                                                                                                                                                                                                    To customize the appearance of OpenVidu Components, simply redefine the necessary CSS variables in your styles.scss file. For instance, to change the primary color used throughout your application, you would update the --ov-primary-color variable as shown below:

                                                                                                                                                                                                    :root {\n  --ov-primary-color: #yourNewColor; /* Replace #yourNewColor with your chosen hex color code */\n\n  /* Others variables ... */\n}\n
                                                                                                                                                                                                    Once you redefine a variable, the new style will automatically apply to all components in the OpenVidu UI that use that variable.

                                                                                                                                                                                                    The library also allows you to customize shape of buttons, panels and videos customization, the background color personalization of panels, buttons and videoconference and also you can change the text color.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-custom-ui/#replacing-the-branding-logo","title":"Replacing the branding logo","text":"

                                                                                                                                                                                                    You can replace the branding logo with your own. Just modify the src/assets/images/logo.png file with your own logo.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/","title":"Add toggle hand feature using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toggle-hand tutorial demonstrates how to add a toggle hand feature to the OpenVidu Components Angular library.

                                                                                                                                                                                                    The toggle hand feature allows participants to raise and lower their hand during a videoconference. This feature is useful for participants to signal that they want to speak or ask a question.

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalButtonsDirective, the StreamDirective and the ParticipantsPanelItemElementsDirective to create a custom toolbar button, a custom stream component element and a custom participant panel item element. Check the openvidu-toolbar-buttons and the openvidu-custom-stream tutorials documentation for learning more about these directives.

                                                                                                                                                                                                    OpenVidu Components - Toggle Hand"},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#4-run-the-openvidu-toggle-hand-tutorial","title":"4. Run the openvidu-toggle-hand tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toggle-hand\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toggle-hand/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    • app/models/participant-app.model.ts: Contains the ParticipantAppModel class that extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsmodels/participant-app.model.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n  ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\nenum DataTopicApp {\n  HAND_TOGGLE = 'handToggle'\n}\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [prejoin]=\"true\"\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n      (onRoomCreated)=\"handleRemoteHand($event)\"\n    >\n      <div *ovToolbarAdditionalButtons>\n        <button toolbar-btn mat-icon-button (click)=\"handleLocalHand()\" [class.active-btn]=\"hasHandRaised\">\n          <mat-icon matTooltip=\"Toggle hand\">front_hand</mat-icon>\n        </button>\n      </div>\n\n      <div *ovStream=\"let track\" style=\"height: 100%\">\n        <ov-stream [track]=\"track\"></ov-stream>\n        @if (track.participant.hasHandRaised) {\n        <mat-icon @inOutHandAnimation id=\"hand-notification\">front_hand</mat-icon>\n        }\n      </div>\n\n      <div *ovParticipantPanelItemElements=\"let participant\">\n        @if (participant.hasHandRaised) {\n        <mat-icon>front_hand</mat-icon>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon]\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toggle-hand';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Whether the local participant has raised their hand.\n  hasHandRaised: boolean = false; // (5)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (6)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Handles the reception of a remote hand-raising event.\n  handleRemoteHand(room: Room) { // (7)!\n    // Subscribe to hand toggling events from other participants\n    room.on(RoomEvent.DataReceived, (payload: Uint8Array, participant?: RemoteParticipant, _?: DataPacket_Kind, topic?: string) => { // (8)!\n      if (topic === DataTopicApp.HAND_TOGGLE) {\n        const p = this.participantService.getRemoteParticipantBySid(participant.sid); // (9)!\n        if (p) {\n          (<ParticipantAppModel>p).toggleHandRaised(); // (10)!\n        }\n        this.participantService.updateRemoteParticipants(); // (11)!\n      }\n    });\n  }\n\n  // Handles the local hand-raising event.\n  async handleLocalHand() {  // (12)!\n    // Get local participant with ParticipantService\n    const participant = <ParticipantAppModel>this.participantService.getLocalParticipant(); // (13)!\n\n    // Toggle the participant hand with the method we wil add in our ParticipantAppModel\n    participant.toggleHandRaised(); // (14)!\n\n    // Refresh the local participant object for others component and services\n    this.participantService.updateLocalParticipant(); // (15)!\n\n    // Send a signal with the new value to others participant using the openvidu-browser signal\n    const strData = JSON.stringify({});\n    const data: Uint8Array = new TextEncoder().encode(strData);\n    const options: DataPublishOptions = { topic: DataTopicApp.HAND_TOGGLE };\n\n    await this.participantService.publishData(data, options); // (16)!\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (17)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    6. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    7. handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    8. on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    9. getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    10. toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    11. updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    12. handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    13. getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    14. toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    15. updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    16. publishData method that sends a signal to other participants.
                                                                                                                                                                                                    17. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    • updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    • handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    • getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    • updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    • publishData method that sends a signal to other participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The ParticipantAppModel class extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                      import { ParticipantModel, ParticipantProperties } from 'openvidu-components-angular';\n\n  // Represents a participant in the application, with the ability to raise their hand.\n  export class ParticipantAppModel extends ParticipantModel {\n\n    // Indicates whether the participant has raised their hand.\n    hasHandRaised: boolean;\n\n    //  Creates a new instance of ParticipantAppModel.\n    constructor(props: ParticipantProperties) {\n      super(props);\n      this.hasHandRaised = false;\n    }\n\n    // Toggles the participant's hand raised status.\n    toggleHandRaised() {\n      this.hasHandRaised = !this.hasHandRaised;\n    }\n  }\n

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/","title":"Add toolbar buttons using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toolbar-buttons tutorial demonstrates how to add custom buttons to the central part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    OpenVidu Components - Toolbar Buttons"},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#4-run-the-openvidu-toolbar-buttons-tutorial","title":"4. Run the openvidu-toolbar-buttons tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-buttons\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbarAdditionalButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleVideo()\">\n          <mat-icon>videocam</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleAudio()\">\n          <mat-icon>mic</mat-icon>\n        </button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toolbar-buttons';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Toggles the camera on and off.\n  async toggleVideo() { // (6)!\n    const isCameraEnabled = this.participantService.isMyCameraEnabled();\n    await this.participantService.setCameraEnabled(!isCameraEnabled);\n  }\n\n  // Toggles the microphone on and off.\n  async toggleAudio() { // (7)!\n    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (8)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    7. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    8. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-buttons/#adding-additional-buttons-to-the-toolbar","title":"Adding additional buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalButtons that allows you to add custom buttons to the toolbar.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbarAdditionalButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleVideo()\">\n          <mat-icon>videocam</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleAudio()\">\n          <mat-icon>mic</mat-icon>\n        </button>\n      </div>\n\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalButtons directive is used to add two buttons to the toolbar. The mat-icon-button component from Angular Material is used to create the buttons. The toggleVideo and toggleAudio methods are called when the buttons are clicked.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/","title":"Add toolbar panel buttons using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toolbar-panel-buttons tutorial demonstrates how to add custom buttons to the right part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalPanelButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    OpenVidu Components - Toolbar Panel Buttons"},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#4-run-the-openvidu-toolbar-panel-buttons-tutorial","title":"4. Run the openvidu-toolbar-panel-buttons tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-panel-buttons\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        [toolbarDisplayRoomName]=\"false\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n          <button mat-icon-button (click)=\"onButtonClicked()\">\n            <mat-icon>star</mat-icon>\n          </button>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toolbar-panel-buttons';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Method to handle button click\n  onButtonClicked() { // (6)!\n    alert('button clicked');\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (7)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    7. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#adding-custom-buttons-to-the-toolbar","title":"Adding custom buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalPanelButtons that allows you to add custom buttons to the toolbar. This directive can be used to add buttons to the right part of the toolbar.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            [toolbarDisplayRoomName]=\"false\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n                <button mat-icon-button (click)=\"onButtonClicked()\">\n                    <mat-icon>star</mat-icon>\n                </button>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add a custom button to the right part of the toolbar and is displayed as a star icon, and the onButtonClicked method is called when the button is clicked.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/","title":"Application Client Tutorials","text":"

                                                                                                                                                                                                    Every application client below shares the same core functionality:

                                                                                                                                                                                                    • Users request a LiveKit token to any application server to connect to a room.
                                                                                                                                                                                                    • Users may publish their camera, microphone and screen-share.
                                                                                                                                                                                                    • Users automatically subscribe to all media published by other users.
                                                                                                                                                                                                    • Users may leave the room at any time.

                                                                                                                                                                                                    Every application client below is interchangeable with the others, because:

                                                                                                                                                                                                    • All of them are compatible with each other, meaning that participants are able to join the same LiveKit room from any of the client applications.
                                                                                                                                                                                                    • All of them are compatible with any application server, meaning that they can request a LiveKit token from any of the server applications.

                                                                                                                                                                                                    JavaScript

                                                                                                                                                                                                    React

                                                                                                                                                                                                    Angular

                                                                                                                                                                                                    Vue

                                                                                                                                                                                                    Electron

                                                                                                                                                                                                    Ionic

                                                                                                                                                                                                    Android

                                                                                                                                                                                                    iOS

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/","title":"Android Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built for Android, using Kotlin, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit Android Kotlin SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/android/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Android project has been generated with Android Studio. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the app/src/main/java directory:

                                                                                                                                                                                                    • MainActivity.kt: This file defines the main activity of the application, which allows the user to join a video call room by providing a room name and a user name.
                                                                                                                                                                                                    • RoomLayoutActivity.kt: Activity responsible for managing the video call room, including publishing and subscribing to video and audio tracks.
                                                                                                                                                                                                    • PaticipantAdapter.kt and ParticipantViewHolder.kt: These files define the Adapter and ViewHolder for the RecyclerView that displays the participants video tracks in the video call room.
                                                                                                                                                                                                    • Urls.kt: Object that contains the URLs of the application server and the LiveKit server.
                                                                                                                                                                                                    • ConfigureUrlsActivity.kt: Activity that allows the user to configure the URLs of the application server and the LiveKit server.

                                                                                                                                                                                                    The activity layout files are located in the app/src/main/res/layout directory.

                                                                                                                                                                                                    To use LiveKit in an Android application, you need to add the LiveKit Android Kotlin SDK as a dependency in the build.gradle.kts file. This dependecy provides the necessary classes and methods to interact with the LiveKit server:

                                                                                                                                                                                                    build.gradle.kts
                                                                                                                                                                                                    dependencies {\n    implementation 'io.livekit:livekit-android:2.5.0'\n}\n

                                                                                                                                                                                                    You will also need JitPack as a repository in the settings.gradle.kts file:

                                                                                                                                                                                                    settings.gradle.kts
                                                                                                                                                                                                    dependencyResolutionManagement {\n    //...\n    repositories {\n        google()\n        mavenCentral()\n        maven(\"https://jitpack.io\")\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#android-specific-requirements","title":"Android specific requirements","text":"

                                                                                                                                                                                                    In order to be able to test the application on an Android device, the application must ask for the necessary permissions to access the device's camera and microphone.

                                                                                                                                                                                                    First, you need to add the following permissions to the AndroidManifest.xml file located in the app/src/main directory:

                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                    <uses-permission android:name=\"android.permission.INTERNET\" />\n<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n

                                                                                                                                                                                                    Then, the app need to request these permissions when the user joins the video call room. This is done in the RoomLayoutActivity.kt file by calling the requestNeededPermissions method in the onCreate method:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun requestNeededPermissions(onHasPermissions: () -> Unit) {\n    val requestPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grants ->\n            var hasDenied = false\n\n            // Check if any permissions weren't granted\n            for (grant in grants.entries) {\n                if (!grant.value) {\n                    Toast.makeText(this, \"Missing permission: ${grant.key}\", Toast.LENGTH_SHORT)\n                        .show()\n\n                    hasDenied = true\n                }\n            }\n\n            if (!hasDenied) {\n                onHasPermissions()\n            }\n        }\n\n    // Assemble the needed permissions to request\n    val neededPermissions =\n        listOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA).filter {\n            ContextCompat.checkSelfPermission(\n                this, it\n            ) == PackageManager.PERMISSION_DENIED\n        }.toTypedArray()\n\n    if (neededPermissions.isNotEmpty()) {\n        requestPermissionLauncher.launch(neededPermissions)\n    } else {\n        onHasPermissions()\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    The Urls.kt file defines an object that contains the following URLs required for the application:

                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. In case you are running OpenVidu locally, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter the URLs when the application starts. This configuration is managed in the ConfigureUrlsActivity.kt file:

                                                                                                                                                                                                    When the user clicks the Save button, the onSaveUrls() method is called, which saves the URLs in the Urls object and finishes the activity, returning to the MainActivity:

                                                                                                                                                                                                    ConfigureUrlsActivity.kt
                                                                                                                                                                                                    private fun onSaveUrls() {\n    val serverUrl = binding.serverUrl.text.toString()\n    val livekitUrl = binding.livekitUrl.text.toString()\n\n    if (serverUrl.isNotEmpty() && livekitUrl.isNotEmpty()) {\n        Urls.livekitUrl = binding.livekitUrl.text.toString()\n        Urls.applicationServerUrl = binding.serverUrl.text.toString()\n        finish()\n    } else {\n        Toast.makeText(this, \"Please fill in all fields\", Toast.LENGTH_SHORT).show()\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#joining-a-room","title":"Joining a room","text":"

                                                                                                                                                                                                    Before joining a room, the user must provide a room name and a user name. After the user specifies them, when they click the Join button, the navigateToRoomLayoutActivity() method of the MainActivity.kt file is called, which simply set the values of the participant name and room name in the intent and starts the RoomLayoutActivity:

                                                                                                                                                                                                    MainActivity.kt
                                                                                                                                                                                                    private fun navigateToRoomLayoutActivity() {\n    binding.joinButton.isEnabled = false\n\n    val participantName = binding.participantName.text.toString()\n    val roomName = binding.roomName.text.toString()\n\n    if (participantName.isNotEmpty() && roomName.isNotEmpty()) {\n        val intent = Intent(this, RoomLayoutActivity::class.java)\n        intent.putExtra(\"participantName\", participantName)\n        intent.putExtra(\"roomName\", roomName)\n        startActivity(intent)\n    } else {\n        Toast.makeText(this, \"Please fill in all fields\", Toast.LENGTH_SHORT).show()\n    }\n\n    binding.joinButton.isEnabled = true\n}\n

                                                                                                                                                                                                    Now let's see the code of the RoomLayoutActivity.kt file:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    data class TrackInfo( // (1)!\n    val track: VideoTrack,\n    val participantIdentity: String,\n    val isLocal: Boolean = false\n)\n\nclass RoomLayoutActivity : AppCompatActivity() {\n    private lateinit var binding: ActivityRoomLayoutBinding // (2)!\n    private lateinit var participantAdapter: ParticipantAdapter // (3)!\n\n    private lateinit var room: Room // (4)!\n    private val participantTracks: MutableList<TrackInfo> = mutableListOf() // (5)!\n\n    private val client = HttpClient(CIO) { // (6)!\n        expectSuccess = true\n        install(ContentNegotiation) {\n            json()\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo data class, which groups a video track with the participant's identity.
                                                                                                                                                                                                    2. The binding object for the activity layout.
                                                                                                                                                                                                    3. The adapter for the RecyclerView that displays the participants' video tracks.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. A list of TrackInfo objects, which represent the video tracks of the participants in the room.
                                                                                                                                                                                                    6. The HTTP client used to make requests to the application server.

                                                                                                                                                                                                    The RoomLayoutActivity.kt file defines the following variables:

                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • participantTracks: A list of TrackInfo objects, which represent the video tracks of the participants in the room.

                                                                                                                                                                                                    When the activity is created, the onCreate method is called. This method initializes the activity layout, create a Room object, initializes the RecyclerView and request needed permissions:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityRoomLayoutBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.loader.visibility = View.VISIBLE\n    binding.leaveButton.setOnClickListener {\n        leaveRoom()\n    }\n\n    // Create Room object\n    room = LiveKit.create(applicationContext)\n\n    initRecyclerView()\n\n    // Check for audio and camera permissions before connecting to the room\n    requestNeededPermissions { connectToRoom() }\n}\n

                                                                                                                                                                                                    After the application check if the user has granted permissions, the connectToRoom() method is called:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun connectToRoom() {\n    // Get the room name and participant name from the intent\n    val participantName = intent.getStringExtra(\"participantName\") ?: \"Participant1\" // (1)!\n    val roomName = intent.getStringExtra(\"roomName\") ?: \"Test Room\"\n\n    binding.roomName.text = roomName // (2)!\n\n    lifecycleScope.launch {\n        // Specify the actions when events take place in the room\n        launch {\n            room.events.collect { event ->\n                when (event) {\n                    // On every new Track received...\n                    is RoomEvent.TrackSubscribed -> onTrackSubscribed(event) // (3)!\n                    // On every new Track destroyed...\n                    is RoomEvent.TrackUnsubscribed -> onTrackUnsubscribed(event) // (4)!\n                    else -> {}\n                }\n            }\n        }\n\n        try {\n            // Get token from your application server with the room name and participant name\n            val token = getToken(roomName, participantName) // (5)!\n\n            // Connect to the room with the LiveKit URL and the token\n            room.connect(Urls.livekitUrl, token) // (6)!\n\n            // Publish your camera and microphone\n            val localParticipant = room.localParticipant\n            localParticipant.setMicrophoneEnabled(true) // (7)!\n            localParticipant.setCameraEnabled(true)\n\n            // Add local video track to the participantTracks list\n            launch {\n                localParticipant::videoTrackPublications.flow\n                    .collect { publications ->\n                        val videoTrack = publications.firstOrNull()?.second as? VideoTrack\n\n                        if (videoTrack != null) {\n                            participantTracks.add( // (8)!\n                                0,\n                                TrackInfo(videoTrack, participantName, true)\n                            )\n                            participantAdapter.notifyItemInserted(0)\n                        }\n                    }\n            }\n\n            binding.loader.visibility = View.GONE\n        } catch (e: Exception) {\n            println(\"There was an error connecting to the room: ${e.message}\")\n            Toast.makeText(this@RoomLayoutActivity, \"Failed to join room\", Toast.LENGTH_SHORT)\n                .show()\n            leaveRoom()\n        }\n    }\n}\n
                                                                                                                                                                                                    1. Get the room name and participant name from the intent.
                                                                                                                                                                                                    2. Set the room title in the layout.
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. Event handling for when a track is destroyed.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.
                                                                                                                                                                                                    8. Add local video track to the participantTracks list

                                                                                                                                                                                                    The connectToRoom() method performs the following actions:

                                                                                                                                                                                                    1. It retrieves the room name and participant name from the intent.
                                                                                                                                                                                                    2. Set the room title in the layout.
                                                                                                                                                                                                    3. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the participantTracks list if it is a video track and notify the Adapter that a new item has been inserted.
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackSubscribed(event: RoomEvent.TrackSubscribed) {\n    val track = event.track\n\n    // If the track is a video track, add it to the participantTracks list\n    if (track is VideoTrack) {\n        participantTracks.add(TrackInfo(track, event.participant.identity!!.value))\n        participantAdapter.notifyItemInserted(participantTracks.size - 1)\n    }\n}\n
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the video track from the participantTracks list and notify the Adapter that an item has been removed.
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackUnsubscribed(event: RoomEvent.TrackUnsubscribed) {\n    val track = event.track\n\n    // If the track is a video track, remove it from the participantTracks list\n    if (track is VideoTrack) {\n        val index = participantTracks.indexOfFirst { it.track.sid == track.sid }\n\n        if (index != -1) {\n            participantTracks.removeAt(index)\n            participantAdapter.notifyItemRemoved(index)\n        }\n    }\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nprivate suspend fun getToken(roomName: String, participantName: String): String {\n    val response = client.post(Urls.applicationServerUrl + \"token\") {\n        contentType(ContentType.Application.Json)\n        setBody(TokenRequest(participantName, roomName))\n    }\n    return response.body<TokenResponse>().token\n}\n

                                                                                                                                                                                                      This method sends a POST request using Ktor Client to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using setMicrophoneEnabled() and setCameraEnabled() methods from room.localParticipant.
                                                                                                                                                                                                    7. It adds the local video track to the participantTracks list.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#displaying-video-tracks","title":"Displaying Video Tracks","text":"

                                                                                                                                                                                                    In order to display the video tracks of the participants in the room, the RoomLayoutActivity uses a RecyclerView with a custom Adapter and ViewHolder. This allows the application to load and display the video tracks dynamically as they are received.

                                                                                                                                                                                                    Whenever a new video track is added to the participantTracks list, the ParticipantAdapter is notified that a new item has been inserted. The ParticipantAdapter then updates the RecyclerView to display the new video track by calling the render method of the ParticipantViewHolder:

                                                                                                                                                                                                    ParticipantViewHolder.kt
                                                                                                                                                                                                    fun render(trackInfo: TrackInfo, room: Room) {\n    val participantIdentity = if (trackInfo.isLocal) {\n        trackInfo.participantIdentity + \" (You)\"\n    } else {\n        trackInfo.participantIdentity\n    }\n\n    binding.identity.text = participantIdentity // (1)!\n\n    // Only initialize the renderer once\n    if (!used) {\n        room.initVideoRenderer(binding.renderer) // (2)!\n        used = true\n    }\n\n    trackInfo.track.addRenderer(binding.renderer) // (3)!\n}\n
                                                                                                                                                                                                    1. Set the participant identity in the layout.
                                                                                                                                                                                                    2. Initialize the video renderer for the participant.
                                                                                                                                                                                                    3. Add the video track to the renderer.

                                                                                                                                                                                                    The render method performs the following actions:

                                                                                                                                                                                                    • It sets the participant identity in the layout.
                                                                                                                                                                                                    • It initializes the video renderer for the participant. This is done only once for each participant.
                                                                                                                                                                                                    • It adds the video track to the renderer.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/android/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    room.disconnect() // (1)!\n\n    client.close() // (2)!\n\n    // Go back to the previous activity.\n    finish() // (3)!\n}\n\noverride fun onDestroy() { // (4)!\n    super.onDestroy()\n    leaveRoom()\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Close the HTTP client.
                                                                                                                                                                                                    3. Finish the activity and go back to the previous activity.
                                                                                                                                                                                                    4. Call the leaveRoom() method when the activity is destroyed.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It closes the HTTP client.
                                                                                                                                                                                                    • It finishes the activity and goes back to the previous activity.

                                                                                                                                                                                                    The onDestroy() lifecycle method is used to ensure that the user leaves the room when the activity is destroyed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/","title":"Angular Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Angular that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/angular/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Angular project has been created using the Angular CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • app.component.css: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Angular application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nvar APPLICATION_SERVER_URL = ''; // (2)!\nvar LIVEKIT_URL = ''; // (3)!\n\n@Component({ // (4)!\n    selector: 'app-root',\n    standalone: true,\n    imports: [ReactiveFormsModule, AudioComponent, VideoComponent],\n    templateUrl: './app.component.html',\n    styleUrl: './app.component.css',\n})\nexport class AppComponent implements OnDestroy {\n    roomForm = new FormGroup({ // (5)!\n        roomName: new FormControl('Test Room', Validators.required),\n        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),\n    });\n\n    room = signal<Room | undefined>(undefined); // (6)!\n    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (7)!\n    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (8)!\n\n    constructor(private httpClient: HttpClient) {\n        this.configureUrls();\n    }\n\n    configureUrls() {\n        // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n        if (!APPLICATION_SERVER_URL) {\n            if (window.location.hostname === 'localhost') {\n                APPLICATION_SERVER_URL = 'http://localhost:6080/';\n            } else {\n                APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';\n            }\n        }\n\n        // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n        if (!LIVEKIT_URL) {\n            if (window.location.hostname === 'localhost') {\n                LIVEKIT_URL = 'ws://localhost:7880/';\n            } else {\n                LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n            }\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    5. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    6. The room object, which represents the video call room.
                                                                                                                                                                                                    7. The local video track, which represents the user's camera.
                                                                                                                                                                                                    8. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {\n    // Initialize a new Room object\n    const room = new Room();\n    this.room.set(room); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    this.room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!\n            this.remoteTracksMap.update((map) => {\n                map.set(publication.trackSid, {\n                    trackPublication: publication,\n                    participantIdentity: participant.identity,\n                });\n                return map;\n            });\n        }\n    );\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!\n        this.remoteTracksMap.update((map) => {\n            map.delete(publication.trackSid);\n            return map;\n        });\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = this.roomForm.value.roomName!; // (4)!\n        const participantName = this.roomForm.value.participantName!;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await this.getToken(roomName, participantName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (7)!\n        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error: any) {\n        console.log(\n            'There was an error connecting to the room:',\n            error?.error?.errorMessage || error?.message || error\n        );\n        await this.leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync getToken(roomName: string, participantName: string): Promise<string> {\n    const response = await lastValueFrom(\n        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })\n    );\n    return response.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    <div id=\"layout-container\">\n    @if (localTrack()) {\n    <video-component\n        [track]=\"localTrack()!\"\n        [participantIdentity]=\"roomForm.value.participantName!\"\n        [local]=\"true\"\n    ></video-component>\n    }\n    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {\n        @if (remoteTrack.trackPublication.kind === 'video') {\n        <video-component\n            [track]=\"remoteTrack.trackPublication.videoTrack!\"\n            [participantIdentity]=\"remoteTrack.participantIdentity\"\n        ></video-component>\n        } @else {\n        <audio-component [track]=\"remoteTrack.trackPublication.audioTrack!\" hidden></audio-component>\n        }\n    }\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: 'video-component',\n    standalone: true,\n    imports: [],\n    templateUrl: './video.component.html',\n    styleUrl: './video.component.css',\n})\nexport class VideoComponent implements AfterViewInit, OnDestroy {\n    videoElement = viewChild<ElementRef<HTMLVideoElement>>('videoElement'); // (2)!\n\n    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!\n    participantIdentity = input.required<string>(); // (4)!\n    local = input(false); // (5)!\n\n    ngAfterViewInit() {\n        if (this.videoElement()) {\n            this.track().attach(this.videoElement()!.nativeElement); // (6)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (7)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the video element in the HTML template.
                                                                                                                                                                                                    3. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    4. The participant identity associated with the video track.
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    7. Detach the video track when the component is destroyed.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: 'audio-component',\n    standalone: true,\n    imports: [],\n    templateUrl: './audio.component.html',\n    styleUrl: './audio.component.css',\n})\nexport class AudioComponent implements AfterViewInit, OnDestroy {\n    audioElement = viewChild<ElementRef<HTMLAudioElement>>('audioElement'); // (2)!\n\n    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!\n\n    ngAfterViewInit() {\n        if (this.audioElement()) {\n            this.track().attach(this.audioElement()!.nativeElement); // (4)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (5)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    4. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    5. Detach the audio track when the component is destroyed.

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/angular/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await this.room()?.disconnect(); // (1)!\n\n    // Reset all variables\n    this.room.set(undefined); // (2)!\n    this.localTrack.set(undefined);\n    this.remoteTracksMap.set(new Map());\n}\n\n@HostListener('window:beforeunload') // (3)!\nasync ngOnDestroy() {\n    // On window closed or component destroyed, leave the room\n    await this.leaveRoom();\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables.
                                                                                                                                                                                                    3. Call the leaveRoom() method when the user closes the browser window or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It resets all variables.

                                                                                                                                                                                                    The window.onbeforeunload event and the ngOnDestroy() lifecycle hook are used to ensure that the user leaves the room when the browser window is closed or the component is destroyed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/","title":"Electron Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Electron that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/electron/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Electron project has been created using electron-forge. As an Electron application, the code is divided into two main parts, the main process and the renderer process. The most important files are located within the src/ directory:

                                                                                                                                                                                                    • index.js: This file is the entry point (main process) for the Electron application. It creates the main window and loads the index.html file.
                                                                                                                                                                                                    • app.js: This file constitutes the renderer process code, responsible for the application UI and logic. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Electron application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    const { Room, RoomEvent } = require(\"livekit-client\"); // (1)!\n\n// Configure these constants with correct URLs depending on your deployment\nconst APPLICATION_SERVER_URL = \"http://localhost:6080/\"; // (2)!\nconst LIVEKIT_URL = \"ws://localhost:7880/\"; // (3)!\n\nvar room; // (4)!\n
                                                                                                                                                                                                    1. Import the Room and RoomEvent classes from the livekit-client package.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    You should configure APPLICATION_SERVER_URL and LIVEKIT_URL constants with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        // (2)!\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        // (3)!\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value; // (4)!\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName; // (7)!\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (8)!\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Hide the \"Join room\" page and show the \"Room\" page.
                                                                                                                                                                                                    8. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.
                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {\n    const element = track.attach(); // (1)!\n    element.id = track.sid;\n\n    /* If the track is a video track, we create a container and append the video element to it\n    with the participant's identity */\n    if (track.kind === \"video\") {\n        const videoContainer = createVideoContainer(participantIdentity, local);\n        videoContainer.append(element);\n        appendParticipantData(videoContainer, participantIdentity + (local ? \" (You)\" : \"\"));\n    } else {\n        document.getElementById(\"layout-container\").append(element);\n    }\n}\n
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {\n    const videoContainer = document.createElement(\"div\");\n    videoContainer.id = `camera-${participantIdentity}`;\n    videoContainer.className = \"video-container\";\n    const layoutContainer = document.getElementById(\"layout-container\");\n\n    if (local) {\n        layoutContainer.prepend(videoContainer);\n    } else {\n        layoutContainer.append(videoContainer);\n    }\n\n    return videoContainer;\n}\n\nfunction appendParticipantData(videoContainer, participantIdentity) {\n    const dataElement = document.createElement(\"div\");\n    dataElement.className = \"participant-data\";\n    dataElement.innerHTML = `<p>${participantIdentity}</p>`;\n    videoContainer.prepend(dataElement);\n}\n
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {\n    const videoContainer = document.getElementById(`camera-${participantIdentity}`);\n    videoContainer?.remove();\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName, participantName) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const token = await response.json();\n    return token.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It updates the UI to hide the \"Join room\" page and show the \"Room\" layout.
                                                                                                                                                                                                    7. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/electron/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.disconnect(); // (1)!\n\n    // Remove all HTML elements inside the layout container\n    removeAllLayoutElements(); // (2)!\n\n    // Back to 'Join room' page\n    document.getElementById(\"join\").hidden = false; // (3)!\n    document.getElementById(\"room\").hidden = true;\n\n    // Enable 'Join' button\n    document.getElementById(\"join-button\").disabled = false;\n    document.getElementById(\"join-button\").innerText = \"Join!\";\n}\n\n// (4)!\nwindow.onbeforeunload = () => {\n    room?.disconnect();\n};\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    3. Show the \"Join room\" page and hide the \"Room\" layout.
                                                                                                                                                                                                    4. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • It shows the \"Join room\" page and hides the \"Room\" layout.

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/","title":"Ionic Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Ionic, using Angular and Capacitor, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/ionic/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Ionic project has been created using the Ionic CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • app.component.scss: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Ionic application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally and launching app in web browser, leave these variables empty\n// For other deployment type or when launching app in a mobile device, configure them with correct URLs\n// If you leave them empty when launching app in a mobile device, the user will be prompted to enter the URLs\nvar APPLICATION_SERVER_URL = ''; // (2)!\nvar LIVEKIT_URL = ''; // (3)!\n\n@Component({ // (4)!\n    selector: 'app-root',\n    templateUrl: 'app.component.html',\n    styleUrl: 'app.component.scss',\n    standalone: true,\n    imports: [\n        IonApp,\n        VideoComponent,\n        AudioComponent,\n        ReactiveFormsModule,\n        IonHeader,\n        IonToolbar,\n        IonTitle,\n        IonButtons,\n        IonButton,\n        IonIcon,\n        IonContent,\n        IonList,\n        IonItem,\n        IonInput,\n        IonFooter,\n    ],\n})\nexport class AppComponent implements OnDestroy {\n    roomForm = new FormGroup({ // (5)!\n        roomName: new FormControl('Test Room', Validators.required),\n        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),\n    });\n\n    urlsForm = new FormGroup({ // (6)!\n        serverUrl: new FormControl(APPLICATION_SERVER_URL, Validators.required),\n        livekitUrl: new FormControl(LIVEKIT_URL, Validators.required),\n    });\n\n    room = signal<Room | undefined>(undefined); // (7)!\n    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (8)!\n    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (9)!\n\n    settingUrls = signal(false); // (10)!\n\n    constructor(private httpClient: HttpClient, private platform: Platform) {\n        this.configureUrls();\n        addIcons({\n            logoGithub,\n            book,\n            settings,\n        });\n    }\n\n    configureUrls() {\n        const mobileMode = this.platform.is('hybrid');\n\n        // If URLs are not configured and app is launched in a mobile device,\n        // prompt the user to configure them\n        if (mobileMode) {\n            if (!APPLICATION_SERVER_URL || !LIVEKIT_URL) {\n                this.settingUrls.set(true);\n            }\n        } else {\n            // If APPLICATION_SERVER_URL is not configured and app is not launched in a mobile device,\n            // use default value from OpenVidu Local deployment\n            if (!APPLICATION_SERVER_URL) {\n                if (window.location.hostname === 'localhost') {\n                    APPLICATION_SERVER_URL = 'http://localhost:6080/';\n                } else {\n                    APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';\n                }\n            }\n\n            // If LIVEKIT_URL is not configured and app is not launched in a mobile device,\n            // use default value from OpenVidu Local deployment\n            if (!LIVEKIT_URL) {\n                if (window.location.hostname === 'localhost') {\n                    LIVEKIT_URL = 'ws://localhost:7880/';\n                } else {\n                    LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n                }\n            }\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    5. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    6. The urlsForm object, which is a form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. The local video track, which represents the user's camera.
                                                                                                                                                                                                    9. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    10. A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • urlsForm: A form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • settingUrls: A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    When running OpenVidu locally and launching the app in a web browser, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type or when launching the app in a mobile device, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    In case you are running OpenVidu locally and launching the app in a mobile device, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If you leave them empty and app is launched in a mobile device, the user will be prompted to enter the URLs when the application starts:

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {\n    // Initialize a new Room object\n    const room = new Room();\n    this.room.set(room); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    this.room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!\n            this.remoteTracksMap.update((map) => {\n                map.set(publication.trackSid, {\n                    trackPublication: publication,\n                    participantIdentity: participant.identity,\n                });\n                return map;\n            });\n        }\n    );\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!\n        this.remoteTracksMap.update((map) => {\n            map.delete(publication.trackSid);\n            return map;\n        });\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = this.roomForm.value.roomName!; // (4)!\n        const participantName = this.roomForm.value.participantName!;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await this.getToken(roomName, participantName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (7)!\n        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error: any) {\n        console.log(\n            'There was an error connecting to the room:',\n            error?.error?.errorMessage || error?.message || error\n        );\n        await this.leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync getToken(roomName: string, participantName: string): Promise<string> {\n    const response = await lastValueFrom(\n        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })\n    );\n    return response.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    <div id=\"layout-container\">\n    @if (localTrack()) {\n    <video-component\n        [track]=\"localTrack()!\"\n        [participantIdentity]=\"roomForm.value.participantName!\"\n        [local]=\"true\"\n    ></video-component>\n    }\n    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {\n        @if (remoteTrack.trackPublication.kind === 'video') {\n        <video-component\n            [track]=\"remoteTrack.trackPublication.videoTrack!\"\n            [participantIdentity]=\"remoteTrack.participantIdentity\"\n        ></video-component>\n        } @else {\n        <audio-component [track]=\"remoteTrack.trackPublication.audioTrack!\" hidden></audio-component>\n        }\n    }\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: \"video-component\",\n    standalone: true,\n    imports: [],\n    templateUrl: \"./video.component.html\",\n    styleUrl: \"./video.component.css\"\n})\nexport class VideoComponent implements AfterViewInit, OnDestroy {\n    videoElement = viewChild<ElementRef<HTMLVideoElement>>(\"videoElement\"); // (2)!\n\n    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!\n    participantIdentity = input.required<string>(); // (4)!\n    local = input(false); // (5)!\n\n    ngAfterViewInit() {\n        if (this.videoElement()) {\n            this.track().attach(this.videoElement()!.nativeElement); // (6)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (7)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the video element in the HTML template.
                                                                                                                                                                                                    3. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    4. The participant identity associated with the video track.
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    7. Detach the video track when the component is destroyed.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: \"audio-component\",\n    standalone: true,\n    imports: [],\n    templateUrl: \"./audio.component.html\",\n    styleUrl: \"./audio.component.css\"\n})\nexport class AudioComponent implements AfterViewInit, OnDestroy {\n    audioElement = viewChild<ElementRef<HTMLAudioElement>>(\"audioElement\"); // (2)!\n\n    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!\n\n    ngAfterViewInit() {\n        if (this.audioElement()) {\n            this.track().attach(this.audioElement()!.nativeElement); // (4)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (5)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    4. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    5. Detach the audio track when the component is destroyed.

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await this.room()?.disconnect(); // (1)!\n\n    // Reset all variables\n    this.room.set(undefined); // (2)!\n    this.localTrack.set(undefined);\n    this.remoteTracksMap.set(new Map());\n}\n\nasync ngOnDestroy() { // (3)!\n    // On window closed or component destroyed, leave the room\n    await this.leaveRoom();\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables.
                                                                                                                                                                                                    3. Call the leaveRoom() method when the component is destroyed.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It resets all variables.

                                                                                                                                                                                                    The ngOnDestroy() lifecycle hook is used to ensure that the user leaves the room when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ionic/#specific-mobile-requirements","title":"Specific mobile requirements","text":"

                                                                                                                                                                                                    In order to be able to test the application on an Android or iOS device, the application must ask for the necessary permissions to access the device's camera and microphone. These permissions are requested when the user joins the video call room.

                                                                                                                                                                                                    Android iOS

                                                                                                                                                                                                    The application must include the following permissions in the AndroidManifest.xml file located in the android/app/src/main directory:

                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                    <uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n

                                                                                                                                                                                                    The application must include the following permissions in the Info.plist file located in the ios/App/App directory:

                                                                                                                                                                                                    Info.plist
                                                                                                                                                                                                    <key>NSCameraUsageDescription</key>\n<string>This Application uses your camera to make video calls.</string>\n<key>NSMicrophoneUsageDescription</key>\n<string>This Application uses your microphone to make calls.</string>\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/","title":"iOS Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built for iOS, using Swift, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit Swift SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/ios/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#understanding-the-code","title":"Understanding the Code","text":"

                                                                                                                                                                                                    This iOS project, created with Xcode and written in Swift, includes various files and directories. For this tutorial, focus on the following key components within the openvidu-ios/Shared directory:

                                                                                                                                                                                                    • OpenViduApp.swift: Initializes the application and sets up the main view.
                                                                                                                                                                                                    • Support: Contains files for secure storage, token management, and other support functions.
                                                                                                                                                                                                    • Utils: Includes utility files like HttpClient.swift for HTTP networking.
                                                                                                                                                                                                    • Views: Houses the user interface components of the application.
                                                                                                                                                                                                    • Contexts: Manages application state and room contexts for LiveKit interaction.
                                                                                                                                                                                                    • Assets.xcassets: Stores images and color assets used in the app.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#integrating-livekit","title":"Integrating LiveKit","text":"

                                                                                                                                                                                                    To use LiveKit in your iOS app, you need to add the LiveKit Swift SDK as a Swift Package. You can do this using either Package.swift or Xcode.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#adding-livekit-via-packageswift","title":"Adding LiveKit via Package.swift","text":"
                                                                                                                                                                                                    1. Open your Package.swift file.
                                                                                                                                                                                                    2. Add LiveKit to the dependencies array.
                                                                                                                                                                                                    3. Include LiveKit in the targets array.

                                                                                                                                                                                                    Example Package.swift:

                                                                                                                                                                                                    // swift-tools-version:5.3\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyApp\",\n    platforms: [.iOS(.v14)],\n    dependencies: [\n        .package(name: \"LiveKit\", url: \"https://github.com/livekit/client-sdk-swift.git\", .upToNextMajor(from: \"2.0.12\"))\n    ],\n    targets: [\n        .target(\n            name: \"MyApp\",\n            dependencies: [\"LiveKit\"]\n        )\n    ]\n)\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#adding-livekit-via-xcode","title":"Adding LiveKit via Xcode","text":"
                                                                                                                                                                                                    1. Open your Xcode project.
                                                                                                                                                                                                    2. Go to Project Settings.
                                                                                                                                                                                                    3. Select the Swift Packages tab.
                                                                                                                                                                                                    4. Click the + button to add a new package.
                                                                                                                                                                                                    5. Enter the URL: https://github.com/livekit/client-sdk-swift.
                                                                                                                                                                                                    6. Choose the version you want, such as \"Up to Next Major Version\" with 2.0.12.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#ios-specific-requirements","title":"iOS Specific Requirements","text":"

                                                                                                                                                                                                    To test the application on an iOS device, you need to ensure it has permission to access the camera and microphone. These configurations are already included in this project. However, if you're starting a new project, follow these steps:

                                                                                                                                                                                                    1. Add Permissions to Info.plist

                                                                                                                                                                                                      Include the following keys in your Info.plist file to request access to the camera and microphone:

                                                                                                                                                                                                      <key>NSCameraUsageDescription</key>\n<string>$(PRODUCT_NAME) needs camera access to capture and transmit video</string>\n<key>NSMicrophoneUsageDescription</key>\n<string>$(PRODUCT_NAME) needs microphone access to capture and transmit audio</string>\n
                                                                                                                                                                                                    2. Automatic Permission Requests

                                                                                                                                                                                                      The app will automatically request these permissions when it runs.

                                                                                                                                                                                                    3. Check Permissions

                                                                                                                                                                                                      To verify if the permissions were granted, use the AVCaptureDevice.requestAccess(for: .video) method:

                                                                                                                                                                                                      AVCaptureDevice.requestAccess(for: .video) { granted in\n    if granted {\n        print(\"Camera access granted\")\n    } else {\n        print(\"Camera access denied\")\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    The ConfigureUrlsView.swift file defines a SwiftUI view for configuring the URLs required for the application:

                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server used to obtain tokens for joining the video call room.
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server used to connect to the video call room and handle video communication.

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. If you are running OpenVidu locally, you can set applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www represents the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter them when the application starts. This configuration is managed in the ConfigureUrlsView.swift file:

                                                                                                                                                                                                    When the user clicks the Save button, the LKButton action triggers the validation and saves the URLs into the AppContext and RoomContext. The ConfigureUrlsView handles this logic:

                                                                                                                                                                                                    ConfigureUrlsView.swift
                                                                                                                                                                                                    LKButton(title: \"Save\") {\n    Task.detached { @MainActor in\n        let isApplicationServerValid = isValidURL(self.applicationServerUrl)\n        let isLivekitUrlValid = isValidURL(self.livekitUrl)\n\n        if !isApplicationServerValid || !isLivekitUrlValid {\n            print(\"Invalid URLs\")\n            errorMessage = \"There was an error with the URL values\"\n            return\n        }\n        appCtx.applicationServerUrl = self.applicationServerUrl\n        roomCtx.livekitUrl = self.livekitUrl\n        errorMessage = \"\"\n    }\n}\n

                                                                                                                                                                                                    In this code snippet, the isValidURL function checks the validity of the URLs. If both URLs are valid, they are saved into the appCtx and roomCtx contexts. If any URL is invalid, an error message is displayed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#joining-a-room","title":"Joining a room","text":"

                                                                                                                                                                                                    Before joining a room, the ConnectView.swift defines the view for the connection screen. It includes a logo, text fields for participant name and room name, and buttons for joining the room and resetting URLs.

                                                                                                                                                                                                    After define the participant and room name, the user can click the Join button to connect to the room. This action triggers the connectToRoom method asynchronously:

                                                                                                                                                                                                    ConnectView.swift
                                                                                                                                                                                                    func connectToRoom() async {\n    let livekitUrl = roomCtx.livekitUrl\n    let roomName = roomCtx.name\n    let participantName = roomCtx.localParticipantName\n    let applicationServerUrl = appCtx.applicationServerUrl\n\n    guard !livekitUrl.isEmpty, !roomName.isEmpty else {\n        print(\"LiveKit URL or room name is empty\")\n        return\n    }\n\n    do {\n        let token = try await httpService.getToken(\n            applicationServerUrl: applicationServerUrl, roomName: roomName,\n            participantName: participantName)// (1)!\n\n        if token.isEmpty {\n            print(\"Received empty token\")\n            return\n        }\n\n        roomCtx.token = token\n        print(\"Connecting to room...\")\n        try await roomCtx.connect() // (2)!\n        print(\"Room connected\")\n        await enableCameraAndMicrophone() // (3)!\n\n    } catch {\n        print(\"Failed to get token: \\(error.localizedDescription)\")\n    }\n}\n\nfunc enableCameraAndMicrophone() async {\n    do {\n        try await room.localParticipant.setCamera(enabled: true) // (4)!\n        try await room.localParticipant.setMicrophone(enabled: true) // (5)!\n    } catch {\n        print(\"Error enabling camera and microphone: \\(error.localizedDescription)\")\n    }\n}\n
                                                                                                                                                                                                    1. The getToken method is called to request a token from the application server.
                                                                                                                                                                                                    2. The connect method is called to connect to the room using the LiveKit URL and the token.
                                                                                                                                                                                                    3. The enableCameraAndMicrophone method is called to enable the camera and microphone for the local participant.
                                                                                                                                                                                                    4. The setCamera method is called to enable the camera for the local participant.
                                                                                                                                                                                                    5. The setMicrophone method is called to enable the microphone for the local participant.

                                                                                                                                                                                                    The OpenViduApp.swift handle the navigation page. When room status is connected, the user is redirected to the RoomView:

                                                                                                                                                                                                    OpenViduApp.swift
                                                                                                                                                                                                    struct RoomSwitchView: View {\n    @EnvironmentObject var appCtx: AppContext\n    @EnvironmentObject var roomCtx: RoomContext\n    @EnvironmentObject var room: Room\n\n    var shouldShowRoomView: Bool {\n        room.connectionState == .connected || room.connectionState == .reconnecting\n    }\n\n    var shouldShowConfigureUrlsView: Bool {\n        appCtx.applicationServerUrl.isEmpty || roomCtx.livekitUrl.isEmpty\n\n    }\n\n    var body: some View {\n        ZStack {\n            Color.black\n                .ignoresSafeArea()\n\n            // Navigation logic\n            if shouldShowRoomView {\n                RoomView() // (1)!\n            } else {\n                if shouldShowConfigureUrlsView {\n                    ConfigureUrlsView() // (2)!\n                } else {\n                    ConnectView() // (3)!\n                }\n            }\n        }\n        .navigationTitle(computeTitle())\n    }\n}\n
                                                                                                                                                                                                    1. If the room is connected, the user is redirected to the RoomView.
                                                                                                                                                                                                    2. If the URLs are not configured, the user is redirected to the ConfigureUrlsView.
                                                                                                                                                                                                    3. If the room is not connected and the URLs are configured, the user is redirected to the ConnectView.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#displaying-video-tracks","title":"Displaying Video Tracks","text":"

                                                                                                                                                                                                    To display the video tracks of participants in the room, the RoomView.swift uses various SwiftUI views and custom components. This approach allows the application to dynamically load and display the video tracks as they are received.

                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    struct RoomView: View {\n    @EnvironmentObject var appCtx: AppContext\n    @EnvironmentObject var roomCtx: RoomContext\n    @EnvironmentObject var room: Room\n\n    @State var isCameraPublishingBusy = false\n    @State var isMicrophonePublishingBusy = false\n\n    // ...\n\n    func content(geometry: GeometryProxy) -> some View {\n        VStack {\n            // ...\n\n            // Display Participant layout\n            HorVStack(axis: geometry.isTall ? .vertical : .horizontal, spacing: 5) {\n                Group {\n                    ParticipantLayout(sortedParticipants(), spacing: 5) { participant in // (1)!\n                        ParticipantView(participant: participant, videoViewMode: .fill) // (2)!\n                    }\n                }\n                .frame(\n                    minWidth: 0,\n                    maxWidth: .infinity,\n                    minHeight: 0,\n                    maxHeight: .infinity\n                )\n            }\n            .padding(5)\n        }\n    }\n}\n
                                                                                                                                                                                                    1. The ParticipantLayout component is used to display the video tracks of all participants in the room. It receives the sorted list of participants and a closure that returns a ParticipantView for each participant.
                                                                                                                                                                                                    2. The ParticipantView component is used to display the video track of a participant.

                                                                                                                                                                                                    The ParticipantView component is responsible for rendering the video track of a participant. It uses the SwiftUIVideoView component to display the video track and the VideoView.LayoutMode enum to define the layout mode.

                                                                                                                                                                                                    The LiveKit Swift SDK includes a VideoView class, based on UIKit, specifically designed for rendering video tracks. Additionally, subscribed audio tracks are automatically played by default.

                                                                                                                                                                                                    ParticipantView.swift
                                                                                                                                                                                                    struct ParticipantView: View {\n    @ObservedObject var participant: Participant\n    @EnvironmentObject var appCtx: AppContext\n\n    var videoViewMode: VideoView.LayoutMode = .fill\n\n\n    // ...\n\n     var body: some View {\n        GeometryReader { geometry in\n            ZStack(alignment: .bottom) {\n\n                // ...\n\n                // VideoView for the Participant\n                if let publication = participant.mainVideoPublication,\n                    !publication.isMuted,\n                    let track = publication.track as? VideoTrack\n                {\n                    ZStack(alignment: .topLeading) {\n                        SwiftUIVideoView(track, // (1)!\n                                            layoutMode: videoViewMode,\n                                            isRendering: $isRendering)\n                    }\n                }\n            }\n        }\n     }\n\n}\n
                                                                                                                                                                                                    1. The SwiftUIVideoView component renders the participant's video track.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/ios/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    To leave the room, the user can click the Leave button in the RoomView. This action triggers the leaveRoom method asynchronously:

                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    func content(geometry: GeometryProxy) -> some View {\n\n    // ...\n\n    Button(action: {\n        Task {\n            await roomCtx.disconnect()\n        }\n    }, label: {\n        HStack {\n            Image(systemSymbol: .xmarkCircleFill)\n                .renderingMode(.original)\n            Text(\"Leave Room\")\n                .font(.headline)\n                .fontWeight(.semibold)\n        }\n        .padding(8)\n        .background(Color.red.opacity(0.8)) // Background color for the button\n        .foregroundColor(.white) // Text color\n        .cornerRadius(8)\n    })\n}\n

                                                                                                                                                                                                    After rome is disconnected, the room status is updated to disconnected and the OpenViduApp.swift handle this update to redirect the user to the ConnectView.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/","title":"JavaScript Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with plain JavaScript, HTML and CSS that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/javascript/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This application is designed to be beginner-friendly and consists of only three essential files that are located in the src directory:

                                                                                                                                                                                                    • app.js: This is the main JavaScript file for the sample application. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.

                                                                                                                                                                                                    To use the LiveKit JS SDK in your application, you need to include the library in your HTML file. You can do this by adding the following script tag to the <head> section of your HTML file:

                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    <script src=\"https://cdn.jsdelivr.net/npm/livekit-client@2.1.5/dist/livekit-client.umd.js\"></script>\n

                                                                                                                                                                                                    Then, you can use the LivekitClient object in your JavaScript code by referencing it from the window object under LivekitClient. When accessing symbols from the class, you will need to prefix them with LivekitClient.. For example, Room becomes LivekitClient.Room.

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    // When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nvar APPLICATION_SERVER_URL = \"\"; // (1)!\nvar LIVEKIT_URL = \"\"; // (2)!\nconfigureUrls();\n\nconst LivekitClient = window.LivekitClient; // (3)!\nvar room; // (4)!\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n
                                                                                                                                                                                                    1. The URL of the application server.
                                                                                                                                                                                                    2. The URL of the LiveKit server.
                                                                                                                                                                                                    3. The LivekitClient object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    4. The room object, which represents the video call room.

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • LivekitClient: The LiveKit JS SDK object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new LivekitClient.Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        // (2)!\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        // (3)!\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value; // (4)!\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName; // (7)!\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (8)!\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Hide the \"Join room\" page and show the \"Room\" page.
                                                                                                                                                                                                    8. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object using LivekitClient.Room(). This object represents the video call room.
                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {\n    const element = track.attach(); // (1)!\n    element.id = track.sid;\n\n    /* If the track is a video track, we create a container and append the video element to it\n    with the participant's identity */\n    if (track.kind === \"video\") {\n        const videoContainer = createVideoContainer(participantIdentity, local);\n        videoContainer.append(element);\n        appendParticipantData(videoContainer, participantIdentity + (local ? \" (You)\" : \"\"));\n    } else {\n        document.getElementById(\"layout-container\").append(element);\n    }\n}\n
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {\n    const videoContainer = document.createElement(\"div\");\n    videoContainer.id = `camera-${participantIdentity}`;\n    videoContainer.className = \"video-container\";\n    const layoutContainer = document.getElementById(\"layout-container\");\n\n    if (local) {\n        layoutContainer.prepend(videoContainer);\n    } else {\n        layoutContainer.append(videoContainer);\n    }\n\n    return videoContainer;\n}\n\nfunction appendParticipantData(videoContainer, participantIdentity) {\n    const dataElement = document.createElement(\"div\");\n    dataElement.className = \"participant-data\";\n    dataElement.innerHTML = `<p>${participantIdentity}</p>`;\n    videoContainer.prepend(dataElement);\n}\n
                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {\n    const videoContainer = document.getElementById(`camera-${participantIdentity}`);\n    videoContainer?.remove();\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName, participantName) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const token = await response.json();\n    return token.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It updates the UI to hide the \"Join room\" page and show the \"Room\" layout.
                                                                                                                                                                                                    7. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/javascript/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.disconnect(); // (1)!\n\n    // Remove all HTML elements inside the layout container\n    removeAllLayoutElements(); // (2)!\n\n    // Back to 'Join room' page\n    document.getElementById(\"join\").hidden = false; // (3)!\n    document.getElementById(\"room\").hidden = true;\n\n    // Enable 'Join' button\n    document.getElementById(\"join-button\").disabled = false;\n    document.getElementById(\"join-button\").innerText = \"Join!\";\n}\n\n// (4)!\nwindow.onbeforeunload = () => {\n    room?.disconnect();\n};\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    3. Show the \"Join room\" page and hide the \"Room\" layout.
                                                                                                                                                                                                    4. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • It shows the \"Join room\" page and hides the \"Room\" layout.

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/","title":"React Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with React that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/react/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This React project has been generated using the Vite. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    • App.tsx: This file defines the main application component. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • App.css: This file contains the styles for the main application component.
                                                                                                                                                                                                    • VideoComponent.tsx: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data. Its associated styles are in VideoComponent.css.
                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the App.tsx file:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nlet APPLICATION_SERVER_URL = \"\"; // (2)!\nlet LIVEKIT_URL = \"\"; // (3)!\nconfigureUrls();\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n\nfunction App() {\n    const [room, setRoom] = useState<Room | undefined>(undefined); // (4)!\n    const [localTrack, setLocalTrack] = useState<LocalVideoTrack | undefined>(undefined); // (5)!\n    const [remoteTracks, setRemoteTracks] = useState<TrackInfo[]>([]); // (6)!\n\n    const [participantName, setParticipantName] = useState(\"Participant\" + Math.floor(Math.random() * 100)); // (7)!\n    const [roomName, setRoomName] = useState(\"Test Room\"); // (8)!\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. The local video track, which represents the user's camera.
                                                                                                                                                                                                    6. The remote tracks array.
                                                                                                                                                                                                    7. The participant's name.
                                                                                                                                                                                                    8. The room name.

                                                                                                                                                                                                    The App.tsx file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracks: An array of TrackInfo objects, which group a track publication with the participant's identity.
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • roomName: The room name.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    async function joinRoom() {\n    // Initialize a new Room object\n    const room = new Room(); // (1)!\n    setRoom(room);\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n            // (2)!\n            setRemoteTracks((prev) => [\n                ...prev,\n                { trackPublication: publication, participantIdentity: participant.identity }\n            ]);\n        }\n    );\n\n    // On every Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {\n        // (3)!\n        setRemoteTracks((prev) => prev.filter((track) => track.trackPublication.trackSid !== publication.trackSid));\n    });\n\n    try {\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, participantName); // (4)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (5)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (6)!\n        setLocalTrack(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", (error as Error).message);\n        await leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    5. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    6. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracks array as a TrackInfo object containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracks array.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      App.tsx
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName: string, participantName: string) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName: roomName,\n            participantName: participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const data = await response.json();\n    return data.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    4. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    5. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    <div id=\"layout-container\">\n    {localTrack && (\n        <VideoComponent track={localTrack} participantIdentity={participantName} local={true} />\n    )}\n    {remoteTracks.map((remoteTrack) =>\n        remoteTrack.trackPublication.kind === \"video\" ? (\n            <VideoComponent\n                key={remoteTrack.trackPublication.trackSid}\n                track={remoteTrack.trackPublication.videoTrack!}\n                participantIdentity={remoteTrack.participantIdentity}\n            />\n        ) : (\n            <AudioComponent\n                key={remoteTrack.trackPublication.trackSid}\n                track={remoteTrack.trackPublication.audioTrack!}\n            />\n        )\n    )}\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • If the property localTrack is defined, we display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we iterate over the remoteTracks array and, for each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track.

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.txs file:

                                                                                                                                                                                                    VideoComponent.tsx
                                                                                                                                                                                                    interface VideoComponentProps {\n    track: LocalVideoTrack | RemoteVideoTrack; // (1)!\n    participantIdentity: string; // (2)!\n    local?: boolean; // (3)!\n}\n\nfunction VideoComponent({ track, participantIdentity, local = false }: VideoComponentProps) {\n    const videoElement = useRef<HTMLVideoElement | null>(null); // (4)!\n\n    useEffect(() => {\n        if (videoElement.current) {\n            track.attach(videoElement.current); // (5)!\n        }\n\n        return () => {\n            track.detach(); // (6)!\n        };\n    }, [track]);\n\n    return (\n        <div id={\"camera-\" + participantIdentity} className=\"video-container\">\n            <div className=\"participant-data\">\n                <p>{participantIdentity + (local ? \" (You)\" : \"\")}</p>\n            </div>\n            <video ref={videoElement} id={track.sid}></video>\n        </div>\n    );\n}\n
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. The participant identity associated with the video track.
                                                                                                                                                                                                    3. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    4. The reference to the video element in the HTML template.
                                                                                                                                                                                                    5. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    6. Detach the video track when the component is unmounted.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as props of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.tsx file:

                                                                                                                                                                                                    AudioComponent.tsx
                                                                                                                                                                                                    interface AudioComponentProps {\n    track: LocalAudioTrack | RemoteAudioTrack; // (1)!\n}\n\nfunction AudioComponent({ track }: AudioComponentProps) {\n    const audioElement = useRef<HTMLAudioElement | null>(null); // (2)!\n\n    useEffect(() => {\n        if (audioElement.current) {\n            track.attach(audioElement.current); // (3)!\n        }\n\n        return () => {\n            track.detach(); // (4)!\n        };\n    }, [track]);\n\n    return <audio ref={audioElement} id={track.sid} />;\n}\n
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    4. Detach the audio track when the component is unmounted.

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property as a prop for the component and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/react/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room?.disconnect(); // (1)!\n\n    // Reset the state\n    setRoom(undefined); // (2)!\n    setLocalTrack(undefined);\n    setRemoteTracks([]);\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables to their initial state.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/","title":"Vue Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Vue that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-client/vue/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Vue project has been generated using the Vue CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    • App.vue: This file defines the main application component along with its HTML template and styles. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.

                                                                                                                                                                                                    • VideoComponent.vue: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data.

                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the App.vue file:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    type TrackInfo = {\n    // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nlet APPLICATION_SERVER_URL = \"\"; // (2)!\nlet LIVEKIT_URL = \"\"; // (3)!\nconfigureUrls();\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n\nconst room = ref<Room>(); // (4)!\nconst localTrack = ref<LocalVideoTrack>(); // (5)!\nconst remoteTracksMap: Ref<Map<string, TrackInfo>> = ref(new Map()); // (6)!\n\nlet participantName = ref(\"Participant\" + Math.floor(Math.random() * 100)); // (7)!\nlet roomName = ref(\"Test Room\"); // (8)!\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. The local video track, which represents the user's camera.
                                                                                                                                                                                                    6. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    7. The participant's name.
                                                                                                                                                                                                    8. The room name.

                                                                                                                                                                                                    The App.vue file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • roomName: The room name.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    async function joinRoom() {\n    // Initialize a new Room object\n    room.value = new Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.value.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n            // (2)!\n            remoteTracksMap.value.set(publication.trackSid, {\n                trackPublication: publication,\n                participantIdentity: participant.identity\n            });\n        }\n    );\n\n    // On every Track destroyed...\n    room.value.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {\n        // (3)!\n        remoteTracksMap.value.delete(publication.trackSid);\n    });\n\n    try {\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName.value, participantName.value); // (4)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.value.connect(LIVEKIT_URL, token); // (5)!\n\n        // Publish your camera and microphone\n        await room.value.localParticipant.enableCameraAndMicrophone(); // (6)!\n        localTrack.value = room.value.localParticipant.videoTrackPublications.values().next().value.videoTrack;\n    } catch (error: any) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n        await leaveRoom();\n    }\n\n    // Add listener for beforeunload event to leave the room when the user closes the tab\n    window.addEventListener(\"beforeunload\", leaveRoom); // (7)!\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    5. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    6. Publish your camera and microphone.
                                                                                                                                                                                                    7. Add a listener for the beforeunload event to leave the room when the user closes the tab.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      App.vue
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName: string, participantName: string) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const data = await response.json();\n    return data.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    4. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    5. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    6. It adds a listener for the beforeunload event to leave the room when the user closes the tab.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    <div id=\"layout-container\">\n    <VideoComponent v-if=\"localTrack\" :track=\"localTrack\" :participantIdentity=\"participantName\" :local=\"true\" />\n    <template v-for=\"remoteTrack of remoteTracksMap.values()\" :key=\"remoteTrack.trackPublication.trackSid\">\n        <VideoComponent\n            v-if=\"remoteTrack.trackPublication.kind === 'video'\"\n            :track=\"remoteTrack.trackPublication.videoTrack!\"\n            :participantIdentity=\"remoteTrack.participantIdentity\"\n        />\n        <AudioComponent v-else :track=\"remoteTrack.trackPublication.audioTrack!\" hidden />\n    </template>\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the v-if directive to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the v-for directive to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.vue file:

                                                                                                                                                                                                    VideoComponent.vue
                                                                                                                                                                                                    const props = withDefaults(\n    defineProps<{\n        track: LocalVideoTrack | RemoteVideoTrack; // (1)!\n        participantIdentity: string; // (2)!\n        local?: boolean; // (3)!\n    }>(),\n    {\n        local: false\n    }\n);\n\nconst videoElement = ref<HTMLMediaElement | null>(null); // (4)!\n\nonMounted(() => {\n    if (videoElement.value) {\n        props.track.attach(videoElement.value); // (5)!\n    }\n});\n\nonUnmounted(() => {\n    props.track.detach(); // (6)!\n});\n
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. The participant identity associated with the video track.
                                                                                                                                                                                                    3. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    4. The reference to the video element in the HTML template.
                                                                                                                                                                                                    5. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    6. Detach the video track when the component is unmounted.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local using the defineProps() function:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.vue file:

                                                                                                                                                                                                    AudioComponent.vue
                                                                                                                                                                                                    const props = defineProps<{\n    track: LocalAudioTrack | RemoteAudioTrack; // (1)!\n}>();\nconst audioElement = ref<HTMLMediaElement | null>(null); // (2)!\n\nonMounted(() => {\n    if (audioElement.value) {\n        props.track.attach(audioElement.value); // (3)!\n    }\n});\n\nonUnmounted(() => {\n    props.track.detach(); // (4)!\n});\n
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    4. Detach the audio track when the component is unmounted.

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property using the defineProps() function and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-client/vue/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.value?.disconnect(); // (1)!\n\n    // Empty all variables\n    room.value = undefined; // (2)!\n    localTrack.value = undefined;\n    remoteTracksMap.value.clear();\n\n    window.removeEventListener(\"beforeunload\", leaveRoom); // (3)!\n}\n\nonUnmounted(() => {\n    // (4)!\n    // On component unmount, leave the room\n    leaveRoom();\n});\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables to their initial state.
                                                                                                                                                                                                    3. Remove the beforeunload event listener.
                                                                                                                                                                                                    4. Call the leaveRoom() function when the component is unmounted.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    • It removes the beforeunload event listener.

                                                                                                                                                                                                    The leaveRoom() function is also called when the component is unmounted using the onUnmounted() lifecycle hook. This ensures that the user leaves the room when the component is no longer needed.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/","title":"Application Server Tutorials","text":"

                                                                                                                                                                                                    Every application server below has two specific purposes:

                                                                                                                                                                                                    • Generate LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receive LiveKit webhook events.

                                                                                                                                                                                                    To do so they all define two REST endpoints:

                                                                                                                                                                                                    • /token: takes a room and participant name and returns a token.
                                                                                                                                                                                                    • /webhook: for receiving webhook events from LiveKit Server.

                                                                                                                                                                                                    They use the proper LiveKit Server SDK for their language, if available.

                                                                                                                                                                                                    NodeJS

                                                                                                                                                                                                    Go

                                                                                                                                                                                                    Ruby

                                                                                                                                                                                                    Java

                                                                                                                                                                                                    Python

                                                                                                                                                                                                    Rust

                                                                                                                                                                                                    PHP

                                                                                                                                                                                                    .NET

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/","title":".NET Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for .NET with ASP.NET Core Minimal APIs that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit available, so the application has to manually build LiveKit compatible JWT tokens using the .NET library System.IdentityModel.Tokens.Jwt, and check the validity of webhook events on its own. It is a fairly easy process.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/dotnet/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple ASP.NET Core Minimal APIs app with a single file Program.cs that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code Program.cs file:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    var builder = WebApplication.CreateBuilder(args); // (1)!\nvar MyAllowSpecificOrigins = \"_myAllowSpecificOrigins\"; // (2)!\n\nIConfiguration config = new ConfigurationBuilder() // (3)!\n                .SetBasePath(Directory.GetCurrentDirectory())\n                .AddJsonFile(\"appsettings.json\")\n                .AddEnvironmentVariables().Build();\n\n// Load env variables\nvar SERVER_PORT = config.GetValue<int>(\"SERVER_PORT\"); // (4)!\nvar LIVEKIT_API_KEY = config.GetValue<string>(\"LIVEKIT_API_KEY\"); // (5)!\nvar LIVEKIT_API_SECRET = config.GetValue<string>(\"LIVEKIT_API_SECRET\"); // (6)!\n\n// Enable CORS support\nbuilder.Services.AddCors(options => // (7)!\n{\n    options.AddPolicy(name: MyAllowSpecificOrigins,\n                      builder =>\n                      {\n                          builder.WithOrigins(\"*\").AllowAnyHeader();\n                      });\n});\n\nbuilder.WebHost.UseKestrel(serverOptions => // (8)!\n{\n    serverOptions.ListenAnyIP(SERVER_PORT);\n});\n\nvar app = builder.Build(); // (9)!\napp.UseCors(MyAllowSpecificOrigins);\n
                                                                                                                                                                                                    1. A WebApplicationBuilder instance to build the application.
                                                                                                                                                                                                    2. The name of the CORS policy to be used in the application.
                                                                                                                                                                                                    3. A IConfiguration instance to load the configuration from the appsettings.json file, including the required environment variables.
                                                                                                                                                                                                    4. The port where the application will be listening.
                                                                                                                                                                                                    5. The API key of LiveKit Server.
                                                                                                                                                                                                    6. The API secret of LiveKit Server.
                                                                                                                                                                                                    7. Configure CORS support.
                                                                                                                                                                                                    8. Configure the port.
                                                                                                                                                                                                    9. Build the application and enable CORS support.

                                                                                                                                                                                                    The Program.cs file imports the required dependencies and loads the necessary environment variables (defined in appsettings.json file):

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the application enables CORS support and the port where the application will be listening.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    app.MapPost(\"/token\", async (HttpRequest request) =>\n{\n    var body = new StreamReader(request.Body); // (1)!\n    string postData = await body.ReadToEndAsync();\n    Dictionary<string, dynamic> bodyParams = JsonSerializer.Deserialize<Dictionary<string, dynamic>>(postData) ?? new Dictionary<string, dynamic>();\n\n    if (bodyParams.TryGetValue(\"roomName\", out var roomName) && bodyParams.TryGetValue(\"participantName\", out var participantName))\n    {\n        var token = CreateLiveKitJWT(roomName.ToString(), participantName.ToString()); // (2)!\n        return Results.Json(new { token }); // (3)!\n    }\n    else\n    {\n        return Results.BadRequest(new { errorMessage = \"roomName and participantName are required\" }); // (4)!\n    }\n});\n
                                                                                                                                                                                                    1. The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available.
                                                                                                                                                                                                    2. Create a new JWT token with the room and participant name.
                                                                                                                                                                                                    3. Return the token to the client.
                                                                                                                                                                                                    4. Return a 400 error if required fields are not available.

                                                                                                                                                                                                    The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available. If not, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. Unfortunately there is no .NET SDK for LiveKit, so we need to create the JWT token manually. The CreateLiveKitJWT method is responsible for creating the LiveKit compatible JWT token:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    string CreateLiveKitJWT(string roomName, string participantName)\n{\n    JwtHeader headers = new(new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(LIVEKIT_API_SECRET)), \"HS256\")); // (1)!\n\n    var videoGrants = new Dictionary<string, object>() // (2)!\n    {\n        { \"room\", roomName },\n        { \"roomJoin\", true }\n    };\n    JwtPayload payload = new()\n    {\n        { \"exp\", new DateTimeOffset(DateTime.UtcNow.AddHours(6)).ToUnixTimeSeconds() }, // (3)!\n        { \"iss\", LIVEKIT_API_KEY }, // (4)!\n        { \"nbf\", 0 }, // (5)!\n        { \"sub\", participantName }, // (6)!\n        { \"name\", participantName },\n        { \"video\", videoGrants }\n    };\n    JwtSecurityToken token = new(headers, payload);\n    return new JwtSecurityTokenHandler().WriteToken(token); // (7)!\n}\n
                                                                                                                                                                                                    1. Create a new JwtHeader with LIVEKIT_API_SECRET as the secret key and HS256 as the encryption algorithm.
                                                                                                                                                                                                    2. Create a new Dictionary with the video grants for the participant. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. Set the expiration time of the token. LiveKit default's is 6 hours.
                                                                                                                                                                                                    4. Set the API key of LiveKit Server as the issuer (iss) of the token.
                                                                                                                                                                                                    5. The Not before field (nbf) sets when the token becomes valid (0 for immediately valid).
                                                                                                                                                                                                    6. Set the participant's name in the claims sub and name.
                                                                                                                                                                                                    7. Finally, the returned token is sent back to the client.

                                                                                                                                                                                                    This method uses the native System.IdentityModel.Tokens.Jwt library to create a JWT token valid for LiveKit. The most important field in the JwtPayload is video, which will determine the VideoGrant permissions of the participant in the Room. You can also customize the expiration time of the token by changing the exp field, and add a metadata field for the participant. Check out all the available claims.

                                                                                                                                                                                                    Finally, the returned token is sent back to the client.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/dotnet/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    app.MapPost(\"/livekit/webhook\", async (HttpRequest request) =>\n{\n    var body = new StreamReader(request.Body);\n    string postData = await body.ReadToEndAsync(); // (1)!\n\n    var authHeader = request.Headers[\"Authorization\"]; // (2)!\n    if (authHeader.Count == 0)\n    {\n        return Results.BadRequest(\"Authorization header is required\");\n    }\n    try\n    {\n        VerifyWebhookEvent(authHeader.First(), postData); // (3)!\n    }\n    catch (Exception e)\n    {\n        Console.Error.WriteLine(\"Error validating webhook event: \" + e.Message);\n        return Results.Unauthorized();\n    }\n\n    Console.Out.WriteLine(postData); // (4)!\n    return Results.Ok(); // (5)!\n});\n
                                                                                                                                                                                                    1. The raw string body of the request contains the webhook event.
                                                                                                                                                                                                    2. The Authorization header is required to validate the webhook event.
                                                                                                                                                                                                    3. Verify the webhook event.
                                                                                                                                                                                                    4. Consume the event as you whish.
                                                                                                                                                                                                    5. Return a response to LiveKit Server to let it know that the webhook was received correctly.

                                                                                                                                                                                                    The endpoint receives the incoming webhook event and validates it to ensure it is coming from our LiveKit Server. For that we need the raw string body and the Authorization header of the request. After validating it, we can consume the event (in this case, we just log it), and we must also return a 200 OK response to LiveKit Server to let it know that the webhook was received correctly.

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit, so we need to manually validate the webhook event. The VerifyWebhookEvent method does that:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    void VerifyWebhookEvent(string authHeader, string body)\n{\n    var utf8Encoding = new UTF8Encoding();\n    var tokenValidationParameters = new TokenValidationParameters()\n    {\n        ValidateIssuerSigningKey = true,\n        IssuerSigningKey = new SymmetricSecurityKey(utf8Encoding.GetBytes(LIVEKIT_API_SECRET)), // (1)!\n        ValidateIssuer = true,\n        ValidIssuer = LIVEKIT_API_KEY, // (2)!\n        ValidateAudience = false\n    };\n\n    var jwtValidator = new JwtSecurityTokenHandler();\n    var claimsPrincipal = jwtValidator.ValidateToken(authHeader, tokenValidationParameters, out SecurityToken validatedToken); // (3)!\n\n    var sha256 = SHA256.Create();\n    var hashBytes = sha256.ComputeHash(utf8Encoding.GetBytes(body));\n    var hash = Convert.ToBase64String(hashBytes); // (4)!\n\n    if (claimsPrincipal.HasClaim(c => c.Type == \"sha256\") && claimsPrincipal.FindFirstValue(\"sha256\") != hash)\n    {\n        throw new ArgumentException(\"sha256 checksum of body does not match!\");\n    }\n}\n
                                                                                                                                                                                                    1. Use the LIVEKIT_API_SECRET as the secret key to validate the token.
                                                                                                                                                                                                    2. Set the LIVEKIT_API_KEY as the issuer of the token.
                                                                                                                                                                                                    3. Validate the Authorization header with the recently created TokenValidationParameters. If the LIVEKIT_API_SECRET or LIVEKIT_API_KEY of the LiveKit Server that sent the event do not match the ones in the application, this will throw an exception.
                                                                                                                                                                                                    4. Calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can trust it.

                                                                                                                                                                                                    We need a TokenValidationParameters object from the Microsoft.IdentityModel.Tokens namespace. We use the LIVEKIT_API_SECRET as the symmetric key, and the LIVEKIT_API_KEY as the issuer of the token.

                                                                                                                                                                                                    If method JwtSecurityTokenHandler#ValidateToken does rise an exception when validating the Authorization header, it means the webhook event was sent by a LiveKit Server with different credentials.

                                                                                                                                                                                                    Finally, we calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can definitely trust it.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/","title":"Go Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Go with Gin that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses the LiveKit Go SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/go/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Go app with a single file main.go that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the main.go file:

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    var SERVER_PORT string // (1)!\nvar LIVEKIT_API_KEY string // (2)!\nvar LIVEKIT_API_SECRET string // (3)!\n
                                                                                                                                                                                                    1. The port where the application will be listening
                                                                                                                                                                                                    2. The API key of LiveKit Server
                                                                                                                                                                                                    3. The API secret of LiveKit Server

                                                                                                                                                                                                    The main.go file first declares the necessary global variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    The server launch takes place in the main function at the end of the file, where we first load the environment variables, then set the REST endpoints and finally start the server on SERVER_PORT:

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func main() {\n    loadEnv() // (1)!\n    router := gin.Default() // (2)!\n    router.Use(cors.Default()) // (3)!\n    router.POST(\"/token\", createToken) // (4)!\n    router.POST(\"/livekit/webhook\", receiveWebhook) // (5)!\n    router.Run(\":\" + SERVER_PORT) // (6)!\n}\n
                                                                                                                                                                                                    1. Load environment variables
                                                                                                                                                                                                    2. Create a new Gin router
                                                                                                                                                                                                    3. Enable CORS support
                                                                                                                                                                                                    4. Create the /token endpoint
                                                                                                                                                                                                    5. Create the /livekit/webhook endpoint
                                                                                                                                                                                                    6. Start the server on the SERVER_PORT
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func createToken(context *gin.Context) {\n    var body struct {\n        RoomName        string `json:\"roomName\"`\n        ParticipantName string `json:\"participantName\"`\n    }\n\n    if err := context.BindJSON(&body); err != nil {\n        context.JSON(http.StatusBadRequest, err.Error())\n        return\n    }\n\n    if body.RoomName == \"\" || body.ParticipantName == \"\" {\n        context.JSON(http.StatusBadRequest, gin.H{\"errorMessage\": \"roomName and participantName are required\"})\n        return\n    }\n\n    at := auth.NewAccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) // (1)!\n    grant := &auth.VideoGrant{\n        RoomJoin: true,\n        Room:     body.RoomName,\n    }\n    at.SetVideoGrant(grant).SetIdentity(body.ParticipantName) // (2)!\n\n    token, err := at.ToJWT() // (3)!\n    if err != nil {\n        context.JSON(http.StatusInternalServerError, err.Error())\n        return\n    }\n\n    context.JSON(http.StatusOK, gin.H{\"token\": token}) // (4)!\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    We first load the request body into a struct with roomName and participantName string fields. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Go SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token and return it to the client.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/go/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func receiveWebhook(context *gin.Context) {\n    authProvider := auth.NewSimpleKeyProvider( // (1)!\n        LIVEKIT_API_KEY, LIVEKIT_API_SECRET,\n    )\n    event, err := webhook.ReceiveWebhookEvent(context.Request, authProvider) // (2)!\n    if err != nil {\n        fmt.Fprintf(os.Stderr, \"error validating webhook event: %v\", err)\n        return\n    }\n    fmt.Println(\"LiveKit Webhook\", event) // (3)!\n}\n
                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    3. Consume the event as you whish.

                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    3. Consume the event as you whish.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/","title":"Java Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Java with Spring Boot that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Kotlin SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/java/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Spring Boot app with a single controller Controller.java that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the Controller.java file:

                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @CrossOrigin(origins = \"*\") // (1)!\n@RestController // (2)!\npublic class Controller {\n\n    @Value(\"${livekit.api.key}\")\n    private String LIVEKIT_API_KEY; // (3)!\n\n    @Value(\"${livekit.api.secret}\")\n    private String LIVEKIT_API_SECRET; // (4)!\n\n    ...\n}\n
                                                                                                                                                                                                    1. Allows the application to be accessed from any domain
                                                                                                                                                                                                    2. Marks the class as a controller where every method returns a domain object instead of a view
                                                                                                                                                                                                    3. The API key of LiveKit Server
                                                                                                                                                                                                    4. The API secret of LiveKit Server

                                                                                                                                                                                                    Starting by the top, the Controller class has the following annotations:

                                                                                                                                                                                                    • @CrossOrigin(origins = \"*\"): allows the application to be accessed from any domain.
                                                                                                                                                                                                    • @RestController: marks the class as a controller where every method returns a domain object instead of a view.

                                                                                                                                                                                                    Going deeper, the Controller class has the following fields:

                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server. It is injected from the property livekit.api.key defined in application.properties using the @Value(\"${livekit.api.key}\") annotation.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server. It is injected from the the property livekit.api.secret defined in application.properties using the @Value(\"${livekit.api.secret}\") annotation.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @PostMapping(value = \"/token\")\npublic ResponseEntity<Map<String, String>> createToken(@RequestBody Map<String, String> params) {\n    String roomName = params.get(\"roomName\");\n    String participantName = params.get(\"participantName\");\n\n    if (roomName == null || participantName == null) {\n        return ResponseEntity.badRequest().body(Map.of(\"errorMessage\", \"roomName and participantName are required\"));\n    }\n\n    AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (1)!\n    token.setName(participantName); // (2)!\n    token.setIdentity(participantName);\n    token.addGrants(new RoomJoin(true), new RoomName(roomName)); // (3)!\n\n    return ResponseEntity.ok(Map.of(\"token\", token.toJwt())); // (4)!\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Kotlin SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/java/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @PostMapping(value = \"/livekit/webhook\", consumes = \"application/webhook+json\")\npublic ResponseEntity<String> receiveWebhook(@RequestHeader(\"Authorization\") String authHeader, @RequestBody String body) { // (1)!\n    WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (2)!\n    try {\n        WebhookEvent event = webhookReceiver.receive(body, authHeader); // (3)!\n        System.out.println(\"LiveKit Webhook: \" + event.toString()); // (4)!\n    } catch (Exception e) {\n        System.err.println(\"Error validating webhook event: \" + e.getMessage());\n    }\n    return ResponseEntity.ok(\"ok\");\n}\n
                                                                                                                                                                                                    1. We need the 'Authorization' header and the raw body of the HTTP request.
                                                                                                                                                                                                    2. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    3. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    4. Consume the event as you whish.

                                                                                                                                                                                                    We declare the 'Authorization' header and the raw body of the HTTP request as parameters of the our method. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    Then we initialize a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    Finally we obtain a WebhookEvent object calling method WebhookReceiver#receive. It takes the raw body as a String and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/","title":"Node.js Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Node with Express that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit JS SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/node/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Express app with a single file index.js that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the index.js file:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    import \"dotenv/config\";\nimport express from \"express\";\nimport cors from \"cors\";\nimport { AccessToken, WebhookReceiver } from \"livekit-server-sdk\"; // (1)!\n\nconst SERVER_PORT = process.env.SERVER_PORT || 6080; // (2)!\nconst LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\"; // (3)!\nconst LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\"; // (4)!\n\nconst app = express(); // (5)!\n\napp.use(cors()); // (6)!\napp.use(express.json()); // (7)!\napp.use(express.raw({ type: \"application/webhook+json\" })); // (8)!\n
                                                                                                                                                                                                    1. Import AccessToken from livekit-server-sdk.
                                                                                                                                                                                                    2. The port where the application will be listening.
                                                                                                                                                                                                    3. The API key of LiveKit Server.
                                                                                                                                                                                                    4. The API secret of LiveKit Server.
                                                                                                                                                                                                    5. Initialize the Express application.
                                                                                                                                                                                                    6. Enable CORS support.
                                                                                                                                                                                                    7. Enable JSON body parsing for the /token endpoint.
                                                                                                                                                                                                    8. Enable raw body parsing for the /livekit/webhook endpoint.

                                                                                                                                                                                                    The index.js file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    It also initializes the WebhookReceiver object that will help validating and decoding incoming webhook events.

                                                                                                                                                                                                    Finally the express application is initialized. CORS is allowed, JSON body parsing is enabled for the /token endpoint and raw body parsing is enabled for the /livekit/webhook endpoint.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/token\", async (req, res) => {\n  const roomName = req.body.roomName;\n  const participantName = req.body.participantName;\n\n  if (!roomName || !participantName) {\n    res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n    return;\n  }\n\n  const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, { // (1)!\n    identity: participantName,\n  });\n  at.addGrant({ roomJoin: true, room: roomName }); // (2)!\n  const token = await at.toJwt(); // (3)!\n  res.json({ token }); // (4)!\n});\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit JS SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/node/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const webhookReceiver = new WebhookReceiver( // (1)!\n  LIVEKIT_API_KEY,\n  LIVEKIT_API_SECRET\n);\n\napp.post(\"/livekit/webhook\", async (req, res) => {\n  try {\n    const event = await webhookReceiver.receive(\n      req.body, // (2)!\n      req.get(\"Authorization\") // (3)!\n    );\n    console.log(event); // (4)!\n  } catch (error) {\n    console.error(\"Error validating webhook event\", error);\n  }\n  res.status(200).send();\n});\n
                                                                                                                                                                                                    1. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. The body of the HTTP request.
                                                                                                                                                                                                    3. The Authorization header of the HTTP request.
                                                                                                                                                                                                    4. Consume the event as you whish.

                                                                                                                                                                                                    First of all we initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This object will validate and decode the incoming webhook events.

                                                                                                                                                                                                    The endpoint receives the incoming webhook with the async method WebhookReceiver#receive. It takes the body and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/","title":"PHP Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for PHP that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit PHP SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/php/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple PHP app with a single file index.php that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the index.php file:

                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\nrequire __DIR__ . \"/vendor/autoload.php\";\n\nuse Agence104\\LiveKit\\AccessToken; // (1)!\nuse Agence104\\LiveKit\\AccessTokenOptions;\nuse Agence104\\LiveKit\\VideoGrant;\nuse Agence104\\LiveKit\\WebhookReceiver;\nuse Dotenv\\Dotenv;\n\nDotenv::createImmutable(__DIR__)->safeLoad();\n\nheader(\"Access-Control-Allow-Origin: *\"); // (2)!\nheader(\"Access-Control-Allow-Headers: Content-Type, Authorization\");\nheader(\"Content-type: application/json\");\n\n$LIVEKIT_API_KEY = $_ENV[\"LIVEKIT_API_KEY\"] ?? \"devkey\"; // (3)!\n$LIVEKIT_API_SECRET = $_ENV[\"LIVEKIT_API_SECRET\"] ?? \"secret\"; // (4)!\n
                                                                                                                                                                                                    1. Import all necessary dependencies from the PHP LiveKit library.
                                                                                                                                                                                                    2. Configure HTTP headers for the web server: enable CORS support, allow the Content-Type and Authorization headers and set the response content type to application/json.
                                                                                                                                                                                                    3. The API key of LiveKit Server.
                                                                                                                                                                                                    4. The API secret of LiveKit Server.

                                                                                                                                                                                                    The index.php file imports the required dependencies, sets the HTTP headers for the web server and loads the necessary environment variables:

                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\nif (isset($_SERVER[\"REQUEST_METHOD\"]) && $_SERVER[\"REQUEST_METHOD\"] === \"POST\" && $_SERVER[\"PATH_INFO\"] === \"/token\") {\n    $data = json_decode(file_get_contents(\"php://input\"), true);\n\n    $roomName = $data[\"roomName\"] ?? null;\n    $participantName = $data[\"participantName\"] ?? null;\n\n    if (!$roomName || !$participantName) {\n        http_response_code(400);\n        echo json_encode([\"errorMessage\" => \"roomName and participantName are required\"]);\n        exit();\n    }\n\n    $tokenOptions = (new AccessTokenOptions()) // (1)!\n        ->setIdentity($participantName);\n    $videoGrant = (new VideoGrant()) // (2)!\n        ->setRoomJoin()\n        ->setRoomName($roomName);\n    $token = (new AccessToken($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)) // (3)!\n        ->init($tokenOptions)\n        ->setGrant($videoGrant)\n        ->toJwt();\n\n    echo json_encode([\"token\" => $token]); // (4)!\n    exit();\n}\n
                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit PHP SDK:

                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/php/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\n$webhookReceiver = (new WebhookReceiver($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)); // (1)!\n\nif (isset($_SERVER[\"REQUEST_METHOD\"]) && $_SERVER[\"REQUEST_METHOD\"] === \"POST\" && $_SERVER[\"PATH_INFO\"] === \"/livekit/webhook\") {\n    $headers = getallheaders();\n    $authHeader = $headers[\"Authorization\"]; // (2)!\n    $body = file_get_contents(\"php://input\"); // (3)!\n    try {\n        $event = $webhookReceiver->receive($body, $authHeader); // (4)!\n        error_log(\"LiveKit Webhook:\");\n        error_log(print_r($event->getEvent(), true)); // (5)!\n        exit();\n    } catch (Exception $e) {\n        http_response_code(401);\n        echo \"Error validating webhook event\";\n        echo json_encode($e->getMessage());\n        exit();\n    }\n}\n
                                                                                                                                                                                                    1. Create a new WebhookReceiver object providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. The Authorization header of the HTTP request.
                                                                                                                                                                                                    3. The raw body of the HTTP request as a string.
                                                                                                                                                                                                    4. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    5. Consume the event as you wish.

                                                                                                                                                                                                    We first create a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. Then we must retrieve the Authorization header and the raw body of the HTTP request. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    Finally, we obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request. We can consume the event as we wish (in this case, we just log it using the error output).

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/","title":"Python Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Python with Flask that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Python SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/python/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Flask app with a single file app.py that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the app.py file:

                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    import os\nfrom flask import Flask, request\nfrom flask_cors import CORS\nfrom dotenv import load_dotenv\nfrom livekit.api import AccessToken, VideoGrants, TokenVerifier, WebhookReceiver # (1)!\n\nload_dotenv() # (2)!\n\nSERVER_PORT = os.environ.get(\"SERVER_PORT\", 6080) # (3)!\nLIVEKIT_API_KEY = os.environ.get(\"LIVEKIT_API_KEY\", \"devkey\") # (4)!\nLIVEKIT_API_SECRET = os.environ.get(\"LIVEKIT_API_SECRET\", \"secret\") # (5)!\n\napp = Flask(__name__) # (6)!\n\nCORS(app) # (7)!\n
                                                                                                                                                                                                    1. Import all necessary dependencies from livekit library
                                                                                                                                                                                                    2. Load environment variables from .env file
                                                                                                                                                                                                    3. The port where the application will be listening
                                                                                                                                                                                                    4. The API key of LiveKit Server
                                                                                                                                                                                                    5. The API secret of LiveKit Server
                                                                                                                                                                                                    6. Initialize the Flask application
                                                                                                                                                                                                    7. Enable CORS support

                                                                                                                                                                                                    The app.py file imports the required dependencies and loads the necessary environment variables from .env file using dotenv library:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the Flask application is initialized and CORS support is enabled.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    @app.post(\"/token\")\ndef create_token():\n    room_name = request.json.get(\"roomName\")\n    participant_name = request.json.get(\"participantName\")\n\n    if not room_name or not participant_name:\n        return {\"errorMessage\": \"roomName and participantName are required\"}, 400\n\n    token = (\n        AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!\n        .with_identity(participant_name) # (2)!\n        .with_grants(api.VideoGrants(room_join=True, room=room_name)) # (3)!\n    )\n    return {\"token\": token.to_jwt()} # (4)!\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Python SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/python/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    token_verifier = TokenVerifier(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!\nwebhook_receiver = WebhookReceiver(token_verifier) # (2)!\n\n\n@app.post(\"/livekit/webhook\")\ndef receive_webhook():\n    auth_token = request.headers.get(\"Authorization\") # (3)!\n\n    if not auth_token:\n        return \"Authorization header is required\", 401\n\n    try:\n        event = webhook_receiver.receive(request.data.decode(\"utf-8\"), auth_token) # (4)!\n        print(\"LiveKit Webhook:\", event) # (5)!\n        return \"ok\"\n    except:\n        print(\"Authorization header is not valid\")\n        return \"Authorization header is not valid\", 401\n
                                                                                                                                                                                                    1. Initialize a TokenVerifier using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. Initialize a WebhookReceiver using the TokenVerifier. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    3. Get the 'Authorization' header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the 'Authorization' header.
                                                                                                                                                                                                    5. Consume the event as you whish.

                                                                                                                                                                                                    First of all, we need a WebhookReceiver for validating and decoding incoming webhook events. We initialize it with a TokenVerifier built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    Inside the receive_webhook handler we:

                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the Authorization header. In this way, we can validate the event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    3. If everything is ok, you can consume the event as you whish (in this case, we just log it).

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/","title":"Ruby Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Ruby with Sinatra that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Ruby SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/ruby/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Ruby app using the popular Sinatra web library. It has a single file app.rb that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the app.rb file:

                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    require 'sinatra'\nrequire 'sinatra/cors'\nrequire 'sinatra/json'\nrequire 'livekit' # (1)!\nrequire './env.rb'\n\nSERVER_PORT = ENV['SERVER_PORT'] || 6080 # (2)!\nLIVEKIT_API_KEY = ENV['LIVEKIT_API_KEY'] || 'devkey' # (3)!\nLIVEKIT_API_SECRET = ENV['LIVEKIT_API_SECRET'] || 'secret' # (4)!\n\nset :port, SERVER_PORT # (5)!\n\nregister Sinatra::Cors # (6)!\nset :allow_origin, '*' # (7)!\nset :allow_methods, 'POST,OPTIONS'\nset :allow_headers, 'content-type'\nset :bind, '0.0.0.0' # (8)!\n
                                                                                                                                                                                                    1. Import livekit library
                                                                                                                                                                                                    2. The port where the application will be listening
                                                                                                                                                                                                    3. The API key of LiveKit Server
                                                                                                                                                                                                    4. The API secret of LiveKit Server
                                                                                                                                                                                                    5. Configure the port
                                                                                                                                                                                                    6. Enable CORS support
                                                                                                                                                                                                    7. Set allowed origin (any), methods and headers
                                                                                                                                                                                                    8. Listen in any available network interface of the host

                                                                                                                                                                                                    The app.rb file imports the required dependencies and loads the necessary environment variables (defined in env.rb file):

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the application configures the port, sets the CORS configuration for Sinatra and binds the application to all available network interfaces (0.0.0.0).

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#create-token-endpoint","title":"Create token endpoint","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    post '/token' do\n  body = JSON.parse(request.body.read)\n  room_name = body['roomName']\n  participant_name = body['participantName']\n\n  if room_name.nil? || participant_name.nil?\n    status 400\n    return json({errorMessage: 'roomName and participantName are required'})\n  end\n\n  token = LiveKit::AccessToken.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (1)!\n  token.identity = participant_name # (2)!\n  token.add_grant(roomJoin: true, room: room_name) # (3)!\n\n  return json({token: token.to_jwt}) # (4)!\nend\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Ruby SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/ruby/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    post '/livekit/webhook' do\n  auth_header = request.env['HTTP_AUTHORIZATION'] # (1)!\n  token_verifier = LiveKit::TokenVerifier.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (2)!\n  begin\n    token_verifier.verify(auth_header) # (3)!\n    body = JSON.parse(request.body.read) # (4)!\n    puts \"LiveKit Webhook: #{body}\" # (5)!\n    return\n  rescue => e\n    puts \"Authorization header is not valid: #{e}\"\n  end\nend\n
                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. Create a new TokenVerifier instance providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    3. Verify the Authorization header with the TokenVerifier.
                                                                                                                                                                                                    4. Now that we are sure the event is valid, we can parse the request JSON body to get the actual webhook event.
                                                                                                                                                                                                    5. Consume the event as you whish.

                                                                                                                                                                                                    We need to verify that the event is coming from our LiveKit Server. For that we need the Authorization header from the HTTP request and a TokenVerifier instance built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    If the verification is successful, we can parse the request JSON body and consume the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/","title":"Rust Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Rust with Axum that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses the LiveKit Rust SDK.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"docs/tutorials/application-server/rust/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Rust app with a single file main.rs that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the main.rs file:

                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    use axum::http::HeaderMap;\nuse axum::{\n    extract::Json, http::header::CONTENT_TYPE, http::Method, http::StatusCode, routing::post,\n    Router,\n};\nuse dotenv::dotenv;\nuse livekit_api::access_token::AccessToken; // (1)!\nuse livekit_api::access_token::TokenVerifier;\nuse livekit_api::access_token::VideoGrants;\nuse livekit_api::webhooks::WebhookReceiver;\nuse serde_json::{json, Value};\nuse std::env;\nuse tokio::net::TcpListener;\nuse tower_http::cors::{Any, CorsLayer};\n\n#[tokio::main]\nasync fn main() {\n    dotenv().ok(); // (2)!\n\n    let server_port = env::var(\"SERVER_PORT\").unwrap_or(\"6081\".to_string());\n\n    let cors = CorsLayer::new() // (3)!\n        .allow_methods([Method::POST])\n        .allow_origin(Any)\n        .allow_headers([CONTENT_TYPE]);\n\n    let app = Router::new() // (4)!\n        .route(\"/token\", post(create_token))\n        .route(\"/livekit/webhook\", post(receive_webhook))\n        .layer(cors);\n\n    let listener = tokio::net::TcpListener::bind(\"0.0.0.0:\".to_string() + &server_port)\n        .await\n        .unwrap();\n    axum::serve(listener, app).await.unwrap(); // (5)!\n}\n
                                                                                                                                                                                                    1. Import all necessary dependencies from the Rust LiveKit library.
                                                                                                                                                                                                    2. Load environment variables from .env file.
                                                                                                                                                                                                    3. Enable CORS support.
                                                                                                                                                                                                    4. Define /token and /livekit/webhook endpoints.
                                                                                                                                                                                                    5. Start the server listening on the specified port.

                                                                                                                                                                                                    The main.rs file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Then CORS support is enabled and the endpoints are defined. Finally the axum application is initialized on the specified port.

                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#create-token-endpoint","title":"Create token endpoint","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<Value>) {\n    if let Some(payload) = payload {\n        let livekit_api_key = env::var(\"LIVEKIT_API_KEY\").unwrap_or(\"devkey\".to_string());\n        let livekit_api_secret = env::var(\"LIVEKIT_API_SECRET\").unwrap_or(\"secret\".to_string());\n\n        let room_name = match payload.get(\"roomName\") {\n            Some(value) => value,\n            None => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    Json(json!({ \"errorMessage\": \"roomName is required\" })),\n                );\n            }\n        };\n        let participant_name = match payload.get(\"participantName\") {\n            Some(value) => value,\n            None => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    Json(json!({ \"errorMessage\": \"participantName is required\" })),\n                );\n            }\n        };\n\n        let token = match AccessToken::with_api_key(&livekit_api_key, &livekit_api_secret) // (1)!\n            .with_identity(&participant_name.to_string()) // (2)!\n            .with_name(&participant_name.to_string())\n            .with_grants(VideoGrants { // (3)!\n                room_join: true,\n                room: room_name.to_string(),\n                ..Default::default()\n            })\n            .to_jwt() // (4)!\n        {\n            Ok(token) => token,\n            Err(_) => {\n                return (\n                    StatusCode::INTERNAL_SERVER_ERROR,\n                    Json(json!({ \"errorMessage\": \"Error creating token\" })),\n                );\n            }\n        };\n\n        return (StatusCode::OK, Json(json!({ \"token\": token }))); // (5)!\n    } else {\n        return (\n            StatusCode::BAD_REQUEST,\n            Json(json!({ \"errorMessage\": \"roomName and participantName are required\" })),\n        );\n    }\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    5. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Rust SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    5. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"docs/tutorials/application-server/rust/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    async fn receive_webhook(headers: HeaderMap, body: String) -> (StatusCode, String) {\n    let livekit_api_key = env::var(\"LIVEKIT_API_KEY\").unwrap_or(\"devkey\".to_string());\n    let livekit_api_secret = env::var(\"LIVEKIT_API_SECRET\").unwrap_or(\"secret\".to_string());\n    let token_verifier = TokenVerifier::with_api_key(&livekit_api_key, &livekit_api_secret); // (1)!\n    let webhook_receiver = WebhookReceiver::new(token_verifier); // (2)!\n\n    let auth_header = match headers.get(\"Authorization\") { // (3)!\n        Some(header_value) => match header_value.to_str() {\n            Ok(header_str) => header_str,\n            Err(_) => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    \"Invalid Authorization header format\".to_string(),\n                );\n            }\n        },\n        None => {\n            return (\n                StatusCode::BAD_REQUEST,\n                \"Authorization header is required\".to_string(),\n            );\n        }\n    };\n\n    match webhook_receiver.receive(&body, auth_header) { // (4)!\n        Ok(event) => {\n            println!(\"LiveKit WebHook: {:?}\", event); // (5)!\n            return (StatusCode::OK, \"ok\".to_string());\n        }\n        Err(_) => {\n            return (\n                StatusCode::UNAUTHORIZED,\n                \"Error validating webhook event\".to_string(),\n            );\n        }\n    }\n}\n
                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    3. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    5. Consume the event as you wish.

                                                                                                                                                                                                    We declare as function parameters the map of headers (headers: HeaderMap) and the raw body (body: String) of the HTTP request. We will need both of them to validate and decode the incoming webhook event. We then:

                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    3. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    5. Consume the event as you wish (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/","title":"Angular Components","text":""},{"location":"docs/ui-components/angular-components/#introduction","title":"Introduction","text":"

                                                                                                                                                                                                    Angular Components are the simplest way to create real-time videoconferencing apps with Angular. There's no need to manage state or low-level events; Angular Components from OpenVidu handle all the complexity for you.

                                                                                                                                                                                                    This Angular library, offers developers a robust set of powerful and comprehensive videoconferencing components. These components are highly adaptable, extendable, and easily replaceable, allowing you to tailor them to your application's specific requirements.

                                                                                                                                                                                                    Angular Components

                                                                                                                                                                                                    The primary goal of the OpenVidu team is to minimize the developer's effort when creating videoconferencing applications. Angular Components significantly contribute to this objective for several reasons:

                                                                                                                                                                                                    • Rapid Development

                                                                                                                                                                                                      Abstracts the complexity of videoconferencing applications, allowing you to focus on customizations

                                                                                                                                                                                                    • Flexible Customization

                                                                                                                                                                                                      Offers maximum customization flexibility, allowing you to adapt, extend, and replace any component

                                                                                                                                                                                                    • Easy Maintenance

                                                                                                                                                                                                      Ensures your code remains up to date, making it easier to update your application with each new OpenVidu release

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#how-to-use","title":"How to use","text":"

                                                                                                                                                                                                    Using Angular Components in your application is straightforward. The official Angular Components Tutorials cover everything Angular Components offers, from customizing colors and branding logos to injecting new custom features.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#featured-components","title":"Featured Components","text":"
                                                                                                                                                                                                    • Videoconference

                                                                                                                                                                                                      The Videoconference component is the core of Angular Components. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • Panel

                                                                                                                                                                                                      The Panel components is the root of side panels in the videoconference. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#prefabricated-components","title":"Prefabricated Components","text":"

                                                                                                                                                                                                    Angular Components provides a wide range of prefabricated components that you can use to build your videoconferencing application in a matter of minutes. These components are designed for direct use without any extensions or modifications.

                                                                                                                                                                                                    Toolbar Layout Stream ChatPanel ParticipantsPanel ParticipantPanelItem ActivitiesPanel RecordingActivity BroadcastingActivity AdminLogin AdminDashboard"},{"location":"docs/ui-components/angular-components/#directives","title":"Directives","text":"

                                                                                                                                                                                                    Angular Components provides two types of directives: Structural Directives and Attribute Directives.

                                                                                                                                                                                                    • Structural Directives: These directives manipulate the DOM by adding or removing elements from the view.

                                                                                                                                                                                                      They are distinguished by the asterisk (*) prefix and must be placed inside an HTML element within any Featured Component.

                                                                                                                                                                                                      For example, the *ovToolbar directive allows you to add a custom toolbar to the videoconference, replacing the default one.

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                    • Attribute Directives: Commonly known as Components Inputs, allow you to manipulate the appearance or behavior of an element.

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#events","title":"Events","text":"

                                                                                                                                                                                                    Each component in Angular Components emits a set of events that you can listen to in your application to trigger specific actions.

                                                                                                                                                                                                    These events are designed to provide you with the flexibility to customize your videoconferencing application according to your requirements.

                                                                                                                                                                                                    You can check out all component events in the Angular Components API Reference.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#applications","title":"Applications","text":"

                                                                                                                                                                                                    A practical example showcases the potential of Angular Components is our production-ready flagship application, OpenVidu Call. This application is built using Angular Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/angular-components/#references","title":"References","text":"
                                                                                                                                                                                                    • Angular Components API Reference
                                                                                                                                                                                                    "},{"location":"docs/ui-components/react-components/","title":"React Components","text":""},{"location":"docs/ui-components/react-components/#introduction","title":"Introduction","text":"

                                                                                                                                                                                                    React Components are the simplest way to create real-time audio/video applications with React. There's no need to manage state or low level events, React Components from LiveKit handle all the complexity for you.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/react-components/#featured-components","title":"Featured Components","text":"

                                                                                                                                                                                                    A curated set of components that we believe are essential and serve as a solid foundation for most applications.

                                                                                                                                                                                                    • LiveKitRoom

                                                                                                                                                                                                      It provides the Room context to all its children, serving as the root component of your application, and also exposes the Room state through a React context.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • RoomAudioRenderer

                                                                                                                                                                                                      It manages remote participants' audio tracks and ensures that microphones and screen sharing are audible. It also provides a way to control the volume of each participant.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • TrackLoop

                                                                                                                                                                                                      Provides an easy way to loop through all participant camera and screen tracks. For each track, TrackLoop creates a TrackRefContext that you can use to render the track.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    "},{"location":"docs/ui-components/react-components/#prefabricated-components","title":"Prefabricated Components","text":"

                                                                                                                                                                                                    Prefabricated are constructed using components and enhanced with additional functionalities, unique styles, and practical defaults. They are designed for immediate use and are not meant to be extended.

                                                                                                                                                                                                    AudioConference Chat ControlBar MediaDeviceMenu PreJoin VideoConference"},{"location":"docs/ui-components/react-components/#contexts","title":"Contexts","text":"

                                                                                                                                                                                                    Contexts are used to allow child components to access parent state without having to pass it down the component tree via props

                                                                                                                                                                                                    Participant Room Chat Feature Layout Pin TrackRef"},{"location":"docs/ui-components/react-components/#hooks","title":"Hooks","text":"

                                                                                                                                                                                                    Hooks are functions that let you use state and other React features without writing a class. They are functions that let you \u201chook into\u201d React state and lifecycle features from function components.

                                                                                                                                                                                                    React Components provides a set of hooks that you can use to interact with the components and the underlying LiveKit client.

                                                                                                                                                                                                    See Reference

                                                                                                                                                                                                    "},{"location":"docs/ui-components/react-components/#applications","title":"Applications","text":"

                                                                                                                                                                                                    A practical example showcases the potential of React Components is the production-ready flagship application, LiveKit Meet. This application is built using React Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    "},{"location":"docs/ui-components/react-components/#references","title":"References","text":"
                                                                                                                                                                                                    • React Components
                                                                                                                                                                                                    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"/","title":"Home","text":"
                                                                                                                                                                                                    • Ready to use app

                                                                                                                                                                                                      You get OpenVidu Call with every OpenVidu installation.A fully-fledged videoconference application with all the features you expect: multiparty, device selection, screen share, chat, recording, virtual background and more!

                                                                                                                                                                                                    • All is customizable

                                                                                                                                                                                                      If you want to integrate OpenVidu into your own application, there are UI Components that are quickly to setup but also highly customizable. If you want total control, you can use SDKs to fine-tune the integration of OpenVidu in your app. Learn more at Developing your OpenVidu app.

                                                                                                                                                                                                    • Self-hosted

                                                                                                                                                                                                      OpenVidu is designed from the ground up to be self-hosted in your own servers. With OpenVidu you can easily deploy and manage a production-ready live-video solution in your own infrastructure, whether it is on premises or in your favorite cloud provider. Leverage your hardware and regain control of your users' data!

                                                                                                                                                                                                    • Professional support

                                                                                                                                                                                                      We are experts in WebRTC. We have been developing real time tools and supporting customers building their solutions for over a decade. Let's work together to make your project a success! Contact us now.

                                                                                                                                                                                                    • Easy to deploy

                                                                                                                                                                                                      What could take a whole DevOps team days of work, with OpenVidu you can have it ready in minutes: an easy installation, configuration and administration experience to your self-hosted, production grade, real-time solution. Install now.

                                                                                                                                                                                                    • Cost effective

                                                                                                                                                                                                      OpenVidu COMMUNITY is open source, free and can handle a significant user load. With OpenVidu PRO you can handle more simultaneous Rooms in the same hardware thanks to mediasoup integration. This allows reducing the cost of each Room, making OpenVidu PRO truly cost-effective as a self-hosted solution. See Pricing.

                                                                                                                                                                                                    • Performant

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                    • Scalable

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                    • Fault tolerant

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                    • Observable

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                    • WebRTC

                                                                                                                                                                                                      Achieve ultra-low latency in your videoconference or live streaming app thanks to WebRTC.

                                                                                                                                                                                                    • Security at all levels

                                                                                                                                                                                                      E2E encryption, fine-grained access control and highly secure deployments for the most demanding security requirements.

                                                                                                                                                                                                    • Multiplatform

                                                                                                                                                                                                      Chrome, Firefox, Safari, Android, iOS, Unity, Windows, MacOS, Linux... OpenVidu is compatible with all of them.

                                                                                                                                                                                                    • Up to 4K video and HQ audio

                                                                                                                                                                                                      HD up to 4K video resolution, and crisp audio quality with noise cancellation and echo suppression.

                                                                                                                                                                                                    • Recording

                                                                                                                                                                                                      Record your videocalls with complete freedom. You can use predefined layouts or easily build your own.

                                                                                                                                                                                                    • Broadcast to YouTube/Twitch

                                                                                                                                                                                                      OpenVidu allows you to easily broadcast your sessions to live-streaming platforms such as YouTube or Twitch.

                                                                                                                                                                                                    • Screen sharing

                                                                                                                                                                                                      Screen share from browsers or native applications with ease, always with the best quality.

                                                                                                                                                                                                    • Virtual Backgrounds

                                                                                                                                                                                                      Apply effects to your videos, blurring the background or replacing it with an image.

                                                                                                                                                                                                    • Server side processing

                                                                                                                                                                                                      For the most advanced use cases: you can add pipelines to process video and audio streams in real time in your servers.

                                                                                                                                                                                                    Build, deploy on-premises and scale your videoconferencing or live streaming app with ease. Contact us if you need it : we are here to help! Talk to an expert"},{"location":"#get-started","title":"Create your real-time video and audio application with ease","text":""},{"location":"#get-started","title":"Self-host a production-ready live-video platform with advanced capabilities typically reserved for SaaS solutions","text":""},{"location":"#get-started","title":"All the features you need to quickly build your perfect real-time application","text":""},{"location":"/account/","title":"Account","text":""},{"location":"/pricing/","title":"Pricing","text":""},{"location":"/pricing/#pricing","title":"Pricing","text":"OpenVidu COMMUNITY OpenVidu PRO Price Free 0.0006$ core/minuteFree while in beta! * Type of deployment OpenVidu Single Node OpenVidu Elastic OpenVidu High Availability Suitability For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install

                                                                                                                                                                                                    About OpenVidu Pro free beta period

                                                                                                                                                                                                    • OpenVidu Pro is currently in beta and will remain completely free until GA.
                                                                                                                                                                                                    • All users running a beta version of OpenVidu Pro will be notified weeks before the free beta period ends, giving time to upgrade to the final GA version if desired.
                                                                                                                                                                                                    • Active OpenVidu Pro clusters in beta version will eventually shut down automatically after the free beta period ends.
                                                                                                                                                                                                    "},{"location":"/pricing/#how-is-openvidu-pro-priced","title":"How is OpenVidu Pro priced?There is a 15-day free trial period waiting for you!","text":"

                                                                                                                                                                                                    OpenVidu Pro follows a simple pricing model based on the number of cores used by the OpenVidu Pro cluster:

                                                                                                                                                                                                    $0.0006 per core per minute available for your OpenVidu PRO cluster

                                                                                                                                                                                                    Taking into account the following points:

                                                                                                                                                                                                    • You only pay for your OpenVidu Pro cluster(s) for the time they are running. Usage will be registered the moment you start your cluster and will stop as soon as you shut your cluster down. When turned on, your cluster will be charged even in idle state (without active Rooms).
                                                                                                                                                                                                    • You pay for every available core at any given time: if you cluster grows for one hour, that hour you will pay more. If your cluster decreases the next hour, next hour will be cheaper. Master Nodes and Media Nodes have the same core per minute price.
                                                                                                                                                                                                    • Your OpenVidu Pro cluster(s) need to allow outbound traffic to domain accounts.openvidu.io port 443. If you are behind a very restrictive corporate firewall that doesn't allow this, please contact us through commercial@openvidu.io.
                                                                                                                                                                                                    Get an OpenVidu License"},{"location":"/pricing/#why-is-openvidu-pro-priced-like-this","title":"Why is OpenVidu Pro priced like this?","text":"

                                                                                                                                                                                                    There are deliberate reasons for this pricing model in OpenVidu Pro:

                                                                                                                                                                                                    • We believe that a platform specifically designed to be self-hosted should have a pricing model that is as close to hardware as possible: that is the total number of cores available to the cluster over time.
                                                                                                                                                                                                    • This pricing model is simple, transparent and easy to predict: you pay only for the time the cluster is running and always according to its size.
                                                                                                                                                                                                    • The cost is directly proportional to the size of your cluster: larger clusters pay more, smaller clusters pay less.
                                                                                                                                                                                                    • Elasticity is encouraged: adjust the size of your cluster according to the load at any given time to minimize costs.
                                                                                                                                                                                                    "},{"location":"/pricing/#when-and-how-are-you-charged","title":"When and how are you charged?","text":"

                                                                                                                                                                                                    Users must create an OpenVidu account and get an OpenVidu License. This license will be required to deploy an OpenVidu Pro cluster (OpenVidu Elastic or OpenVidu High Availability).

                                                                                                                                                                                                    When purchasing an OpenVidu License, you will have to indicate your billing address and a credit card. You will receive a 15-day free trial period during which you will not be charged at all.

                                                                                                                                                                                                    After the free trial period, a monthly billing cycle will charge all your expenses to your credit card. Therefore, you will receive an invoice each month. You can review your upcoming expenses and your past invoices in your OpenVidu account page. And don't worry: we don't store any credit card data. The entire billing process is securely done via Stripe.

                                                                                                                                                                                                    OpenVidu Pro clusters will automatically report their usage on a recurring basis. That's why they need outbound access to domain accounts.openvidu.io port 443. If you are behind a very restrictive corporate firewall that doesn't allow this, please contact us through commercial@openvidu.io.

                                                                                                                                                                                                    "},{"location":"/pricing/#pricing-examples","title":"Pricing examplesThere is a 15-day free trial period waiting for you!","text":"

                                                                                                                                                                                                    As explained above, every minute of an OpenVidu Pro cluster is charged according to the number of cores available for the cluster. So let's see some actual examples, first noting the following points:

                                                                                                                                                                                                    • The examples represent a continuous usage of the cluster, but remember that you can shut it down whenever you are not using it and that you can drop nodes to save resources.
                                                                                                                                                                                                    • Each example shows in a table the price for 8 hours, 1 day and 1 month of continuous usage, as well as the approximated amount of video Tracks and Rooms of 8 participants the cluster would support. This is done to provide a basic insight into the capacity of each cluster. These 8-to-8 Rooms assume 64 video Tracks (640x480) and 64 audio Tracks in them (2 tracks published and 14 tracks subscribed per Participant), with no Egress, Ingress or other additional features.
                                                                                                                                                                                                    Get an OpenVidu License"},{"location":"/pricing/#openvidu-elastic-with-12-cores-in-total","title":"OpenVidu Elastic with 12 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster has 1 Master Node of 4 cores and 2 Media Nodes of 4 cores each.

                                                                                                                                                                                                    Number of video Tracks 2000 Number of Rooms with 8 Participants 250 8 hours $3.46 24 hours (1 day of uninterrupted use) $10.37 720 hours (1 month of uninterrupted use) $311.04"},{"location":"/pricing/#openvidu-elastic-with-20-cores-in-total","title":"OpenVidu Elastic with 20 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster has 1 Master Node of 4 cores and 4 Media Nodes of 4 cores each.

                                                                                                                                                                                                    Number of video Tracks 4000 Number of Rooms with 8 Participants 500 8 hours $5.76 24 hours (1 day of uninterrupted use) $17.28 720 hours (1 month of uninterrupted use) $518.40"},{"location":"/pricing/#openvidu-high-availability-with-32-cores-in-total","title":"OpenVidu High Availability with 32 cores in total","text":"

                                                                                                                                                                                                    This OpenVidu Pro HA cluster has 4 Master Nodes of 4 cores each and 4 Media Nodes of 4 cores each. The number of simultaneous Rooms and Tracks will be the same as in the previous example, but this cluster will provide fault tolerance thanks to the replication of the Master Nodes.

                                                                                                                                                                                                    Number of video Tracks 4000 Number of Rooms with 8 Participants 500 8 hours $9.21 24 hours (1 day of uninterrupted use) $27.65 720 hours (1 month of uninterrupted use) $829.44"},{"location":"/pricing/#openvidu-elastic-with-a-variable-number-of-cores","title":"OpenVidu Elastic with a variable number of cores","text":"

                                                                                                                                                                                                    This OpenVidu Pro Elastic cluster takes advantage of the elasticity of the platform. It has a fixed Master Node of 4 cores, but a variable number of Media Nodes. Let's imagine a scenario where our days are divided in three phases according to the user load:

                                                                                                                                                                                                    • First 8 hours of the day the demand is low. 1 Media Node of 4 cores is enough to handle it.
                                                                                                                                                                                                    • The next 8 hours of the day the user load increases significantly (this is very typical if our application is used more during working hours). We add another Media Node of 8 cores to handle this new demand.
                                                                                                                                                                                                    • The last 8 hours of the day the demand decreases, and we are able to remove the Media Node of 8 cores and keep only the Media Node of 4 cores.
                                                                                                                                                                                                    First 8 hours of the day with low demand(8 cores in total) Video Tracks1000 8x8 Rooms125Price$2.30 Next 8 hours of the day with high demand(16 cores in total) Price$4.61 Video Tracks3000 8x8 Rooms375 Last 8 hours of the day with low demand(8 cores in total) Price$2.30 Video Tracks1000 8x8 Rooms125 Total for 1 day $9.21 Total for 1 month $276.30"},{"location":"/support/","title":"Support","text":"

                                                                                                                                                                                                    Self-hosting your own solutions can be challenging. We have built OpenVidu to make this task as easy as possible. But of course you may encounter difficulties in the process, or your particular use case may require customized assistance. The OpenVidu team specializes in customer support. Together we will make your project a success!

                                                                                                                                                                                                    "},{"location":"/support/#commercial-support","title":"Commercial support","text":"

                                                                                                                                                                                                    Do not hesitate to contact us at commercial@openvidu.io. We provide consultancy, prioritizing bug fixes or new features, custom app development, etc.

                                                                                                                                                                                                    Let's work together and build something great!

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Do you need help updating from OpenVidu 2 to OpenVidu 3? Write us to pro.support.v2apps@openvidu.io and we will be happy to guide you through the process.

                                                                                                                                                                                                    "},{"location":"/support/#community-support","title":"Community support","text":"

                                                                                                                                                                                                    The public forum is the right place to ask any questions that do not involve private information, so that the whole community can benefit from the exchange of ideas.

                                                                                                                                                                                                    "},{"location":"/blog/","title":"Blog","text":""},{"location":"/conditions/cookie-policy/","title":"Cookie Policy","text":""},{"location":"/conditions/cookie-policy/#what-are-cookies","title":"What are cookies?","text":"

                                                                                                                                                                                                    TIKAL TECHNOLOGIES SL web page uses cookies, which are small files that it exchanges with the visitor's web browser for different purposes. That is done in a totally \"invisible\" and harmless way for the visitor, so your visit to the page is more fluid and you are not interrupted by some functions. The following explains which is the usage of cookies in TIKAL TECHNOLOGIES SL website and how you can disable them if you don't agree.

                                                                                                                                                                                                    "},{"location":"/conditions/cookie-policy/#what-kind-of-information-do-we-collect","title":"What kind of information do we collect?","text":"

                                                                                                                                                                                                    TIKAL TECHNOLOGIES SL web page uses cookies for the following purposes

                                                                                                                                                                                                    • Functional cookies: they are used to improve the visitor's navigation through the website, making it more user-friendly. It is important to understand that cookies do not contain any kind of specific personal information, and most of them are deleted from the hard disk at the end of the browser session.
                                                                                                                                                                                                    • Analytical Cookies: TIKAL TECHNOLOGIES SL website uses cookies from Google Analytics, to analyze how visitors use the page. This way, TIKAL TECHNOLOGIES SL can offer improvements in the usability of the webpage. Google Analytics only collects and processes anonymous data through the TIKAL TECHNOLOGIES SL website. There is further information about the management of Google Analytics' web analysis services at www.google.com/analytics.
                                                                                                                                                                                                    "},{"location":"/conditions/cookie-policy/#how-are-users-able-to-change-the-cookies-configuration-in-their-browsers","title":"How are users able to change the cookies configuration in their browsers?","text":"

                                                                                                                                                                                                    Any browser allows you to make adjustments on the actions to perform whenever a website asks you to store a cookie. You can:

                                                                                                                                                                                                    • Allow web pages to deposit cookies in the browser.
                                                                                                                                                                                                    • Allow the cookies of the visited web pages only to remain in the browser as long as the page remains open.
                                                                                                                                                                                                    • Do not allow web pages to deposit cookies in the browser. Please note that in this case, some website functions will not be operational or the full page could even not work at all.
                                                                                                                                                                                                    • Allow one by one which web pages will be able to deposit cookies in the browser. Please note that in unauthorized pages some website functions will not be operational or the full page could even not work at all.

                                                                                                                                                                                                    The modification of the cookies configuration can be done in the option \"Configuration\" of the browser, in the \"Privacy\" section.

                                                                                                                                                                                                    "},{"location":"/conditions/privacy-policy/","title":"Privacy Policy","text":"

                                                                                                                                                                                                    In accordance with the provisions of Regulation (EU) 2016/679 and the Organic Law 3/2018 of 5 December, on the protection of personal data and guarantee of digital rights, we inform you that the data you provide will be incorporated to the treatment system owned by TIKAL TECHNOLOGIES SL with CIF B85986669 and address at Calle Chile, N\u00ba 10, 28290 - Las Rozas de Madrid (Madrid), for the purpose of ELECTRONIC COMMERCE, CUSTOMER MANAGEMENT, AND OTHER PURPOSES. Your data may be processed by third parties (they will be data processors recipients of your data for contractual purposes for example, our computer maintenance company) requiring the same level of established rights, obligations and responsibilities. Your details will be kept for the time only strictly necessary. They will be deleted when a period of time has elapsed without any use being made of it. You agree to notify us of any changes in the data. You will be able to exercise your access rights, rectification, limitation of treatment, deletion, portability and opposition to processing of your personal data by addressing your request to the management or to the e-mail info@naevatec.com. You can contact the appropriate supervisory authority to make any complaint you may consider necessary.

                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/","title":"Terms of Service","text":"

                                                                                                                                                                                                    The purpose of the following terms and conditions is to explain our obligations as providers of the service, as well as your obligations as a client. Please read them carefully.

                                                                                                                                                                                                    The aforementioned terms and conditions shall be applied from the moment TIKAL TECHNOLOGIES provides you with access to the service, thus it is understood that you have voluntarily accepted them as part of the contractual obligations between the parties involved, that is, between TIKAL TECHNOLOGIES (TIKAL form now on) and you as client. OpenVidu PRO is a service which will vary with time, so as to adapt to its clients and users\u00b4 new requirements, which in turn, will likely affect the terms and conditions so that they suit the changes and variations made to TIKAL.

                                                                                                                                                                                                    TIKAL reserves the right to change the terms and conditions at any given moment, notwithstanding, it shall always endeavour to communicate these via e-mail or through the application itself; consequently, we strongly advise you to ensure that you have read and understood the terms and conditions whose most recent, updated version, is available on our website.

                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#first-definitions","title":"First. Definitions.","text":"

                                                                                                                                                                                                    For the legal purposes of this contract, the following definitions will apply:

                                                                                                                                                                                                    1. Software application: a set of instructions which will be interpreted, utilized and executed by a computer system. Even when there may be many of them, the present contract may refer to them in singular, and likewise when pertaining to its backup files.
                                                                                                                                                                                                    2. Telematics application: a software application within a server which is connected to the Internet such that it can be accessed remotely through electronic networks. The assignment of the license to use the telematics application OpenVidu PRO is the subject of the present contract.
                                                                                                                                                                                                    3. Client of the telematics application: the natural or legal person who benefits from the licence to use the telematics application, thus assuming all obligations arising from the present contract.
                                                                                                                                                                                                    4. User of the telematics application: the natural person authorized by the client to use the telematics application, who in turn assumes all obligations arising from the present contract and said utilization.
                                                                                                                                                                                                    5. Parties: TIKAL and the client.
                                                                                                                                                                                                    6. Exploitation rights over the telematics application: TIKAL TECHNOLOGIES SL
                                                                                                                                                                                                    7. Third parties: any natural or legal person alien to the present contractual relation, who, for any reason, enters into a formal, legally binding agreement with either TIKAL or the client.
                                                                                                                                                                                                    8. The service, all supporting infrastructure provided by TIKAL that allows the client to register, download, provision bill, and operate its instance of the telematics application
                                                                                                                                                                                                    9. Hardware: electronic, mechanic or magnetic devices necessary for the telematics application, and its complementary parts, to work properly.
                                                                                                                                                                                                    10. Personal data: any information regarding an identified or identifiable natural person.
                                                                                                                                                                                                    11. Updates: new versions of the telematics application and/or its modules, which include new functionalities and improvements when compared to earlier versions.
                                                                                                                                                                                                    12. Telematics application modules: parts of the telematics application which manage specific functionalities, and whose licence to use them, the client must acquire separately.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#second-purpose","title":"Second. Purpose","text":"
                                                                                                                                                                                                    1. The purpose of the present contract is the licensing of the right to use the telematics application OpenVidu PRO by TIKAL TECHNOLOGIES SL. to the client, so that it may be use in the management of their business. Subject to the terms and conditions provided in this agreement, TIKAL hereby grants to the client a non-exclusive, non-sublicensable, non-transferable license to use the telematics application OpenVidu PRO (from now on \u201ctelematics application\u201d). Under no circumstances however, does said licence grant the client sales rights over the telematics application whose ownership remains entirely with TIKAL TECHNOLOGIES SL.
                                                                                                                                                                                                    2. The client\u00b4s rights to use the telematics application are subjected and limited by both the duration, and the terms and conditions established in the present contract.
                                                                                                                                                                                                    3. Hereby the client agrees to use the telematics application in compliance with the law, the present contract, and the good and rational will inherently present in any civilized society.
                                                                                                                                                                                                    4. The client acknowledges having examined that OpenVidu PRO features fulfil their needs, and that it has been appropriately informed by TIKAL about them.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#third-use-limitations-and-duty-of-care","title":"Third. Use limitations and duty of care.","text":"
                                                                                                                                                                                                    1. The client must protect and guard the telematics application; thus, it may not share any information whatsoever with third parties. It is specifically forbidden the use of the telematics application outside the business sphere for which it has been acquired, or outside any of the dispositions stipulated in this contract. The client may not sell, lease, transfer, or otherwise sublicense the telematics application or take part in any act which may result in the violation of their duty of care and protection. The client may not assign, transfer, pledge or make any other disposition of the rights acquired through this contract, of any part of the contract, or of any of the rights, claims or obligations under the contract.
                                                                                                                                                                                                    2. The client is obligated to refrain from using the telematics application for illegal purposes or any other purposes contrary to what is established in the present contract, or any action that may be injurious to TIKAL\u00b4s rights and interests, to the owner of the telematics application, as well as to any third parties involved. Said actions include, but are not limited to, any deed that may harm, overload, disrupt, or otherwise render useless the telematics application, thus preventing other clients and users from making use of it.
                                                                                                                                                                                                    3. Changes to the telematics application are strictly forbidden. These include, but are not limited to, such things as reverse engineering, decompiling, disassembling, reproducing, translating, modifying, commercializing, cloning, transforming or transmitting to any natural or legal person, partially or entirely, by any means, whether mechanic, magnetic, photocopies, etc\u2026 or to eliminate or block any proprietary notice or logos pertaining to the telematics application. The components and elements subject to the aforementioned restrictions include, but are not limited to, such things as the logical diagrams, source codes, object and/or data model; except prior, written authorization from TIKAL. These restrictions stand, even when said actions where needed for the interoperability with other computer programs or telematics applications.
                                                                                                                                                                                                    4. The client or the user must protect and safeguard, both physically and intellectually, the telematics application, namely, its contents, logical procedures, and access protocols, by establishing the necessary means in order to guarantee the non-disclosure, cloning, reproduction, altering, translation, transformation, access by third parties, or any other action that shall imply a violation of the duty of care or of any intellectual and industrial property right.
                                                                                                                                                                                                    5. The telematics application may only be used by the client or authorized user, for processing the client\u00b4s own data and their products, but under no circumstances shall it be used to process third parties \u2018data.
                                                                                                                                                                                                    6. TIKAL cannot guarantee uninterrupted access to the service throughout the entire validity period of this contract due to unforeseeable factors such as network issues, telecommunications service providers, breakdown in computers, as well as other contingencies such as repair and maintenance work, and software updates. Notwithstanding this, TIKAL reserves the right to adopt any necessary measures to limit the service, should it be considered that improper and/or irresponsible use of the telematics application is occurring, specially when said uses run counter to the terms and conditions provided in the present contract.
                                                                                                                                                                                                    7. Should the client or user breach the terms of contract, in a continuous and sustained fashion, or acting in bad faith, TIKAL shall terminate the provision of the service, without reimbursing any amount, on the grounds of abusive and improper use.
                                                                                                                                                                                                    8. Interpretation and scope. Any other right which has not been stated or directly mentioned in the present contract, remains reserved to TIKAL. Under no circumstances shall the terms and conditions of this contract be interpreted or applied in such a fashion that could be injurious to TIKAL or in any manner that runs counter to the regular exploitation framework of a telematics application.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#fourth-liability","title":"Fourth. Liability.","text":"
                                                                                                                                                                                                    1. TIKAL\u00b4s telematics application is access-ready in its current state and configuration. Should the application contain any deficiency attributable to TIKAL TECHNOLOGIES SL, the latter pledges to make use of all the resources available to them in order to solve the issue as promptly as possible. Nonetheless, it declines any liability and does not give any guarantee regarding violations perpetrated by third parties, marketability, satisfactory quality or suitability for a specific purpose.
                                                                                                                                                                                                    2. TIKAL shall act with due diligence and professionalism by making use of all its resources available so as to ensure the quality, reliability, and security of the telematics application. In any case, TIKAL\u00b4s assumes no liability for any damages, direct or indirect, incidental or special, including, but not limited to, such things as damages or financial loss, work disruptions, failure, breakdown, or any losses, even when the possibility of such inconveniences occurring, which include third-party complaints, were previously notified to a member of TIKAL\u00b4s staff.
                                                                                                                                                                                                    3. The client accepts, within reason, to tolerate specific, isolated disruptions in connectivity and hereby forfeits the right to claim any liability, contractual or otherwise, as well as damages owing to possible failures, slowness or access errors. TIKAL declines any liability concerning data loss, accidental or otherwise, resulting from the client\u00b4s actions or activities.
                                                                                                                                                                                                    4. The client or user is solely responsible for the provision and payment of the costs necessary to ensure compatibility between the telematics application and their equipment, including all hardware, software, electronic components, and any other component required to access the telematics application, these include, but are not limited to, such things as telecommunication services, Internet access and connectivity, operating systems, or any other program, equipment or services, required to access and use the telematics application.
                                                                                                                                                                                                    5. TIKAL declines any liability regarding any content that the client or user may host within the telematics application OpenVidu PRO, since at no moment, does TIKAL intervene in the internal processing of said content. Therefore, and in accordance with art.16 of LSSI-CE, TIKAL is not legally bound to remove any content from the server, provided there is no \u201cactual knowledge\u201d that the activity or information stored is illegal, libellous, or injurious to third-party rights or assets. In this regard, it shall be understood that \u201cactual knowledge\u201d exits, when there is a court or administrative decision, ordering to block or remove content and that the contractor (TIKAL) has been made aware of it. Notwithstanding, TIKAL reserves the right to remove this type of content out of its own volition, once it has been detected, whilst the client waives any right to claim or demand compensation. Should the application be in any way damaged due to the introduction of malign software or content (virus, trojan,\u2026) TIKAL reserves the right to automatically terminate the contract without having to pay any compensation whatsoever. On the other hand, TIKAL hereby reserves the right to demand compensation from the client or user for any damages caused to the system.
                                                                                                                                                                                                    6. The client or user shall burden all legal costs incurred when the cause is attributable to them, these include TIKAL lawyers\u2019 fees, even when a final court decision has yet to be reached.
                                                                                                                                                                                                    7. TIKAL uses information security protocols which are broadly accepted and observed by the industry such as firewalls, access-control procedures, and crypto mechanisms in order to avoid any unauthorized access to the data. For this purpose, the client hereby grants TIKAL access to data so that it can perform access-control authentication. The licensing process or any process which entails the introduction of personal data shall always conducted under a rigorous communication protocol so as to ensure no third parties have access to data transmitted electronically.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#fifth-intellectual-and-industrial-property-rights","title":"Fifth. Intellectual and industrial property rights.","text":"
                                                                                                                                                                                                    1. The exploitation rights of the telematics application are owned by TIKAL and protected by Spanish Intellectual Property Laws applicable in any country where it is used. The structure, organization and coding of the telematics application constitute confidential and valuable industrial and commercial secrets which belong to TIKAL. Therefore, the client must treat the telematics application in the same fashion they would when utilizing any material protected by intellectual property rights, thus copying, duplicating, or cloning the application is strictly forbidden.
                                                                                                                                                                                                    2. The present licence to use the telematics application does not imply, either explicitly or implicitly, the assignment of the intellectual and industrial rights over said application, the hardware, or the data model.
                                                                                                                                                                                                    3. Brands must be utilized in accordance with the commercial uses of brands, including acknowledging the proprietor\u2019s name of the brand. Brands may only be used in order identify those printouts produced by the telematics application. Said utilization does not imply or grant any property rights over the application.
                                                                                                                                                                                                    4. The knowledge and expertise intrinsic to the telematics application, as well as the knowledge utilized to configure it, is confidential information which belongs to the owner of the telematics application TIKAL. The client acknowledges this and assumes all liability regarding fraudulent use, or illegal copy or duplication of said application, or complementary programs, or utilization of this information by third parties, being liable for any breach of the present contract, by them or by any person or persons depending or associated with the client, or when these individuals have been granted access, directly or indirectly, to the telematics application by the client.
                                                                                                                                                                                                    5. Updates: For the entire validity period of the present contract, and in accordance with the terms and conditions stipulated in the next paragraph, the client is entitled to have access to the updates of the telematics application as they arise. The client assumes all legal liability for the updates, regarding limitations and duty of care, in the same fashion as with the original computer application. Updates to additional modules of the telematics application shall be given to those clients who have acquired from TIKAL the licence to use said modules.
                                                                                                                                                                                                    6. Hereby the client gives TIKAL consent to incorporate them as such into their business portfolio, thus allowing TIKAL to use their brand and logo on its website as well as in documents which may be given to other potential clients, for the sole purpose of said portfolio, and provided that the client does not express opposition to them being used in such a fashion.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#sixth-right-to-amend","title":"Sixth. Right to amend.","text":"

                                                                                                                                                                                                    TIKAL reserves the right to update the telematics application to the latest version available on the market. Said updates may include, but are not limited to, such things as new functionalities, improvements, and modifications and legal updates to the telematics application, which may vary, at any moment such things as its features, performance, and configuration of the telematics application content.

                                                                                                                                                                                                    TIKAL pledges to evaluate and take into consideration suggestions and requests made by clients and users of the telematics application so that they may be incorporated in the new versions of said application; however, it is TIKAL\u00b4s right, not the client\u00b4s to decide which modifications or improvements may be included in the aforementioned versions.

                                                                                                                                                                                                    TIKAL reserves the right to modify, at any moment, the characteristics, features, and conditions of TIKAL for the benefit and development of the service. With this in mind, TIKAL may only have to observe the formality of having to notify the client via an on-line notice, or by modifying any clause in this contract. Notwithstanding the foregoing, TIKAL shall endeavour to promptly notify the client so that the latter may adapt them.

                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#seventh-exclusion-and-termination-of-licensing","title":"Seventh. Exclusion and termination of licensing.","text":"
                                                                                                                                                                                                    1. TIKAL reserves the right to exclude and/or terminate, temporarily or in a definite manner, the client\u00b4s right to use the telematics application, in case the following occurring:
                                                                                                                                                                                                      • Breach of any of the terms and conditions of the present contract.
                                                                                                                                                                                                      • Breach of law and order and/or improper, illegal, or negligent professional behavior.
                                                                                                                                                                                                      • When a court, administrative, or official decision is made to do so.
                                                                                                                                                                                                    2. The exclusion clause, or termination of this contract, does not imply that TIKAL forfeits the right to take legal actions or file for financial compensation when the client has acted in bad faith to damage, directly or indirectly, the telematics application.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#eighth-communications","title":"Eighth. Communications.","text":"
                                                                                                                                                                                                    1. For the purposes of establishing a line of communication regarding the present contract both parties agree to use the place of residence which appears in it. The client pledges to keep the e-mail account provided in this licensing agreement, operational, activated and updated for the purposes of communications with TIKAL, which constitutes TIKAL\u00b4s preferred line of communication (albeit not the only one). In general terms, the client pledges to keep their personal details updated, and must communicate TIKAL, in a clear, unambiguous manner, of any changes.
                                                                                                                                                                                                    2. Should the client fail to notify said changes, notifications or notices delivered to the address(es) given by the client in the licensing agreement, shall be considered valid.
                                                                                                                                                                                                    3. The client consents that telephone conversations with TIKAL may be recorded with the intent to improve the quality and security of the service.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#ninth-duration","title":"Ninth. Duration.","text":"
                                                                                                                                                                                                    1. The contract shall be valid indefinitely from the moment the client requests it. The client can also put the end to the contract at any time he wishes, being obliged to pay the pending consumed service.
                                                                                                                                                                                                    2. As long as the period contract holds it is understood that the validity of the contract published on TIKAL\u00b4s website and containing all updates, prevails.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#tenth-terms-of-payment","title":"Tenth. Terms of payment.","text":"
                                                                                                                                                                                                    1. The price, payment method, billing and payment of the telematics application licensing, object of the present contract, is stipulated in the Current Official Rates Section published on TIKAL\u00b4s website (https://openvidu.io at the time of writing), which are considered part of a whole to all intents and purposes.
                                                                                                                                                                                                    2. The price stipulated in the aforementioned Current Official Rates Section, do not include valued added tax (VAT), nor does it include any other taxes or fees established by law whose current rates shall be applied for the provision of the service when signing the present contract. Therefore, said amounts may be increased according to current tax rates.
                                                                                                                                                                                                    3. Payment will be done monthly and will cover the whole amount of the service consumed during last month period according to the currently published rates from TIKAL.
                                                                                                                                                                                                    4. Monthly payments include both the basic rate for the provision of the service, and the corresponding rate(s) for any optional or additional service hired.
                                                                                                                                                                                                    5. Payments must be made effective by the credit or debit card that the client has agreed with TIKAL when first hiring the service. Visa and MasterCard shall be the accepted cards.
                                                                                                                                                                                                    6. Total or partial delay in payment by the client for the amount(s) TIKAL has billed them shall grant TIKAL the right to cancel or terminate all contracted obligations in accordance with the present contract. Suspension of the service provision shall be realized within the next fifteen natural days after the contract has reached its expiry date, prior notice to the client. After said fifteen natural days from the day the service was suspended, and prior notification to the client, TIKAL may terminate the contract. If the client pays the full amount owed to TIKAL during said period, the latter shall re-establish the service as promptly as possible from the moment it is notified that the debt has been settled. Notwithstanding the foregoing, TIKAL reserves the right to ask for a two-month deposit as a guarantee before re-establishing the service. The client accepts all liability for any legal costs incurred due to claims made by TIKAL regarding breach of payment after the contract has reached its expiry date, including, but not limited to, such things as the return of invoices and late-payment interest. When the client returns, for any cause alien to TIKAL, two or more direct-debit invoices, TIKAL shall be entitled to unilaterally opt for the annual hiring and billing of the service.
                                                                                                                                                                                                    7. When the client has defaulted on a payment, either totally or partially, during three months, for the amount owed to TIKAL, the latter has the right to rescind the contract between the two parties, as well as the direct and definite termination and cancellation of the service hired by the client, including the database linked to the client\u00b4s services, without prior notice from TIKAL.
                                                                                                                                                                                                    8. TIKAL shall apply upon its rates any current deals and offers existing at the time the client hires the service, provided they comply with the terms and conditions of said deals and offers so that they may benefit from them. The client acknowledges and accepts the fact they may obtain detailed information, at any given time, regarding said deals and offers on TIKAL\u00b4s website or through the habitual communication channels with which TIKAL provides its clients.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#eleventh-data-protection","title":"Eleventh. Data Protection.","text":"

                                                                                                                                                                                                    The parties involved agree that they know, comply with, and are subject to, the Spanish and European laws and legislation regarding Personal Data Protection, thus they must give proper use and treatment to all data arising from any activity subjected to the terms and conditions of this contract.

                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#data-controller-agreement-between-the-client-and-tikal","title":"Data Controller agreement between the client and TIKAL.","text":"

                                                                                                                                                                                                    In accordance with the Spanish Data Protection Laws, TIKAL\u00b4s access to the client\u00b4s personal files shall not be considered a violation of said laws, insofar as TIKAL is effectively the Data Controller and said access is necessary for the provision of the service which is the subject of this contract.

                                                                                                                                                                                                    In this regard, and for the purposes of Data Protection regulation, TIKAL shall be regarded as the \u201cData Controller\u201d of the client\u00b4s data. Notwithstanding the foregoing, TIKAL pledges that it shall treat said data in conformity with the client\u00b4s instructions provided in this contract, and that under no circumstances shall it utilise them for any other purposes outside of what the parties have agreed in this contract, nor shall it transfer or communicate them to a third party, not even for back-up or storage purposes. At the same time, the duration and validity of this agreement shall correspond to the type of service hired by the client.

                                                                                                                                                                                                    Once the provision of said service terminates and the data shall no longer be necessary to perform the aforementioned Data Controller role, all personal data shall be either destroyed or returned to the person, persons or entity responsible for it, as well as any storage medium, documents or files containing personal data.

                                                                                                                                                                                                    In order to provide the service and what said provision entails, TIKAL shall be granted access to the following information:

                                                                                                                                                                                                    1. Contact details
                                                                                                                                                                                                    2. Company profile data
                                                                                                                                                                                                    3. Assets and billed services data
                                                                                                                                                                                                    4. Tax identification data

                                                                                                                                                                                                    TIKAL\u00b4s obligations as Data Controller are described as follows:

                                                                                                                                                                                                    1. Treat all data in accordance with the instructions received by the person, persons or entity in charge of its treatment and only for the purposes provided in this contract.
                                                                                                                                                                                                    2. To not communicate or transfer any data to third parties, except prior consent by the body in charge of its treatment, or in cases provided for by the law.
                                                                                                                                                                                                    3. TIKAL may not outsource, either totally or partially, the provision of the service(s) described in the present contract, except prior authorization from the client whom shall be informed with due notice about the outsourcing entity as well as the services being outsourced. In this case, TIKAL shall draft and execute a new contract with said outsourcing entity, always in accordance with the current Data Protection laws.
                                                                                                                                                                                                    4. To not disclose any personal data to which TIKAL may have had access, even after the termination of this contract.
                                                                                                                                                                                                    5. To guarantee that the staff managing personal data pledge to keep the confidentiality which said data entails and that they comply with the proper security protocols.
                                                                                                                                                                                                    6. To assist the person or body responsible for data treatment regarding data protection.
                                                                                                                                                                                                    7. To provide the person or body responsible for data protection with support and assistance when performing an impact assessment, or when consulting the regulatory authorities, if applicable. Additionally, to provide said person or body with the necessary information so that it may prove their compliance with the rules and regulations.
                                                                                                                                                                                                    8. Notwithstanding the foregoing, said person or body has mechanisms in place so as to guarantee the confidentiality, integrity, and availability of the systems and services concerning data protection, as well as to restore the access and availability to data in case of system failure. Additionally, it is endowed with capabilities so as to regularly verify and assess the efficacy of the security protocol.

                                                                                                                                                                                                    Duties of the responsible for data treatment:

                                                                                                                                                                                                    1. To guarantee, at all times, compliance with the Data Protection Laws.
                                                                                                                                                                                                    2. Make all necessary enquiries beforehand.
                                                                                                                                                                                                    3. To supervise that proper data treatment is occurring.
                                                                                                                                                                                                    4. To provide the data controller with all necessary data for the provision of the service.

                                                                                                                                                                                                    TIKAL\u00b4s duties as Data Controller:

                                                                                                                                                                                                    1. To guarantee, at all times, compliance with the Data Protection Laws.
                                                                                                                                                                                                    2. Make all necessary enquiries beforehand.
                                                                                                                                                                                                    3. To supervise that proper data treatment is occurring.
                                                                                                                                                                                                    4. To provide the data controller with all necessary data for the provision of the service.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#twelfth-confidentiality","title":"Twelfth. Confidentiality.","text":"
                                                                                                                                                                                                    1. All data and information transmitted between the parties is strictly confidential and property of TIKAL and the client, and its protection is of the utmost importance. To this intent, both parties hereby contract the obligation to safeguard said data and information by adopting all appropriate measures to ensure that only authorized individuals shall have access to it; authorized individuals being understood as those employees which are needed by the parties involved so as to keep the provision of the service, which is the object of this contract, in good working order.
                                                                                                                                                                                                    2. In this regard, the signatory parties are hereby subject to the following confidential agreement:
                                                                                                                                                                                                      • Hereby TIKAL pledges to keep confidential all data and information supplied by, and concerning the client, as well as the output arisen from the service provided. In this regard, TIKAL possesses strict internal controls whose objective and end are to guarantee the integrity of the present confidential agreement.
                                                                                                                                                                                                      • The client therefore agrees to keep confidential all data and information arising from TIKAL\u00b4s internal processes, specially the existence, utilization, and functionalities of any process used in the provision of the service.
                                                                                                                                                                                                      • The present confidential agreement shall remain valid even after the termination of the present contractual relation and extends indefinitely to all members of staff that have been granted access to said confidential information.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#thirteenth-termination-rescission-nullity","title":"Thirteenth. Termination. Rescission. Nullity.","text":"
                                                                                                                                                                                                    1. The present contract shall be considered void for infringement, committed by any of the parties involved, of the Spanish Civil Code, and in particular, of the Spanish Commercial Code, and the obligations arising from the following:
                                                                                                                                                                                                      • Mutual consent of the parties involved.
                                                                                                                                                                                                      • When the present contract has reached its expiry date which is specified in clause tenth, or within the subsequent extensions thereof.
                                                                                                                                                                                                      • By unilateral rescission provided that the party wishing to rescind communicates this at least one month in advance.
                                                                                                                                                                                                      • When any of the parties has been officially put into administration, has filed for bankruptcy protection, is under bankruptcy or insolvency proceedings, or is under liquidation or dissolution.
                                                                                                                                                                                                      • Due to any other reason(s) provided for in law.
                                                                                                                                                                                                      • Should any of the parties involved breach the contracted obligations provided in the present contract, the other party may consider it as void. Said consideration warrants no prior notice or compensation of any kind, but for the need to communicate the decision to the other party; unless the unaccrued obligations owed by the party are performed within the next fifteen days, counting from the moment said party was notified that they are in breach of the contract . Notwithstanding the foregoing, the other party reserves the right to claim or file for damages caused by this infringement.
                                                                                                                                                                                                    2. TIKAL pledges to destroy all data provided by the client once the contractual relation is extinguished. Likewise, TIKAL shall destroy or return any document or storage medium containing any IT-related data arising from said contractual relation. Once said contractual relation terminates, the client may request TIKAL to supply them with a hard, back-up copy of all data pertaining to and arising from said relation, to any address the client wishes, prior to a written request to do so, which must be sent within the week after the end of the contract. The client shall burden the costs incurred arising from the handling and mailing of said request.
                                                                                                                                                                                                    3. The client may cease or cancel the use of the telematics application whenever they wish to do so. Should the client or any authorized user by them request the cancellation of the service at TIKAL\u00b4s offices, it shall become effective on the same day said request was made. Therefore, it is advised to carefully observe said process to avoid any resources or data loss that the client or user may have in their TIKAL\u00b4s account. Should it not be possible for them to initiate said cancellation process at TIKAL\u00b4s offices, the client may request it by contacting TIKAL\u00b4s customer service via any of the channels provided in this contract. Said cancellation shall become effective on the day stipulated by the client, provided that the request has been made with enough time to be processed correctly.
                                                                                                                                                                                                    "},{"location":"/conditions/terms-of-service/#fourteenth-applicable-legislation-and-jurisdiction","title":"Fourteenth. Applicable legislation and jurisdiction.","text":"

                                                                                                                                                                                                    The present is a business contract regulated by Spanish laws. The parties involved agree that any discrepancy, legal or civil action, claim or complain arising from the interpretation and execution of the present contract, shall be, directly or indirectly, taken to the Court of Madrid, thus all parties involved hereby renounce to take any matters pertaining to this agreement to any other jurisdiction.

                                                                                                                                                                                                    The present document constitutes the total agreement of the parties in relation to the matters covered in this agreement, thus substitutes all previous obligations, liabilities, and agreements, both written and verbal, existing prior to the signature and execution of this contract.

                                                                                                                                                                                                    The following website (www.naevatec.com) belongs to: TIKAL TECHNOLOGIES SL TAX ID: B85986669 10 Chile Rd/St 28290 \u2013 Las Rozas de Madrid (Madrid City) Spain. Registered in the Madrid\u00b4s Trade Register, volume/tome 28043. Book 0 Section 8th of the Registry Book, Page 37, Sheet M-505315.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/","title":"Comparing OpenVidu","text":"

                                                                                                                                                                                                    This section compares OpenVidu to other videoconference/streaming solutions, to better understand what it is, what it is not, and what advantages and disadvantages it may have over them.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-vs-livekit","title":"OpenVidu vs LiveKit","text":"

                                                                                                                                                                                                    First of all, and perhaps the most obvious question, how does OpenVidu differ from LiveKit, and what kind of relationship is there between them? This can be answer with four simple points:

                                                                                                                                                                                                    • OpenVidu is a fork of LiveKit. It is 100% compatible with LiveKit: any application built for LiveKit is compatible with OpenVidu.
                                                                                                                                                                                                    • OpenVidu is a superset of LiveKit. It provides all of the open source features of LiveKit and supports all of its SDKs, but it also extends LiveKit with extra features, APIs and internal enhancements, most notably integration with mediasoup.
                                                                                                                                                                                                    • OpenVidu is a production-ready self-hosted solution. It offers an easy deployment process to self-host a high performance, fault tolerant, scalable and observable cluster. OpenVidu provides an interactive installer that manages all of the complexities, so you can quickly host a production deployment that would otherwise require advanced devops/SRE expertise.
                                                                                                                                                                                                    • OpenVidu is a support team for self-hosted deployments. The OpenVidu team is made up of real-time experts with over a decade of experience in the field. We specialize in customer support and are always ready to help you bring your ideas to life.

                                                                                                                                                                                                    OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your cluster.

                                                                                                                                                                                                    LiveKit comes in two flavors: LiveKit Open Source and LiveKit Cloud.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-community-vs-livekit-open-source","title":"OpenVidu COMMUNITY vs LiveKit Open Source","text":"

                                                                                                                                                                                                    LiveKit Open Source is probably the most advanced and feature-rich open source WebRTC stack available today. It has a simple but very versatile API design, and has a large collection of SDKs to integrate into your application on both the frontend and backend. Regardless of your technology stack, there is sure to be a LiveKit Open Source SDK available for you! This is why OpenVidu is fully compatible with LiveKit protocols. You can use any LiveKit SDK to build your application, and it will work seamlessly with an OpenVidu deployment.

                                                                                                                                                                                                    What does OpenVidu Community bring over LiveKit Open Source?

                                                                                                                                                                                                    With OpenVidu Community you get a handful of features on top of LiveKit Open Source that will help with the development of your application:

                                                                                                                                                                                                    • Egress and Ingress services already integrated with a Redis instance: LiveKit allows you to export media from a Room (for example recording it) or import media into a Room (for example ingesting a video file), using Egress and Ingress services respectively. These modules are independent of LiveKit Server and must be correctly configured and connected via a shared Redis. When running OpenVidu Community you will have all these services properly integrated, so you can focus on developing your app without worrying about anything else.
                                                                                                                                                                                                    • S3 compatible storage for Egress recordings: OpenVidu Community comes with an S3 compatible storage already configured to store Egress recordings (Minio).
                                                                                                                                                                                                    • Administration dashboard to monitor your Rooms: OpenVidu comes with an administration dashboard that allows you to monitor the status of your Rooms. Not only in real time, but also historically: the number of participants, the number of published tracks, Egress and Ingress processes... This is a great tool to have when developing your app, as it can help spotting issues and debugging your application's logic. See more.
                                                                                                                                                                                                    • OpenVidu Call: a fully-fledged videoconference application that you can customize and adapt to your needs. See more.
                                                                                                                                                                                                    • Powerful and easy to use local development environment: OpenVidu provides a Docker Compose based deployment designed for development and testing devices on your local network. It comes with automatic certificate management that makes it easy to test mobile devices in your LAN. See more.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-pro-vs-livekit-open-source","title":"OpenVidu PRO vs LiveKit Open Source","text":"

                                                                                                                                                                                                    Deploying LiveKit Open Source in production requires devops/SRE experience to operate your own network of media servers, load balance between them, maintain high uptime and monitor the health of your deployment. OpenVidu Pro makes this an easy process, hiding most of the complexities of such an advanced deployment. With OpenVidu Pro you can self-host a fault-tolerant, scalable and observable cluster, while doubling the original LiveKit Open Source performance to handle twice as many media streams with the same hardware.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-pro-vs-livekit-cloud","title":"OpenVidu PRO vs LiveKit Cloud","text":"

                                                                                                                                                                                                    LiveKit Cloud is the official SaaS solution for LiveKit. They manage the infrastructure, with a pricing model based on the total bandwidth consumed by your application. It offers certain advantages over LiveKit Open Source:

                                                                                                                                                                                                    • Analytics and telemetry dashboard. LiveKit Open Source does not export any metrics or logs out-of-the-box.
                                                                                                                                                                                                    • Massive Rooms for livestreams, where a theoretically unlimited number of viewers can be established for published tracks. In LiveKit Open Source one Room must fit in a single server. LiveKit Cloud overcomes this limitation with a mesh architecture where one media server can connect to other media servers to distribute the load.

                                                                                                                                                                                                    Where does OpenVidu Pro stand in relation to LiveKit Cloud? OpenVidu Pro aims to deliver the same advanced benefits as LiveKit Cloud, but as a self-hosted solution. We intend to provide a performant, fault tolerant, scalable and observable cluster that is easy to deploy, configure and administrate in your own infrastructure. For now, OpenVidu Pro brings:

                                                                                                                                                                                                    • OpenVidu Pro provides a complete observability stack with Grafana, Loki, Promtail and Mimir, as well as OpenVidu Dashboard to visualize the data. See more.
                                                                                                                                                                                                    • We are currently working on supporting the same scalability as LiveKit Cloud to support big videoconferences and massive live streams. See more.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-vs-saas-solutions","title":"OpenVidu vs SaaS solutions","text":"

                                                                                                                                                                                                    This includes many services like Agora, GetStream, Daily, Vonage, Jitsi as a Service, Whereby, Zoom SDK, Dolby Millicast, Amazon Chime SDK.

                                                                                                                                                                                                    The main difference between OpenVidu and these services is who owns the infrastructure, and where your users' data flows. All these SaaS solutions provide:

                                                                                                                                                                                                    • A public endpoint that your application connects to, so all media is routed through their servers.
                                                                                                                                                                                                    • Different sets of SDKs to integrate with your application. Some more complete than others, and maybe some low-code options.
                                                                                                                                                                                                    • A pricing model usually based on one of this two options: minutes-per-participant or total GBs of bandwidth consumed.

                                                                                                                                                                                                    Using a SaaS provider is a great option for some use cases, but not all. OpenVidu is designed to be self-hosted. This allows you to have full control over your infrastructure and data, taking the most out of your own resources and complying with the most strict regulations. While having the best features provided by SaaS: scalability, fault tolerance, observability. See Production ready for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-vs-sfus","title":"OpenVidu vs SFUs","text":"

                                                                                                                                                                                                    This includes projects such as Kurento, mediasoup, Pion, Janus, Jitsi Videobridge or Medooze.

                                                                                                                                                                                                    These are all media servers. More specifically, they fall under the umbrella of the so-called SFUs (Selective Forwarding Units): they are able to receive media streams from different clients and selectively forward them to other clients, usually without transcoding or mixing the media.

                                                                                                                                                                                                    SFUs are generally low-level tools. Using them directly to implement real-time applications requires a deep understanding of signaling protocols, codecs, networking and other low-level concepts. OpenVidu is a higher-level abstraction compared to SFUs. It internally uses SFUs to rely the media streams (more specifically Pion and mediasoup), but hides all complexities to offer a simpler way to develop videoconferencing and live streaming applications.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-vs-mediasoup","title":"OpenVidu vs mediasoup","text":"

                                                                                                                                                                                                    mediasoup is a WebRTC SFU. It is a minimalist media server with a super low level API that allows building custom real-time applications. Compared to other SFUs, mediasoup is well known for its outstanding performance.

                                                                                                                                                                                                    OpenVidu uses mediasoup internally to transmit media streams. We have embedded mediasoup as the WebRTC engine right at the core of LiveKit Open Source, which allows OpenVidu to offer the fantastic APIs and SDKs of LiveKit while providing the cutting-edge performance of mediasoup. Learn more about mediasoup integration in section Performance.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/comparing-openvidu/#openvidu-vs-microsoft-teams-google-meet-zoom","title":"OpenVidu vs Microsoft Teams, Google Meet, Zoom","text":"

                                                                                                                                                                                                    All these well-known video conferencing tools are final applications that provide little to no customization at all. They are proprietary, closed-source apps designed to be used as-is, and they are not intended to be integrated into other systems.

                                                                                                                                                                                                    OpenVidu is inherently different, as it provides a set of APIs and SDKs to integrate real-time video capabilities into your own application. In other words: with OpenVidu you can easily build your own custom Microsoft Teams, Google Meet or Zoom-like application. See Use cases for some examples of what you can build with OpenVidu.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/","title":"Getting started","text":""},{"location":"/3.0.0-beta3/docs/getting-started/#what-is-openvidu","title":"What is OpenVidu?","text":"

                                                                                                                                                                                                    OpenVidu is a platform that allows you to implement real-time applications. You can build your brand new OpenVidu app from scratch, but it is also very easy to integrate OpenVidu in your already existing application.

                                                                                                                                                                                                    OpenVidu is based on WebRTC technology and allows developing any kind of use case you can imagine: one-to-one calls, video conference rooms, massive live streaming events, management and processing of drones and camera feeds...

                                                                                                                                                                                                    OpenVidu is built on the best open source technologies: LiveKit, from which it inherits all its amazing SDKs to integrate it into your front-end and back-end applications, and mediasoup, from which it inherits the best performance and optimization for media routing.

                                                                                                                                                                                                    OpenVidu is a custom fork of LiveKit, 100% compatible in terms of its API and SDKs, with the power of mediasoup at its core. This and other integrations provide improved performance, new features and facilitate the deployment and management of your self-hosted, production-grade cluster."},{"location":"/3.0.0-beta3/docs/getting-started/#use-cases","title":"Use cases","text":"

                                                                                                                                                                                                    OpenVidu is a super versatile platform that can be used to build just about any kind of real-time application you can think of. Most common use cases can be classified into one of the following categories:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#video-conferencing","title":"Video conferencing","text":"

                                                                                                                                                                                                    Video conferencing rooms are virtual spaces where two or more users can send video and audio and interact with each other in real-time. They can scale in size, from a simple 1-to-1 call to a massive video conference with thousands of participants. For example:

                                                                                                                                                                                                    • A 1-to-1 video-call center to attend your customers face to face.
                                                                                                                                                                                                    • An e-health application where doctors can treat their patients directly from it, in a private and secure manner using end-to-end encryption.
                                                                                                                                                                                                    • A banking application where customers may sign a contract, live and recording the call as proof of it.
                                                                                                                                                                                                    • A webinar platform where speakers can give their talks to large audiences, with the possibility of viewers temporarily turning their cameras to ask questions.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#live-streaming","title":"Live streaming","text":"

                                                                                                                                                                                                    Live streaming applications allow one publisher to broadcast video to many viewers. It can be a single video feed, multiple video feeds (webcam and screen share) or there could be even multiple publishers. The general rule is that the ratio of viewers to publishers is very high, in the order of thousands.

                                                                                                                                                                                                    Ultra-low latency live streaming (below 300ms) allows for actual real-time interaction between the viewers and the publishers. This differs from traditional live streaming platforms where the latency is usually in the order of seconds. In this way you can build applications like:

                                                                                                                                                                                                    • A TEDx-like application, where a speaker can give a talk to a massive audience of thousands of viewers, which may communicate through a chat. Real time subtitles and translations can be added to the stream.
                                                                                                                                                                                                    • An application to stream sport events, where viewers can switch between different cameras to watch the game from different angles to increase fan engagement.
                                                                                                                                                                                                    • A global live auction platform where the auctioneer can be seen by the bidders in real-time with sub-second latency all around the world.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#robotics-and-embedded-systems","title":"Robotics and embedded systems","text":"

                                                                                                                                                                                                    The future lies in the integration of cameras and sensors in all kinds of devices, everywhere: industry, homes, public spaces, emergency services... OpenVidu can be used to receive and process video and audio streams from these devices, and doing so in real-time. For example:

                                                                                                                                                                                                    • A security system to receive the feed of IP cameras and sending an alert when detecting a person.
                                                                                                                                                                                                    • A drone control system to receive the video feed from each drone camera and securely record it. Any other sensor reading could also be sent to be synchronized later with the recorded video feed.
                                                                                                                                                                                                    • A real-time translation app that uses the latest AI models to provide high-quality translations of spoken language in real time.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#openvidu-application-architecture","title":"OpenVidu application architecture","text":"

                                                                                                                                                                                                    Any OpenVidu application has 3 different parts:

                                                                                                                                                                                                    • Your OpenVidu deployment: provides all the necessary infrastructure for streaming real-time audio and video. It is built upon LiveKit server and mediasoup server. It can usually be treated as a black box in which its internal aspects are not important: you just deploy it and connect your application to it. It can be a single server or a cluster, deployed on premises or in your cloud provider.
                                                                                                                                                                                                    • Your Application client: runs in your user devices and interacts with the OpenVidu server through any LiveKit client SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit client SDK in your Application client. Your users will join rooms as participants to send and receive real-time audio and video tracks. It needs a token generated by the Application server to join a room.
                                                                                                                                                                                                    • Your Application server: interacts with the OpenVidu deployment through any LiveKit server SDK. As OpenVidu server is 100% compatible with LiveKit protocol, you can integrate any LiveKit server SDK in your application server. At a minimum, it is responsible for the generation of tokens for the Application client to join a room. But you can implement your own business logic managing rooms, participants and tracks from the safety of your Application server.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#basic-concepts","title":"Basic concepts","text":""},{"location":"/3.0.0-beta3/docs/getting-started/#room","title":"Room","text":"

                                                                                                                                                                                                    A Room is a virtual space where Participants can connect to send and receive media Tracks. Two Participants can only communicate if they are connected to the same Room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#participant","title":"Participant","text":"

                                                                                                                                                                                                    A Participant is a user connected to a specific Room. Each Participant can publish as many video and audio Tracks as needed, and subscribe to any other Participant's Tracks, as long as they are connected to the same Room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/getting-started/#track","title":"Track","text":"

                                                                                                                                                                                                    A Track is a data flow of audio or video. Participants create them from a local media source (a webcam, a microphone, a screen share) and publish them into a Room. Other Participants of the same Room can subscribe to them.

                                                                                                                                                                                                    With these three concepts you can build any kind of real-time application you can think of. The figure below shows two simple examples.

                                                                                                                                                                                                    Room \"Daily meeting\" has 2 Participants: \"Alice\" is publishing Track \"Webcam\" and \"Mic\" and is receiving Track \"Screen\" from \"Bob\". \"Bob\" is publishing Track \"Screen\" and receiving Tracks \"Webcam\" and \"Mic\" from \"Alice\".

                                                                                                                                                                                                    Room \"Remote support\" has 3 Participants: Participant \"Dan\" is not publishing any Track, but receiving all Tracks in the Room. Participant \"Erin\" is only receiving Track \"Mic\" from Participant \"Carol\", but not Track \"Screen\"."},{"location":"/3.0.0-beta3/docs/getting-started/#openvidu-editions","title":"OpenVidu Editions","text":"

                                                                                                                                                                                                    OpenVidu is available in two editions:

                                                                                                                                                                                                    • OpenVidu COMMUNITY: free to use. It is a single-server deployment and provides a custom LiveKit distribution with Egress, Ingress, S3 storage and monitoring. Ideal for development and testing, but also for medium-scale production deployments. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community in a sufficiently powerful server!
                                                                                                                                                                                                    • OpenVidu PRO: OpenVidu commercial edition. It is a multi-server deployment with all the features of OpenVidu Community plus 2x performance, scalability, fault tolerance and improved monitoring and observability. Ideal for large-scale production deployments with heavy traffic that require the highest standards. You can start with OpenVidu Community and upgrade to OpenVidu Pro when needed.

                                                                                                                                                                                                    Type of deployment OpenViduLocal (development) OpenViduSingle Node OpenViduElastic OpenViduHigh Availability OpenVidu Edition COMMUNITY PRO COMMUNITY PRO PRO Suitability For local development in your laptop For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Friendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your network Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers Your laptop 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install Install"},{"location":"/3.0.0-beta3/docs/releases/","title":"Releases","text":""},{"location":"/3.0.0-beta3/docs/releases/#300-beta3","title":"3.0.0-beta3","text":""},{"location":"/3.0.0-beta3/docs/releases/#changelog","title":"Changelog","text":"
                                                                                                                                                                                                    • Centralized configuration: OpenVidu now automatically manages and synchronizes the configuration of all its components. This means that updating any configuration parameter in multi-node deployments (OpenVidu Elastic and OpenVidu High Availability) is as simple as updating the required file in a single node. OpenVidu handles the distribution and restart of the affected services across all nodes. See how easily you can change the configuration here.
                                                                                                                                                                                                    • mediasoup support:
                                                                                                                                                                                                      • Dynacast is now supported (LiveKit reference).
                                                                                                                                                                                                      • Adaptive Streaming is now supported (LiveKit reference).
                                                                                                                                                                                                      • Speaker Detection events (LiveKit reference).
                                                                                                                                                                                                      • Server API method MutePublishTrack (LiveKit reference).
                                                                                                                                                                                                      • Client API method RemoteTrackPublication.setEnabled (LiveKit JS reference).
                                                                                                                                                                                                    • OpenVidu Call:
                                                                                                                                                                                                      • When using it against an OpenVidu Local Deployment, recordings couldn't be accessed from the application's frontend. This is now fixed and OpenVidu Call is able to access recordings.
                                                                                                                                                                                                      • There was an error when applying Virtual Backgrounds (\"No camera tracks found. Cannot apply background\"). This is now fixed.
                                                                                                                                                                                                      • Docker image openvidu/openvidu-call is now 50% smaller.
                                                                                                                                                                                                    • OpenVidu v2 compatibility:
                                                                                                                                                                                                      • There was a race condition when multiple participants connected to the Session at the same time that could cause remote streamCreated events to not be triggered. This is now fixed.
                                                                                                                                                                                                      • Configuration parameter V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET did not allow configuring subbuckets (\"openvidu\" worked fine, but \"openvidu/subbucket\" did not). Now it is possible to do so.
                                                                                                                                                                                                      • The operation to list recordings (available for REST API, openvidu-java-client, openvidu-node-client) was limited to 1000 recordings. This is now fixed and all recordings are always returned.
                                                                                                                                                                                                    • AWS deployments: all secrets are now synchronized with AWS Secrets Manager. You can update any secret from the AWS console and restart your cluster for them to have immediate effect in all your nodes. This is also true in reverse: you can update any secret inside your node and after a restart of the cluster, the values in AWS Secrets Manager will be properly synchronized.
                                                                                                                                                                                                    • New application tutorials available: iOS, Android, Recording.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/releases/#known-limitations","title":"Known limitations","text":"
                                                                                                                                                                                                    • When using mediasoup:
                                                                                                                                                                                                      • No ConnectionQualityChanged event (LiveKit reference).
                                                                                                                                                                                                      • No TrackStreamStateChanged event (LiveKit reference).
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/releases/#version-table","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.7.2 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.4.2 MinIO 2024.6.13 Caddy 2.8.4 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"/3.0.0-beta3/docs/releases/#300-beta2","title":"3.0.0-beta2","text":""},{"location":"/3.0.0-beta3/docs/releases/#changelog_1","title":"Changelog","text":"
                                                                                                                                                                                                    • Improved mediasoup support:
                                                                                                                                                                                                      • Data messages work (LiveKit reference).
                                                                                                                                                                                                      • Ingress supported (LiveKit reference).
                                                                                                                                                                                                    • Improved OpenVidu Local Deployment:
                                                                                                                                                                                                      • Fixed Room Composite Egress (LiveKit reference) support when using mediasoup.
                                                                                                                                                                                                      • WebHooks (LiveKit reference) supported against a local OpenVidu Call.
                                                                                                                                                                                                    • Production deployments have a better private IP discovery process when there are multiple valid private IPs in the same host. This will make work more deployments out-of-the-box without the need of manual intervention.
                                                                                                                                                                                                    • OpenVidu PRO Evaluation Mode improved. Before a maximum a 2 Rooms of 8 Participants each could be created. Now the upper limit of Participants still apply, but the number of Rooms is unlimited. For example you can have 4 Rooms of 2 Participants each, or 1 Room of 8 Participants.
                                                                                                                                                                                                    • Minor bug fixes related to OpenVidu Call.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/releases/#known-limitations_1","title":"Known limitations","text":"
                                                                                                                                                                                                    • When using mediasoup:
                                                                                                                                                                                                      • No support for Speaker Detection events (LiveKit reference).
                                                                                                                                                                                                      • No ConnectionQualityChanged event (LiveKit reference).
                                                                                                                                                                                                      • No support for Dynacast (LiveKit reference).
                                                                                                                                                                                                      • No support for Adaptive Streaming (LiveKit reference).
                                                                                                                                                                                                    • When using OpenVidu Call against an OpenVidu Local Deployment, recordings cannot be accessed.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/releases/#version-table_1","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.6.0 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.2.0 MinIO 2024.06.13 Caddy 2.7.6 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"/3.0.0-beta3/docs/releases/#300-beta1","title":"3.0.0-beta1","text":""},{"location":"/3.0.0-beta3/docs/releases/#version-table_2","title":"Version table","text":"Artifact Version Info Link livekit/livekit-server v1.6.0 mediasoup 3.12.16 livekit/egress v1.8.2 livekit/ingress v1.2.0 MinIO 2024.06.13 Caddy 2.7.6 MongoDB 7.0.11 Redis 7.2.5 Grafana 10.3.3 Prometheus 2.50.1 Promtail / Loki 2.8.9 Mimir 2.11.0"},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/","title":"Developing your OpenVidu application","text":"

                                                                                                                                                                                                    Here's a high-level overview of the steps involved in building an OpenVidu application:

                                                                                                                                                                                                    1. Launch an OpenVidu deployment
                                                                                                                                                                                                    2. Use LiveKit Server SDK in your application server
                                                                                                                                                                                                    3. Build the UI of your client application
                                                                                                                                                                                                    4. Deploy OpenVidu and your application
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/#1-launch-an-openvidu-deployment","title":"1. Launch an OpenVidu deployment","text":"

                                                                                                                                                                                                    The quickest way is to use OpenVidu local deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/#2-use-livekit-server-sdk-in-your-application-server","title":"2. Use LiveKit Server SDK in your application server","text":"

                                                                                                                                                                                                    OpenVidu is fully compatibly with LiveKit APIs. This means that any LiveKit Server SDK can be used in your application server.

                                                                                                                                                                                                    The only mandatory task to perform in your application server is:

                                                                                                                                                                                                    • Creating access tokens. Your Participants will only be able to connect to your Rooms by using a valid access token. Visit the official documentation about Authentication to learn how to generate access tokens and which permissions you can assign to them.

                                                                                                                                                                                                    There are also other optional tasks that you can perform from your application server, depending on your requirements:

                                                                                                                                                                                                    • Manage your Rooms and Participants: although most of your application logic will be in the frontend, you can also manage the logic of your Rooms and Participants from the security of your application backend. You can list, create, update and destroy Rooms and Participants. This is the official LiveKit documentation with all the available methods of the RoomServiceClient exposed by the Server API. These methods are also available in all LiveKit Server SDKs.
                                                                                                                                                                                                    • Manage Egress and Ingress: if your application needs some kind of recording, broadcasting or media ingestion, this operations must all be performed by your application server.
                                                                                                                                                                                                    • Receive Webhook events: you can also listen to Webhook events in your application backend. In this way you can react to events happening in your Rooms: a Room has started, a Room has finished, a Participant has joined a Room, a Track has been published... Visit the official documentation about Webhooks.
                                                                                                                                                                                                    • Publish Tracks from your backend: this is only for advanced applications that require server-side media publishing. Publishing media from your backend is possible by using LiveKit CLI, Python SDK, Go SDK, Node SDK or Rust SDK.

                                                                                                                                                                                                    To get you started, here is a list of all available LiveKit Server SDKs and an application server tutorial using them. These tutorials are all set up to generate access tokens and receive webhook events, so they are perfect starting points for your application server.

                                                                                                                                                                                                    Node Go Ruby Java Python Rust PHP .NET Server API

                                                                                                                                                                                                    Node Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    Go Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    Ruby Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Java Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Python Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    Rust Tutorial

                                                                                                                                                                                                    Reference Docs

                                                                                                                                                                                                    PHP Tutorial

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    .NET Tutorial

                                                                                                                                                                                                    There is no .NET SDK for LiveKit available. Visit the tutorial to learn how to create tokens and receive Webhook events directly from your .NET application server.

                                                                                                                                                                                                    If your backend technology does not have its own SDK, you have two different options:

                                                                                                                                                                                                    1. Consume the Server API directly: Reference Docs

                                                                                                                                                                                                    2. Use the livekit-cli: GitHub Repository

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/#3-build-the-ui-of-your-client-application","title":"3. Build the UI of your client application","text":"

                                                                                                                                                                                                    There are two main strategies to build the UI of your client application:

                                                                                                                                                                                                    • Use a high-level UI Components library: you can use Angular Components and React Components to quickly set up your UI with building blocks that manage the events and state of the Room for you.
                                                                                                                                                                                                    • Use a low-level client SDK: if you want extensive control and maximum flexibility when designing your UI, use any of the LiveKit Client SDKs.

                                                                                                                                                                                                    The table below summarizes the key differences between these two strategies to help you make an informed decision:

                                                                                                                                                                                                    UI Components Low-level client SDKs What is it? Frontend libraries offering videoconferencing components to build your own application. There are Angular Components or React Components Integrate OpenVidu from scratch in your web, mobile or desktop application using LiveKit Client SDKs Pros
                                                                                                                                                                                                    • Very flexible components: adapt, extend or replace any component
                                                                                                                                                                                                    • Have your first version running in minutes, work on your customizations from there
                                                                                                                                                                                                    • Easily keep your client code up to date with the latest features
                                                                                                                                                                                                    • Unlimited level of customization: build your own UI from scratch as you please
                                                                                                                                                                                                    • Available for all client platforms: browsers, iOS, Android, Flutter, React Native, Unity...
                                                                                                                                                                                                    Cons
                                                                                                                                                                                                    • Only available for Angular and React web apps
                                                                                                                                                                                                    • Higher complexity, although there are plenty of tutorials to smooth the learning curve
                                                                                                                                                                                                    Tutorials Angular Components tutorials Application client tutorials

                                                                                                                                                                                                    Whatever strategy you choose to build the UI of your application, most common steps to perform are:

                                                                                                                                                                                                    • Connect to a Room with an access token: the application client will connect to a Room with an access token generated by your application server. Once connected, the client becomes a Participant of the Room.
                                                                                                                                                                                                    • Publish Tracks to the Room: the application client may create Tracks of any kind (audio from the microphone, video from the camera device, screen sharing from an application...) and publish them to the Room.
                                                                                                                                                                                                    • Subscribe to Tracks from other Participants: the application client may receive the Tracks published by other Participants in the Room. It is possible to perform selective subscription, so the client can choose which Tracks to specifically subscribe to.
                                                                                                                                                                                                    • Mute and unmute Tracks: the application client may mute and unmute its own Tracks, and also may disable the reception of any Track published by other Participants.

                                                                                                                                                                                                    Of course, depending on the use case, this may not be necessary for all users, or other additional steps may need to be taken. For example, in a live streaming application, only presenters will publish Tracks, while all other viewers will only subscribe to them. Or it is possible that users may need exchange messages through a chat. Each specific application will need to refine its use of the UI Components or client SDKs to meet its requirements.

                                                                                                                                                                                                    Here is the list of all LiveKit Client SDKs: LiveKit Client SDKs. Below is a list of application client tutorials, which are perfect starting points for your client application.

                                                                                                                                                                                                    JavaScript

                                                                                                                                                                                                    React

                                                                                                                                                                                                    Angular

                                                                                                                                                                                                    Vue

                                                                                                                                                                                                    Electron

                                                                                                                                                                                                    Ionic

                                                                                                                                                                                                    Android

                                                                                                                                                                                                    iOS

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/#4-deploy-openvidu-and-your-application","title":"4. Deploy OpenVidu and your application","text":"

                                                                                                                                                                                                    You have different options to deploy OpenVidu in a production-ready environment, depending on the level of scalability, fault tolerance and observability you need. See Deployment types for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/","title":"How to develop your OpenVidu application","text":"

                                                                                                                                                                                                    This page is a collection of the most common operations you may want to perform in your application while integrating OpenVidu. Depending on the scope of the operation, these operations will be performed on the client side using a LiveKit Client SDK, or on the server side using a LiveKit Server SDK (or directly using the HTTP server API). Consider the architecture of an OpenVidu application:

                                                                                                                                                                                                    You can use this page as a cheat sheet to know at a glance how to do something, and you have links to the LiveKit reference documentation of each operation for a more detailed explanation.

                                                                                                                                                                                                    All client side operations are exemplified using the LiveKit JS Client SDK. For other client SDKs, refer to the corresponding LiveKit reference documentation.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#generate-access-tokens","title":"Generate access tokens","text":"

                                                                                                                                                                                                    The application client needs an access token to connect to a Room. This token must be generated by the application server. Visit LiveKit reference documentation to learn how to generate access tokens:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#manage-rooms","title":"Manage Rooms","text":""},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#connect-to-a-room","title":"Connect to a Room","text":"

                                                                                                                                                                                                    To connect to a Room you need the URL of your OpenVidu deployment (which is a WebSocket URL) and the access token generated by your application server.

                                                                                                                                                                                                    import { Room } from \"livekit-client\";\n\nconst room = new Room();\nawait room.connect(wsUrl, token);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#disconnect-from-a-room","title":"Disconnect from a Room","text":"
                                                                                                                                                                                                    await room.disconnect();\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#publish-a-track","title":"Publish a Track","text":"

                                                                                                                                                                                                    You can directly publish the default camera and microphone of the device using methods setCameraEnabled and setMicrophoneEnabled of the LocalParticipant object:

                                                                                                                                                                                                    // Publish a video track from the default camera\nawait room.localParticipant.setCameraEnabled(true);\n// Publish an audio track from the default microphone\nawait room.localParticipant.setMicrophoneEnabled(true);\n

                                                                                                                                                                                                    It is also possible to publish both of them at the same time using method LocalParticipant.enableCameraAndMicrophone, which has the advantage of showing a single permission dialog to the user:

                                                                                                                                                                                                    // Publish both default video and audio tracks triggering a single permission dialog\nawait room.localParticipant.enableCameraAndMicrophone();\n

                                                                                                                                                                                                    To craft a custom Track, you can use the LocalParticipant.createTracks method and publish them with LocalParticipant.publishTrack:

                                                                                                                                                                                                    var tracks = await room.localParticipant.createTracks({\n  audio: {\n    deviceId: \"default\",\n    autoGainControl: true,\n    echoCancellation: true,\n    noiseSuppression: true\n  },\n  video: {\n    deviceId: 'frontcamera';\n    facingMode: 'user'\n  },\n});\nawait Promise.all([\n    room.localParticipant.publishTrack(tracks[0]),\n    room.localParticipant.publishTrack(tracks[1]),\n]);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#muteunmute-a-track","title":"Mute/Unmute a Track","text":"

                                                                                                                                                                                                    To mute the default camera and microphone Tracks:

                                                                                                                                                                                                    await room.localParticipant.setCameraEnabled(false);\nawait room.localParticipant.setMicrophoneEnabled(false);\n

                                                                                                                                                                                                    To mute/unmute a custom Track:

                                                                                                                                                                                                    // Mute the track\nawait track.mute();\n\n// Unmute the track\nawait track.unmute();\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#unpublish-a-track","title":"Unpublish a Track","text":"

                                                                                                                                                                                                    To completely stop sending a Track to the Room, you must unpublish it:

                                                                                                                                                                                                    await room.localParticipant.unpublishTrack(track, true);\n

                                                                                                                                                                                                    The second boolean parameter indicates if the local Track should be stopped. This usually means freeing the device capturing it (switching off the camera LED, for example).

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#send-messages","title":"Send messages","text":"

                                                                                                                                                                                                    You can share information between Participants of a Room in different ways.

                                                                                                                                                                                                    First of all, you can set Room metadata that will be available for all clients in the Room object. You do so in your application server when calling the CreateRoom API (available for all LiveKit Server SDKs and the HTTP Server API). The Room metadata will be available in the client side like this:

                                                                                                                                                                                                    console.log(room.metadata);\n

                                                                                                                                                                                                    You can update the Room metadata at any time from your application server with the UpdateRoomMetadata API (available for all LiveKit Server SDKs and the HTTP Server API). The client side will be notified of the change with the roomMetadataChanged event of the Room object:

                                                                                                                                                                                                    room.on('roomMetadataChanged', (metadata) => {\n  console.log('New room metadata', metadata);\n});\n

                                                                                                                                                                                                    Secondly, you can also set Participant metadata. You do so when creating an access token in your application server, setting metadata field of the JWT.

                                                                                                                                                                                                    Participants can also update their own metadata from the client side, if their access token was created with grant canUpdateOwnMetadata.

                                                                                                                                                                                                    room.localParticipant.setMetadata('new metadata');\n

                                                                                                                                                                                                    The client side will be notified of the change with the participantMetadataChanged event of the Room and/or Participant object:

                                                                                                                                                                                                    // To handle all metadata changes of all participants\nroom.on(RoomEvent.ParticipantMetadataChanged, (previousMetadata: string, participant) => {\n  console.log('New metadata for participant', participant.identity, participant.metadata);\n});\n\n// To handle only metadata changes of a specific participant\nparticipant.on(ParticipantEvent.ParticipantMetadataChanged, (previousMetadata) => {\n    console.log('New metadata for participant', participant.identity, participant.metadata);\n});\n

                                                                                                                                                                                                    Finally, you can send messages to Participants in the Room using the LocalParticipant.publishData method:

                                                                                                                                                                                                    const data: Uint8Array = new TextEncoder().encode(JSON.stringify(''));\nroom.localParticipant.publishData(data, { reliable: true, topic: 'chat', destinationIdentities: ['participant-identity'] });\n

                                                                                                                                                                                                    The DataPublishOptions allow setting the reliability of the message (depending on the nature of the message it can be sent as a reliable or lossy message), a topic to easily filter messages, and the participants that will receive the message.

                                                                                                                                                                                                    The client side will be notified of the message with the dataReceived event of the Room and/or Participant object:

                                                                                                                                                                                                    // To receive all messages from the Room\nroom.on(RoomEvent.DataReceived, (payload: Uint8Array, participant: Participant, kind: DataPacket_Kind) => {\n  const strData = new TextDecoder().decode(payload);\n  console.log('Received data from', participant.identity, strData);\n});\n\n// To receive messages only from a specific participant\nparticipant.on(ParticipantEvent.DataReceived, (payload: Uint8Array, kind: DataPacket_Kind) => {\n  const strData = new TextDecoder().decode(payload);\n  console.log('Received data from', participant.identity, strData);\n});\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#from-your-application-server","title":"From your application server","text":"

                                                                                                                                                                                                    Except for the generation of access tokens, it is possible for all the logic of your application to be contained entirely on the client side. Nonetheless, some use cases may require the management of the Rooms from the server side.

                                                                                                                                                                                                    These operations are only available in the server SDKs, and not in the client SDKs:

                                                                                                                                                                                                    • Closing a Room. From the client side, a user can only leave his own Room.
                                                                                                                                                                                                    • Removing any Participant from a Room. From the client side, a user can only leave his own Room.
                                                                                                                                                                                                    • Muting any Track of any Participant. From the client side, a user can only mute/unmute his own Tracks.
                                                                                                                                                                                                    • Updating the metadata of any Participant. From the client side, a user can only update his own metadata.
                                                                                                                                                                                                    • Updating the metadata of the Room. From the client side this is not possible.
                                                                                                                                                                                                    • Egress operations. Egress cannot be started and stopped on demand by users from the client side.
                                                                                                                                                                                                    • Ingress operations. Ingress cannot be started and stopped on demand by users from the client side.

                                                                                                                                                                                                    You have here the complete list of the server-side operations, documented for the HTTP Server API. All the LiveKit Server SDKs have the same operations.

                                                                                                                                                                                                    • RoomService: to manage Rooms and Participants.
                                                                                                                                                                                                    • Egress: to manage egress operations.
                                                                                                                                                                                                    • Ingress: to manage ingress operations.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#screen-sharing","title":"Screen Sharing","text":"

                                                                                                                                                                                                    To quickly publish a screen sharing Track:

                                                                                                                                                                                                    await room.localParticipant.setScreenShareEnabled(true);\n

                                                                                                                                                                                                    You can also create custom screen tracks, for example capturing the audio of the screen and fine-tuning the video capture options (checkout the ScreenTrackOptions interface for detailed information):

                                                                                                                                                                                                    const screenTracks = await room.localParticipant.createScreenTracks({\n    audio: true,\n    contentHint: \"detail\",\n    preferCurrentTab: true,\n    video: {\n        displaySurface: \"window\"\n    }\n});\nawait Promise.all([\n    room.localParticipant.publishTrack(screenTracks[0]),\n    room.localParticipant.publishTrack(screenTracks[1]),\n]);\n

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#virtual-background","title":"Virtual Background","text":"

                                                                                                                                                                                                    It is possible to apply a virtual background to video tracks. In this way you can blur the background or replace it with an image.

                                                                                                                                                                                                    It is necessary to install an additional dependency to use this feature:

                                                                                                                                                                                                    npm add @livekit/track-processors\n

                                                                                                                                                                                                    To blur the background:

                                                                                                                                                                                                    import { BackgroundBlur } from '@livekit/track-processors';\n\nconst videoTrack = await createLocalVideoTrack();\nconst blur = BackgroundBlur(10);\nawait videoTrack.setProcessor(blur);\n

                                                                                                                                                                                                    To replace the background with an image:

                                                                                                                                                                                                    import { VirtualBackground } from '@livekit/track-processors';\n\nconst videoTrack = await createLocalVideoTrack();\nconst image = VirtualBackground('https://picsum.photos/400');\nawait videoTrack.setProcessor(image);\n

                                                                                                                                                                                                    GitHub Repository

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#recording","title":"Recording","text":"

                                                                                                                                                                                                    You can record your Rooms using the Egress module. Egress allows exporting media from a Room in different formats, including

                                                                                                                                                                                                    • Room Composite Egress: a single video output with all the Tracks of a Room composited in a layout. You can even create your custom layouts.
                                                                                                                                                                                                    • Track Composite Egress: a single video output combining an audio Track and a video Track.
                                                                                                                                                                                                    • Track Egress: individual outputs for each Track of a Room.

                                                                                                                                                                                                    Visit the LiveKit reference documentation for a detailed explanation of Egress:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/developing-your-openvidu-app/how-to/#webhooks","title":"Webhooks","text":"

                                                                                                                                                                                                    Your application server may receive webhooks coming from the OpenVidu deployment. These webhooks inform about events happening in the Rooms, including when a Room is created and finished, when a Participant joins and leaves a Room, when a Track is published and unpublished, and when Egress/Ingress operations take place in a Room.

                                                                                                                                                                                                    Every application server tutorial here is ready to receive webhooks: Application Server Tutorials.

                                                                                                                                                                                                    Visit the LiveKit reference documentation for a detailed explanation of each webhook event:

                                                                                                                                                                                                    Reference docs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/","title":"OpenVidu Call","text":"OpenVidu Call The videoconference application built on top of OpenVidu
                                                                                                                                                                                                    • Ready to use

                                                                                                                                                                                                      Experience all the features you need only with a click: multiparty videoconferences, screen sharing, chat, and more

                                                                                                                                                                                                      Try it

                                                                                                                                                                                                    • Fully Customizable

                                                                                                                                                                                                      Built on an open-source license, OpenVidu Call offers full customization to fit your needs

                                                                                                                                                                                                      Customize it

                                                                                                                                                                                                    • Deploy Anywhere

                                                                                                                                                                                                      Install OpenVidu Call on your own servers or any cloud provider.

                                                                                                                                                                                                      Install it

                                                                                                                                                                                                    Features
                                                                                                                                                                                                    • Secure room access

                                                                                                                                                                                                      OpenVidu Call offers a straightforward authentication system enabling users to join rooms with a single click.

                                                                                                                                                                                                      Additionally, it automatically generates unique room names, providing a distinct URL for each room. This allows users to easily share the URL with friends and colleagues to join the room.

                                                                                                                                                                                                    • Setting up your room

                                                                                                                                                                                                      OpenVidu Call provides users with various options and configurations to personalize their experience before and after entering a room.

                                                                                                                                                                                                      This includes testing and selecting audio and video devices, choosing a nickname, and adjusting the preferred language.

                                                                                                                                                                                                    • Multi-party videoconference

                                                                                                                                                                                                      OpenVidu Call offers a multi-party videoconference feature that allows users to connect with multiple participants in a single room.

                                                                                                                                                                                                      Flexible and easy to use, it allows you to see all participants at once, making it ideal for team meetings, webinars, and more.

                                                                                                                                                                                                    • Chatting time!

                                                                                                                                                                                                      Chatting is an essential feature for any videoconference application.

                                                                                                                                                                                                      OpenVidu Call offers a chat feature that allows users to communicate with each other during a videoconference.

                                                                                                                                                                                                    • Recording your sessions for posterity

                                                                                                                                                                                                      Recording your videoconference sessions is a great way to keep a record of important meetings, webinars, and more.

                                                                                                                                                                                                      Record, playback, download and share your videoconference sessions with OpenVidu Call's recording feature.

                                                                                                                                                                                                    • Background effects

                                                                                                                                                                                                      Virtual backgrounds are a fun and useful feature that allows users to change their background during a videoconference.

                                                                                                                                                                                                      OpenVidu Call offers a virtual background feature that allows users to choose from a variety of backgrounds for enhancing privacy and professionalism.

                                                                                                                                                                                                    • Recording Management

                                                                                                                                                                                                      Allow administrators to manage recordings, including deleting, downloading, and sharing them.

                                                                                                                                                                                                      The admin dashboard provides a simple interface to manage all recordings.

                                                                                                                                                                                                    And much more...
                                                                                                                                                                                                    • Broadcasting (Live Streaming)

                                                                                                                                                                                                      Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

                                                                                                                                                                                                    • Automatic Reconnection

                                                                                                                                                                                                      Ensures that users are automatically reconnected to the call in case of temporary network issues

                                                                                                                                                                                                    • Speaker Detection

                                                                                                                                                                                                      Highlights the active speaker automatically, making it easier for participants to follow the conversation

                                                                                                                                                                                                    • Screen Sharing

                                                                                                                                                                                                      Allow users to share their screen and their camera at the same time with other participants in the call

                                                                                                                                                                                                    • Fullscreen Mode

                                                                                                                                                                                                      Offers a fullscreen mode for users to focus on the videoconference without any distractions

                                                                                                                                                                                                    • Powerful Layout

                                                                                                                                                                                                      Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

                                                                                                                                                                                                    All the features you need to quickly build your perfect real-time application

                                                                                                                                                                                                    Try it

                                                                                                                                                                                                    Customize it

                                                                                                                                                                                                    Install it

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/","title":"OpenVidu Call Documentation","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    Introducing OpenVidu Call, the premier videoconference application that showcases the full potential of the OpenVidu platform. OpenVidu Call is not just any videoconferencing tool; it\u2019s the default and flagship app built with the robust and versatile OpenVidu Components.

                                                                                                                                                                                                    OpenVidu Call"},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#run-openvidu-call","title":"Run OpenVidu Call","text":""},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    OpenVidu Call have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    Accessible via openvidu-local-deployment

                                                                                                                                                                                                    A pre-built OpenVidu Call application is launched as part of the openvidu-local-deployment and it can be accessible by visiting http://localhost:7880/openvidu-call/.

                                                                                                                                                                                                    If you want to explore and run the OpenVidu Call code locally, follow the instructions below.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#2-download-openvidu-call-code","title":"2. Download OpenVidu Call code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-call.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#3-run-the-openvidu-call-backend","title":"3. Run the OpenVidu Call backend","text":"
                                                                                                                                                                                                    1. Navigate to the backend directory:

                                                                                                                                                                                                      cd openvidu-call/backend\n
                                                                                                                                                                                                    2. Install the dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Start the application:

                                                                                                                                                                                                      npm run dev:start\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#4-run-the-openvidu-call-frontend","title":"4. Run the OpenVidu Call frontend","text":"

                                                                                                                                                                                                    Launching another terminal, under the openvidu-call directory:

                                                                                                                                                                                                    1. Navigate to the frontend directory:

                                                                                                                                                                                                      cd openvidu-call/frontend\n
                                                                                                                                                                                                    2. Install the dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Start the application:

                                                                                                                                                                                                      npm run dev:start\n

                                                                                                                                                                                                    The application will be available at http://localhost:5080.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#architecture","title":"Architecture","text":"

                                                                                                                                                                                                    The OpenVidu Call architecture is divided into two main components:

                                                                                                                                                                                                    • frontend: which is the client-side application built with Angular and OpenVidu Components.
                                                                                                                                                                                                    • backend: which is the server-side application built with Node.js and Express and uses the LiveKit Server SDK library to interact with the OpenVidu Server.

                                                                                                                                                                                                    OpenVidu Call Architecture OpenVidu Call frontend OpenVidu Call backend

                                                                                                                                                                                                    The client-side application built with Angular that provides the user interface for the videoconference. It uses the OpenVidu Components library to create the videoconference layout with ease.

                                                                                                                                                                                                    The project architecture is divided into the following directories:

                                                                                                                                                                                                    • guards: Contains the guards that handle the authentication.
                                                                                                                                                                                                    • models: Contains the models that define the data structures.
                                                                                                                                                                                                    • pages: Contains the components that define the different pages of the application.
                                                                                                                                                                                                    • services: Contains the services that interact with the backend in a RESTful manner.

                                                                                                                                                                                                    Additionally, the project hosts the following files:

                                                                                                                                                                                                    • app.component.ts: The main file that initializes the Angular application.
                                                                                                                                                                                                    • app-routes.ts: Contains the routes that define the application navigation.
                                                                                                                                                                                                    • app,config.ts: Contains the configuration settings for the application. This file is where import for the OpenVidu Angular Components are defined.

                                                                                                                                                                                                    The server-side application built with Node.js and Express that manages the communication between the OpenVidu Server and the frontend.

                                                                                                                                                                                                    It uses the LiveKit Server SDK library to interact with the OpenVidu Server and handle the authentication, videoconference rooms, recordings, broadcasts, and other features.

                                                                                                                                                                                                    The project architecture is divided into the following directories:

                                                                                                                                                                                                    • controllers: Contains the controllers that handle the HTTP requests.
                                                                                                                                                                                                    • services: Contains the services that interact with the OpenVidu Server.
                                                                                                                                                                                                    • models: Contains the models that define the data structures.
                                                                                                                                                                                                    • helpers: Contains the helper functions.

                                                                                                                                                                                                    Additionally, the project hosts the following files:

                                                                                                                                                                                                    • server.ts: The main file that initializes the Express application.
                                                                                                                                                                                                    • routes.ts: Contains the routes that define the API endpoints.
                                                                                                                                                                                                    • config.ts: Contains the configuration settings for the application.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#features","title":"Features","text":""},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#authentication","title":"Authentication","text":"

                                                                                                                                                                                                    OpenVidu Call provides user authentication to ensure that only authorized users can access the videoconference rooms. The authentication process is handled by the backend, which uses Basic Authentication to verify the user credentials.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#video-conferencing","title":"Video conferencing","text":""},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#essential-features","title":"Essential Features","text":"

                                                                                                                                                                                                    OpenVidu Call offers essential features that make video conferencing simple and intuitive for users. These features include:

                                                                                                                                                                                                    • Multilingual

                                                                                                                                                                                                      Supports for multiple languages, allowing users to select their preferred language for the interface

                                                                                                                                                                                                    • Device Selection

                                                                                                                                                                                                      Users can choose their preferred audio and video devices before and during the call

                                                                                                                                                                                                    • Fullscreen Mode

                                                                                                                                                                                                      Offers a fullscreen mode for users to focus on the videoconference without any distractions

                                                                                                                                                                                                    • Screen Sharing

                                                                                                                                                                                                      Allow users to share their screen and their camera at the same time with other participants in the call

                                                                                                                                                                                                    • Powerful Layout

                                                                                                                                                                                                      Offers a powerful layout where users can view multiple participants simultaneously in a grid layout or focus on a single participant

                                                                                                                                                                                                    • Chat Integration

                                                                                                                                                                                                      Built-in chat functionality enabling participants to send text messages to the group

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#advanced-features","title":"Advanced Features","text":"

                                                                                                                                                                                                    The advanced features of OpenVidu Call enhance the video conferencing experience by providing additional functionalities that improve collaboration and productivity.

                                                                                                                                                                                                    • Speaker Detection

                                                                                                                                                                                                      Highlights the active speaker automatically, making it easier for participants to follow the conversation

                                                                                                                                                                                                    • Automatic Reconnection

                                                                                                                                                                                                      Ensures that users are automatically reconnected to the call in case of temporary network issues

                                                                                                                                                                                                    • Recording

                                                                                                                                                                                                      Supports recording of video conferences for later playback

                                                                                                                                                                                                    • Broadcasting (Live Streaming)

                                                                                                                                                                                                      Allows live streaming of the video conference to platforms like YouTube, Twitch, and others for a wider audience

                                                                                                                                                                                                    • Virtual Backgrounds

                                                                                                                                                                                                      Enables users to use virtual backgrounds during the call, enhancing privacy and professionalism

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#admin-dashboard","title":"Admin Dashboard","text":"

                                                                                                                                                                                                    An admin dashboard is integrated into OpenVidu Call to provide additional functionalities for the admin user.

                                                                                                                                                                                                    • Admin Authentication

                                                                                                                                                                                                      Provides admin authentication to ensure that only authorized users can access the admin dashboard

                                                                                                                                                                                                    • Recording Management

                                                                                                                                                                                                      Allows the admin user to view, download, and delete the recordings stored in the OpenVidu Server

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#build-and-deployment","title":"Build and Deployment","text":""},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#docker-image","title":"Docker Image","text":"

                                                                                                                                                                                                    The process to build a Docker image of OpenVidu call is really easy, you just need to run the following instructions:

                                                                                                                                                                                                    1. Build the Docker image:

                                                                                                                                                                                                      cd docker\n./create_image.sh openvidu-call\n

                                                                                                                                                                                                      This script will create a Docker image with the name openvidu-call.

                                                                                                                                                                                                    2. Run the Docker container:

                                                                                                                                                                                                      docker run -p 6080:6080 \\\n-e LIVEKIT_URL=wss://your-livekit-server-url \\\n-e LIVEKIT_API_KEY=your-livekit-api-key \\\n-e LIVEKIT_API_SECRET=your-livekit-api-secret \\\nopenvidu-call\n

                                                                                                                                                                                                      Once the container is running, you can access the OpenVidu Call application by visiting http://localhost:6080.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/openvidu-call/docs/#package-bundle","title":"Package bundle","text":"

                                                                                                                                                                                                    To build the OpenVidu Call application without using Docker, you can follow the instructions:

                                                                                                                                                                                                    1. Build the frontend application:

                                                                                                                                                                                                      cd frontend\nnpm install && npm run build-and-copy\ncd ..\n
                                                                                                                                                                                                    2. Build the backend application:

                                                                                                                                                                                                      cd backend\nnpm install\nnpm run build\n
                                                                                                                                                                                                    3. Start the backend application:

                                                                                                                                                                                                      node dist/src/server.js\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/","title":"Deployment types","text":"

                                                                                                                                                                                                    OpenVidu offers user-friendly installers that facilitate quick on-premises deployments, so you can self-host your real-time solution in your own infrastructure or any cloud provider.

                                                                                                                                                                                                    There are different deployment options available, depending on your needs:

                                                                                                                                                                                                    Type of deployment OpenViduLocal (development) OpenViduSingle Node OpenViduElastic OpenViduHigh Availability OpenVidu Edition COMMUNITY PRO COMMUNITY PRO PRO Suitability For local development in your laptop For applications with medium user load For applications with dynamic user load that require scalability For applications where both scalability and fault tolerance are critical Features Friendly Docker Compose setup with Redis, Egress, Ingress, S3 storage and observability. With automatic certificate management to test across devices in your network Custom LiveKit distribution with Redis, Egress, Ingress, S3 storage and observability Same benefits as OpenVidu Single Node plus 2x performance, scalability and advanced observability Same benefits as OpenVidu Single Node and OpenVidu Elastic plus fault tolerance Number of servers Your laptop 1 Node 1 Master Node +N Media Nodes 4 Master Nodes +N Media Nodes Installation instructions Install Install Install Install

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#openvidu-local-development","title":"OpenVidu Local (development)","text":"

                                                                                                                                                                                                    To run OpenVidu in your local machine, this is the quickest option. It is a Docker Compose setup that includes all the necessary services to run OpenVidu in your LAN, including automated SSL certificates that will be valid across all devices in your network.

                                                                                                                                                                                                    OpenVidu Local (development)"},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#openvidu-single-node","title":"OpenVidu Single Node","text":"

                                                                                                                                                                                                    This is the simplest production-ready OpenVidu deployment available. It provides all the features you need, but lacks scalability and fault tolerance. But make no mistake about it: it is perfectly suitable for medium-scale production deployments. For most projects OpenVidu Single Node will be enough, at least until your user load gets serious. You can host hundreds of simultaneous participants in your rooms by running OpenVidu Community on a sufficiently powerful server!

                                                                                                                                                                                                    It is composed of a single OpenVidu Node hosting all the necessary services in a monolithic setup.

                                                                                                                                                                                                    OpenVidu Single Node"},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#openvidu-elastic","title":"OpenVidu Elastic","text":"

                                                                                                                                                                                                    This is the intermediate OpenVidu deployment. It provides scalability for your video rooms. Suitable for applications with dynamic load in the media plane that require scalability.

                                                                                                                                                                                                    It is composed of two different types of nodes, one of them running on a cluster of multiple servers and the other running as a single monolithic server:

                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster.
                                                                                                                                                                                                    • A single Master Node hosting all the support services in a monolithic setup.

                                                                                                                                                                                                    OpenVidu Elastic"},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#openvidu-high-availability","title":"OpenVidu High Availability","text":"

                                                                                                                                                                                                    This is the most complete OpenVidu deployment. It provides scalability for your video rooms and fault tolerance in all its services. Suitable for applications where both scalability and availability are critical.

                                                                                                                                                                                                    It is composed of two different types of nodes running on two separate clusters:

                                                                                                                                                                                                    • A cluster of Media Nodes hosting all the media-related services. Your video rooms scale up and down thanks to this cluster. The minimum number of nodes in this cluster is 1, and it is designed to scale up and down dynamically according to workload.
                                                                                                                                                                                                    • A cluster of Master Nodes hosting all the support services in their high availability format. Your deployment is fault tolerant thanks to this cluster. The minimum number of nodes in this cluster is 4, and it is designed to have a fixed number of nodes at all times.

                                                                                                                                                                                                    OpenVidu High Availability cluster"},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#node-services","title":"Node services","text":"

                                                                                                                                                                                                    OpenVidu is composed of several services that work together to provide a complete videoconferencing solution. Every service runs as a Docker container, coordinated with Docker Compose.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#master-node-services","title":"Master Node services","text":"SERVICE DESCRIPTION OpenVidu Dashboard Web application interface for managing your cluster and visualizing your Rooms. Default Application (OpenVidu Call) A fully fledged videoconference web application ready to be used out-of-the-box. OpenVidu Operator Module that supervises the high availability services and updates the loadbalancing configuration dynamically. Redis Database used to share transient information between Media Nodes and coordinate them. In OpenVidu High Availability this is an instance of a Redis Cluster. MongoDB Database used to store analytics and monitoring persistent data. In OpenVidu High Availability this is an instance of a MongoDB Replica Set. Minio S3 bucket used to store recordings and common node configurations. In OpenVidu High Availability this is an instance of a Minio Multi-Node. Caddy Reverse proxy used as a loadbalancer to distribute client connections across your nodes and automatically manage your TLS certificate. Mimir (observability) Module used to store metrics from Prometheus. Promtail (observability) Module used to collect logs from all services and send them to Loki. Loki (observability) Module used to store logs. Grafana (observability) Module used to visualize logs and metrics in dashboards."},{"location":"/3.0.0-beta3/docs/self-hosting/deployment-types/#media-node-services","title":"Media Node services","text":"SERVICE DESCRIPTION OpenVidu Server Media server used to stream real-time video, audio and data. Based on SFUs LiveKit and mediasoup. Egress Server Module used to export media from a Room (for example, recordings or RTMP broadcasting). See Egress. Ingress Server Module used to import media into a Room (for example, an MP4 video or an RTSP stream). See Ingress. Caddy Reverse proxy used as a loadbalancer to distribute the load generated by the Media Nodes over the Minio, Mimir and Loki cluster. Prometheus (observability) Module used to collect metrics from OpenVidu Server and send them to Loki. Promtail (observability) Module used to collect logs from all services and send them to Loki."},{"location":"/3.0.0-beta3/docs/self-hosting/faq/","title":"Installation FAQs","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#common-issues","title":"Common issues","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#everything-looks-alright-but-i-cannot-see-any-remote-video","title":"Everything looks alright, but I cannot see any remote video.","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#my-local-video-is-not-showing-up-on-the-browser","title":"My local video is not showing up on the browser","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#any-tips-to-make-easier-the-development-of-my-webrtc-application","title":"Any tips to make easier the development of my WebRTC application?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#test-applications-in-my-network-with-multiple-devices","title":"Test applications in my network with multiple devices.","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#does-my-app-need-a-server-side","title":"Does my app need a server-side?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#caddy-certificates-are-not-working-what-can-i-do","title":"Caddy certificates are not working. What can I do?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#my-commercial-certificate-is-not-working-what-can-i-do","title":"My commercial certificate is not working. What can I do?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#how-can-i-customize-the-caddy-configuration","title":"How can I customize the Caddy configuration?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#openvidu-does-not-work-for-clients-behind-restrictive-firewalls","title":"OpenVidu does not work for clients behind restrictive firewalls.","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#fundamentals-knowledge","title":"Fundamentals Knowledge","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-a-domain-name-and-how-can-i-get-one","title":"What is a domain name and how can I get one?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-an-aws-elastic-ip-and-how-can-i-create-one","title":"What is an AWS Elastic IP and how can I create one?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-a-vpc-and-a-subnet-in-aws","title":"What is a VPC and a subnet in AWS?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-a-dns-record-and-how-can-i-create-one","title":"What is a DNS record and how can I create one?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-means-each-type-of-certificate-in-openvidu","title":"What means each type of certificate in OpenVidu?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-stun-and-turn-and-why-do-i-need-them","title":"What is STUN and TURN and why do I need them?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-a-caddy-server-and-why-is-it-used-in-openvidu","title":"What is a Caddy server and why is it used in OpenVidu?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/faq/#what-is-the-operator-service-in-openvidu","title":"What is the \"operator\" service in OpenVidu?","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/local/","title":"OpenVidu Local Installation (Development)","text":"

                                                                                                                                                                                                    First, make sure you have the following prerequisites:

                                                                                                                                                                                                    Windows macOS Linux
                                                                                                                                                                                                    • Install Docker Desktop
                                                                                                                                                                                                    • Install Docker Desktop
                                                                                                                                                                                                    • Install Docker
                                                                                                                                                                                                    • Install Docker Compose

                                                                                                                                                                                                    The installation consists of cloning a repository and running a script to configure your local IP address in the deployment. Then, you can start, stop, and manage your deployment with Docker Compose.

                                                                                                                                                                                                    To install OpenVidu locally, follow these steps:

                                                                                                                                                                                                    OpenVidu COMMUNITYOpenVidu PRO
                                                                                                                                                                                                    1. Clone the following repository:

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n
                                                                                                                                                                                                    1. Clone the following repository:

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      To use a specific OpenVidu version, switch to the desired tag with git checkout <version>, e.g., git checkout 3.0.0. By default, the latest version is used.

                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/pro\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu PRO runs locally in evaluation mode for free for development and testing purposes. Some limits apply:

                                                                                                                                                                                                    • Maximum 8 Participants across all Rooms
                                                                                                                                                                                                    • Maximum 5 minutes duration per Room

                                                                                                                                                                                                    For a production environment, you need to create an OpenVidu account to get a license key. There's a 15 day free trial waiting for you!

                                                                                                                                                                                                    The deployment is ready when you see the following message:

                                                                                                                                                                                                     =========================================\n \ud83c\udf89 OpenVidu is ready! \ud83c\udf89\n =========================================\n\n OpenVidu Server && LiveKit Server URLs:\n\n     - From this machine:\n\n         - http://localhost:7880\n         - ws://localhost:7880\n\n     - From other devices in your LAN:\n\n         - https://xxx-yyy-zzz-www.openvidu-local.dev:7443\n         - wss://xxx-yyy-zzz-www.openvidu-local.dev:7443\n\n =========================================\n\n OpenVidu Developer UI (services and passwords):\n\n     - http://localhost:7880\n     - https://xxx-yyy-zzz-www.openvidu-local.dev:7443\n\n =========================================\n

                                                                                                                                                                                                    By visiting http://localhost:7880 you have the OpenVidu Developer UI available with a summary of the services and passwords deployed. You can access the following services:

                                                                                                                                                                                                    • OpenVidu API (LiveKit compatible) (http://localhost:7880): the main API endpoint for your OpenVidu and LiveKit applications. OpenVidu v2 compatibility API is only available in OpenVidu PRO.
                                                                                                                                                                                                    • OpenVidu Dashboard (http://localhost:7880/dashboard): a web application interface to visualize your Rooms, Ingress and Egress services.
                                                                                                                                                                                                    • MinIO (http://localhost:7880/minio-console): as an S3 storage service for recordings.
                                                                                                                                                                                                    • OpenVidu Call (Default Application) (http://localhost:7880/openvidu-call): an optional ready-to-use videoconferencing application.

                                                                                                                                                                                                    You just need to point your OpenVidu and LiveKit applications to http://localhost:7880 or ws://localhost:7880 and start developing. Check our tutorials if you want a step-by-step guide to develop your first application using OpenVidu.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/local/#configuration","title":"Configuration","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/local/#configure-your-application-to-use-the-local-deployment","title":"Configure your Application to use the Local Deployment","text":"

                                                                                                                                                                                                    To point your applications to your local OpenVidu Local deployment, check the credentials at http://localhost:7880 or simply check the .env file. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    OpenVidu COMMUNITYOpenVidu PRO

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • URL: It must be ws://localhost:7880 or http://localhost:7880 depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: It must be ws://localhost:7880/ or http://localhost:7880/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in .env of DOMAIN_NAME as a URL. For example, http://localhost:7880
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in .env of LIVEKIT_API_SECRET

                                                                                                                                                                                                    If you want to use the OpenVidu Local deployment from other devices on your network, follow the instructions in the next section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/local/#configuring-webhooks","title":"Configuring webhooks","text":"

                                                                                                                                                                                                    To configure webhooks in your local deployment, simply go to the file livekit.yaml and add to the webhooks section the URL where you want to receive the events:

                                                                                                                                                                                                    webhook:\n    <LIVEKIT_API_KEY>:<LIVEKIT_API_SECRET>:\n    urls:\n        - <YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                    In case you are using the v2compatibility and you want to receive webhooks for OpenVidu v2 applications, you can configure the webhooks in the .env file. For example:

                                                                                                                                                                                                    V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                    Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the events.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/local/#accessing-your-local-deployment-from-other-devices-on-your-network","title":"Accessing your local deployment from other devices on your network","text":"

                                                                                                                                                                                                    Testing WebRTC applications can be challenging because devices require a secure context (HTTPS) to access the camera and microphone. When using LiveKit Open Source, this isn't an issue if you access your app from the same computer where the LiveKit Server is running, as localhost is considered a secure context even over plain HTTP. Consider the following architecture:

                                                                                                                                                                                                    The simplest way to test your application is:

                                                                                                                                                                                                    1. Run LiveKit Server on your computer.
                                                                                                                                                                                                    2. Connect your app to LiveKit Server through localhost.
                                                                                                                                                                                                    3. Serve both your application client and server from the same computer.
                                                                                                                                                                                                    4. Access your app from localhost in a browser on the same computer.

                                                                                                                                                                                                    This setup is straightforward, but what if you need to test your app from multiple devices simultaneously, including real mobile devices? In this case, you must use a secure context (HTTPS), which introduces two challenges:

                                                                                                                                                                                                    1. LiveKit Server open source does not natively support HTTPS. You'll need a reverse proxy to serve LiveKit Server over HTTPS.
                                                                                                                                                                                                    2. Even with HTTPS, your SSL certificate might not be valid for local network addresses. You'll need to accept it in the browser for web apps, and install it on mobile devices.

                                                                                                                                                                                                    OpenVidu Local Deployment addresses these issues by providing a magic domain name openvidu-local.dev that resolves to any IP specified as a subdomain and provides a valid wildcard certificate for HTTPS. This is similar to services like nip.io, traefik.me, or localtls.

                                                                                                                                                                                                    When using OpenVidu Local Deployment, you can access OpenVidu Server (which is 100% LiveKit compatible) and your app from any device on your local network with a valid HTTPS certificate. The following table shows the URLs to access the deployment and your application locally and from other devices on your network:

                                                                                                                                                                                                    Local access Access from devices in your local network Usage Access only from the development machine Access from any device connected to your local network. In the URLs below, replace xxx-yyy-zzz-www with the local IP address of the development machine, replacing the dots (.) with dashes (-). You can find the configured local IP in the .env file in the LAN_PRIVATE_IP variable Application Client (frontend) http://localhost:5080 https://xxx-yyy-zzz-www.openvidu-local.dev:5443 Application Server (backend) http://localhost:6080 https://xxx-yyy-zzz-www.openvidu-local.dev:6443 OpenVidu (LiveKit Compatible) URL http://localhost:7880 https://xxx-yyy-zzz-www.openvidu-local.dev:7443

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    • If you are developing locally, use localhost to access the services, but if you want to test your application from other devices on your network, use the openvidu-local.dev URLs.
                                                                                                                                                                                                    • Replace xxx-yyy-zzz-www with your local IP address. You can find it in the .env file in the LAN_PRIVATE_IP variable.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    If the URL isn't working because the IP address is incorrect or the installation script couldn't detect it automatically, you can update the LAN_PRIVATE_IP value in the .env file and restart the deployment with docker compose up.

                                                                                                                                                                                                    When developing web applications with this deployment, you can use the following code snippet to dynamically determine the appropriate URLs for the application server and the OpenVidu server based on the browser's current location. This approach allows you to seamlessly run your application on both your development machine and other devices within your local network without needing to manually adjust the URLs in your code.

                                                                                                                                                                                                    if (window.location.hostname === \"localhost\") {\n  APPLICATION_SERVER_URL = \"http://localhost:6080\";\n  OPENVIDU_URL = \"ws://localhost:7880\";\n} else {\n  APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443\";\n  OPENVIDU_URL = \"wss://\" + window.location.hostname + \":7443\";\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/local/#about-openvidu-localdev-domain-and-ssl-certificates","title":"About openvidu-local.dev domain and SSL certificates","text":"

                                                                                                                                                                                                    This setup simplifies the configuration of local OpenVidu deployments with SSL, making it easier to develop and test your applications securely on your local network by using the openvidu-local.dev domain and a wildcard SSL certificate valid for *.openvidu-local.dev. However, it\u2019s important to note that these certificates are publicly available and do not provide an SSL certificate for production use.

                                                                                                                                                                                                    The HTTPS offered by openvidu-local.dev is intended for development or testing purposes with the only goal of making your local devices trust your application (which is mandatory in WebRTC applications). For any other use case, it should be treated with the same security considerations as plain HTTP.

                                                                                                                                                                                                    For production, you should consider deploying a production-grade OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/changing-config/","title":"How to change OpenVidu configuration","text":"

                                                                                                                                                                                                    The following steps are valid to change any configuration file in any deployment type. Simply just go to one of your Master Nodes, or the only Node in your deployment, and follow these steps:

                                                                                                                                                                                                    Steps to change OpenVidu configuration
                                                                                                                                                                                                    1. Go to one of your Master Nodes (or the only node in your deployment).
                                                                                                                                                                                                    2. Go to /opt/openvidu/config directory.
                                                                                                                                                                                                    3. Find and change the configuration parameter you want to modify, it could be any file: openvidu.env, master_node.env, livekit.yaml, egress.yaml, etc.
                                                                                                                                                                                                    4. Restart OpenVidu just by executing:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                    Notice that you only need to restart OpenVidu in one of the Master Nodes (or the only node in your deployment) to apply the changes to all the nodes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/changing-config/#types-of-configuration-files","title":"Types of configuration files","text":"

                                                                                                                                                                                                    Configuration files can be divided into three types:

                                                                                                                                                                                                    1. openvidu.env: This file defines configuration parameters used by other services. Such as the domain name, credentials, etc.
                                                                                                                                                                                                    2. master_node.env and media_node.env (Only in Elastic and High Availability): These files define specific configuration parameters of the node they are placed in. It is very useful when you want to have different parameter values in different nodes.
                                                                                                                                                                                                    3. <service>.yaml or <service>.env: These files define the configuration of each service. For example, livekit.yaml defines the configuration of the OpenVidu Server, egress.yaml defines the configuration of the Egress Service, etc.

                                                                                                                                                                                                      These files make use of the parameters defined in the openvidu.env, master_node.env, and media_node.env files. For example, any service configuration file can access the DOMAIN_NAME parameter defined in the openvidu.env file by using this syntax:

                                                                                                                                                                                                      ${openvidu.DOMAIN_NAME}\n

                                                                                                                                                                                                      You can check the OpenVidu Configuration In depth section to learn more about how the configuration system works.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/changing-config/#config-files","title":"Config files","text":"

                                                                                                                                                                                                    These are the configuration files for each kind of deployment:

                                                                                                                                                                                                    Single NodeElasticHigh Availability

                                                                                                                                                                                                    The single node has all configuration files in the same directory /opt/openvidu/config/:

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- openvidu.env\n    |-- livekit.yaml\n    |-- egress.yaml\n    |-- ingress.yaml\n    |-- caddy.yaml\n    |-- redis.env\n    |-- minio.env\n    |-- mongo.env\n    |-- dashboard.env\n    |-- loki.yaml\n    |-- prometheus.yaml\n    |-- promtail.yaml\n    |-- app.env\n    `-- grafana/\n

                                                                                                                                                                                                    OpenVidu Elastic has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- cluster/\n    |   |-- openvidu.env\n    |   |-- master_node/\n    |   |   |-- grafana/\n    |   |   |-- app.env\n    |   |   |-- caddy.yaml\n    |   |   |-- dashboard.env\n    |   |   |-- loki.yaml\n    |   |   |-- mimir.yaml\n    |   |   |-- minio.env\n    |   |   |-- mongo.env\n    |   |   |-- operator.env\n    |   |   |-- promtail.yaml\n    |   |   |-- redis.env\n    |   |   `-- v2compatibility.env\n    |   `-- media_node/\n    |       |-- egress.yaml\n    |       |-- ingress.yaml\n    |       |-- livekit.yaml\n    |       |-- prometheus.yaml\n    |       `-- promtail.yaml\n    `-- node/\n    `-- master_node.env\n

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    `-- node/\n        `-- media_node.env\n

                                                                                                                                                                                                    OpenVidu High Availability has all the cluster configuration at /opt/openvidu/config/cluster/ with each configuration file separated depending on the node they are placed in: master_node or media_node. The file openvidu.env is placed at /opt/openvidu/config/cluster/ because it is used by services of both types of nodes.

                                                                                                                                                                                                    Specific parameter values of each Master Node are placed at /opt/openvidu/config/node/master_node.env.

                                                                                                                                                                                                    Master Node

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    |-- cluster/\n    |   |-- openvidu.env\n    |   |-- master_node/\n    |   |   |-- grafana/\n    |   |   |-- app.env\n    |   |   |-- caddy.yaml\n    |   |   |-- dashboard.env\n    |   |   |-- loki.yaml\n    |   |   |-- mimir.yaml\n    |   |   |-- minio.env\n    |   |   |-- mongo.env\n    |   |   |-- operator.env\n    |   |   |-- promtail.yaml\n    |   |   |-- redis.env\n    |   |   `-- v2compatibility.env\n    |   `-- media_node/\n    |       |-- caddy.yaml\n    |       |-- egress.yaml\n    |       |-- ingress.yaml\n    |       |-- livekit.yaml\n    |       |-- prometheus.yaml\n    |       `-- promtail.yaml\n    `-- node/\n    `-- master_node.env\n

                                                                                                                                                                                                    Media Node

                                                                                                                                                                                                    The Media Node in contrast has only the media_node.env file, because the configuration is centralized in the Master Node.

                                                                                                                                                                                                    |-- /opt/openvidu/config/\n    `-- node/\n        `-- media_node.env\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/changing-config/#troubleshooting-configuration","title":"Troubleshooting configuration","text":"

                                                                                                                                                                                                    After changing the configuration and restarting, you need to make sure that the changes have been applied correctly. Here are some tips to check if something is wrong. All the following commands must be executed in one of the Master Nodes (or the only node in your deployment):

                                                                                                                                                                                                    1. Execute a docker ps. If you see an openvidu-init container constantly restarting, it means that the configuration file you modified has a syntax error. Check the logs of this container to see the error with:

                                                                                                                                                                                                      docker logs openvidu-init\n

                                                                                                                                                                                                      The log is self-explanatory and will tell you what is wrong with the configuration file:

                                                                                                                                                                                                      service 'openvidu': Failed to process config file '/opt/openvidu/config/livekit.yaml': Errors found:\n\n    *  Error at line 18: Unmatched opening brace at position 7\n

                                                                                                                                                                                                      Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      systemctl restart openvidu\n
                                                                                                                                                                                                    2. Execute a docker ps. If you don't see the openvidu-init container, but you see some containers restarting, check the logs of those restarting containers to see what is wrong:

                                                                                                                                                                                                      docker logs <container_id>\n
                                                                                                                                                                                                    3. If all the containers are running correctly, execute the following command:

                                                                                                                                                                                                      tail -f /var/log/openvidu/nodes_errors.log\n

                                                                                                                                                                                                      If you have an error like: 'No such file or directory' or simply the file is empty, the configuration is correct. If the file exists with content, some nodes may be malfunctioning. Check this file and failing container logs for errors.

                                                                                                                                                                                                      This is how the log file looks when there are Media Nodes with errors:

                                                                                                                                                                                                      [2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.5: Container 'openvidu' error:\ncould not parse config: yaml: unmarshal errors:\n  line 17: cannot unmarshal !!str `trueee` into bool\n\n[2024-10-09T05:54:29Z] [ERROR] Error in Media Node - 10.5.0.4: Container 'openvidu' error:\ncould not parse config: yaml: unmarshal errors:\n  line 17: cannot unmarshal !!str `trueee` into bool\n

                                                                                                                                                                                                      As you can see, the log informs you about which Media Node is failing and the error that is causing the failure, so in this way you can fix the file which is causing the error. Once fixed, restart OpenVidu again:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      And again, check the logs until no errors appear.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/in-depth/","title":"OpenVidu configuration system in depth","text":"

                                                                                                                                                                                                    OpenVidu utilizes a powerful and flexible system for configuring services by expanding global parameters defined in the configuration files. This mechanism ensures consistency and simplifies management by allowing global settings to be referenced across multiple service configurations. The variable expansion follows the same interpolation rules as Docker Compose, providing a familiar syntax for those accustomed to Docker.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/in-depth/#how-variable-interpolation-works","title":"How Variable Interpolation Works","text":"

                                                                                                                                                                                                    To understand how variable interpolation works in OpenVidu, it is important to consider two main types of configuration files: global configuration files and service configuration files.

                                                                                                                                                                                                    1. Global Configuration Files:

                                                                                                                                                                                                      • Global parameters are defined in the global configuration files such as openvidu.env, master_node.env, and media_node.env.
                                                                                                                                                                                                      • These files contain key-value pairs that define parameters than can be used in service configuration files.
                                                                                                                                                                                                    2. Service Configuration Files:

                                                                                                                                                                                                      • Each service configuration file can reference these global parameters using a specific syntax.
                                                                                                                                                                                                      • The syntax ${openvidu.ENV_VAR} is used to access and interpolate those values from the global configuration files.
                                                                                                                                                                                                      • If you are configuring a service of the Master Node which needs a specific variable of the Master Node, you can use ${master_node.ENV_VAR}.
                                                                                                                                                                                                      • If you are configuring a service of the Media Node which needs a specific variable of the Media Node, you can use ${media_node.ENV_VAR}.
                                                                                                                                                                                                    3. Interpolation Rules:

                                                                                                                                                                                                      • The interpolation follows the Docker Compose specification, which provides robust handling of global variables.
                                                                                                                                                                                                      • If a variable is mandatory and not set, the syntax ${VAR:?mandatory} can be used to throw an error if the parameter is not defined, ensuring required configurations are not missed. For more detailed information about the interpolation rules, you can refer to the Docker Compose documentation on variable interpolation.
                                                                                                                                                                                                    4. Example:

                                                                                                                                                                                                      Look at this part of the /opt/openvidu/config/media_node/livekit.yaml configuration file in the Master Node of an Elastic deployment:

                                                                                                                                                                                                      openvidu:\n    license: ${openvidu.OPENVIDU_PRO_LICENSE:?mandatory}\n    cluster_id: ${openvidu.DOMAIN_NAME:?mandatory}\n    node:\n        private_ip: ${media_node.MEDIA_NODE_PRIVATE_IP:?mandatory}\n

                                                                                                                                                                                                      This file uses global variables from the openvidu.env and media_node.env files to set up the license, cluster ID, and private IP address for the LiveKit service. The :?mandatory part means these variables must be defined; otherwise, an error will occur. Since this file is for a Media Node, it uses the media_node variables, allowing each Media Node to have different values for the same variable.

                                                                                                                                                                                                      To use a variable from the media_node.env file, write it as ${media_node.ENV_VAR}. Similarly, to use a variable from the openvidu.env or master_node.env file, write it as ${openvidu.ENV_VAR} or ${master_node.ENV_VAR} respectively.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/in-depth/#config-files-replication","title":"Config Files Replication","text":"

                                                                                                                                                                                                    In Elastic and High Availability deployments, the configuration files are replicated across all the Master Nodes in the cluster.

                                                                                                                                                                                                    This ensures that all nodes have the same configuration, making it easier to manage and maintain the cluster. The global configuration files are placed in the /opt/openvidu/config/cluster/ directory, while the node-specific configuration files are placed in the /opt/openvidu/config/node/ directory.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/","title":"Configuration reference","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#openviduenv","title":"openvidu.env:","text":"

                                                                                                                                                                                                    This file defines global configuration parameters used by other services. Such as the domain name, credentials, etc.

                                                                                                                                                                                                    Parameter Description DOMAIN_NAME The domain name for the deployment. Use this domain name to access. OpenVidu APIs and services. LIVEKIT_API_KEY Global LiveKit API Key and Secret used for apps to connect to OpenVidu. LIVEKIT_API_SECRET Global LiveKit API Key and Secret used for apps to connect to OpenVidu. MINIO_ACCESS_KEY Access key for MinIO. MINIO_SECRET_KEY Secret key for MinIO. MONGO_ADMIN_USERNAME MongoDB admin username. MONGO_ADMIN_PASSWORD MongoDB admin password. DASHBOARD_ADMIN_USERNAME Admin username for OpenVidu Dashboard DASHBOARD_ADMIN_PASSWORD Admin password for OpenVidu Dashboard GRAFANA_ADMIN_USERNAME Admin username for Grafana GRAFANA_ADMIN_PASSWORD Admin password for Grafana OPENVIDU_PRO_LICENSE PRO OpenVidu Pro license key. Get an OpenVidu Pro License here. OPENVIDU_RTC_ENGINE PRO The WebRTC engine to use. Can be pion or mediasoup."},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#appenv","title":"app.env:","text":"

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu Call application.

                                                                                                                                                                                                    Parameter Description SERVER_PORT Port where the OpenVidu Call application will be running. LIVEKIT_URL The public URL of the LiveKit server which external clients will use to connect to the OpenVidu Call application. LIVEKIT_URL_PRIVATE The private URL of the LiveKit server which OpenVidu Call backend will use to connect to the LiveKit Server internally. LIVEKIT_API_KEY LiveKit API Key for the OpenVidu Call application to connect to the LiveKit server. CALL_PRIVATE_ACCESS If true, only authenticated users can access the OpenVidu Call application. CALL_USER Username for the OpenVidu Call application. CALL_SECRET Password for the OpenVidu Call application. CALL_ADMIN_USER Admin username for the OpenVidu Call application. CALL_ADMIN_SECRET Admin password for the OpenVidu Call application. CALL_S3_BUCKET S3 bucket name for OpenVidu Call application. It is used to store recordings. CALL_S3_SERVICE_ENDPOINT S3 service endpoint for OpenVidu Call application. CALL_S3_ACCESS_KEY S3 access key for OpenVidu Call application. CALL_S3_SECRET_KEY S3 secret key for OpenVidu Call application. CALL_AWS_REGION AWS region of the S3 Bucket application. CALL_S3_WITH_PATH_STYLE_ACCESS If true, use path-style access for S3. CALL_LOG_LEVEL Log level for OpenVidu Call application. Valid values are: error, warn, info, verbose, debug, silly."},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#pro-v2compatibilityenv","title":"PRO v2compatibility.env","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu V2 Compatibility is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This file defines the configuration parameters for the OpenVidu V2 Compatibility Server.

                                                                                                                                                                                                    Parameter Description OPENVIDU_PRO_LICENSE OpenVidu Pro license key. Get an OpenVidu Pro License here. V2COMPAT_OPENVIDU_SHIM_PORT Port where the OpenVidu V2 Compatibility will be running. By default is 4443 V2COMPAT_OPENVIDU_SHIM_URL Public URL used for openvidu v2 applications used by external clients to connect to the OpenVidu V2 Compatibility Server. V2COMPAT_OPENVIDU_SECRET OpenVidu Secret used by openvidu v2 applications to connect to the OpenVidu deployment. V2COMPAT_LIVEKIT_URL LiveKit URL used by external clients to connect to the OpenVidu V2 Compatibility Server using the LiveKit protocol. V2COMPAT_LIVEKIT_URL_PRIVATE LiveKit URL used by the OpenVidu V2 Compatibility Server to connect to the LiveKit Server internally. V2COMPAT_LIVEKIT_API_KEY LiveKit API Key used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server. V2COMPAT_LIVEKIT_API_SECRET LiveKit API Secret used by the OpenVidu V2 Compatibility Server to interact with the LiveKit Server. V2COMPAT_REDIS_HOST Redis host used by the OpenVidu V2 Compatibility Server to store session data. V2COMPAT_REDIS_PORT Redis port used by the OpenVidu V2 Compatibility Server to connect to the Redis server. V2COMPAT_REDIS_PASSWORD Redis password used by the OpenVidu V2 Compatibility Server to connect to the Redis server. V2COMPAT_REDIS_SENTINEL_HOST_LIST Redis Sentinel host list used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_SENTINEL_PASSWORD Redis Sentinel password used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_MASTER_NAME Redis Sentinel master name used by the OpenVidu V2 Compatibility Server to connect to Redis Sentinel servers. V2COMPAT_REDIS_DB Redis database used by the OpenVidu V2 Compatibility Server. Default value is 0. V2COMPAT_OPENVIDU_RECORDING_PATH Path where the OpenVidu V2 Compatibility Server will store recordings locally. By default in the deployments is /opt/openvidu/recordings. V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGE Where to store the recordings. Valid values are:
                                                                                                                                                                                                    • local: Store the recordings in the local filesystem at the path V2COMPAT_OPENVIDU_RECORDING_PATH
                                                                                                                                                                                                    • s3: Store the recordings in the configured S3 bucket
                                                                                                                                                                                                    Default value is local V2COMPAT_OPENVIDU_RECORDING_CUSTOM_LAYOUT_URL URL of the custom layout used by the OpenVidu V2 Compatibility Server to generate the recordings. V2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESS If true, use path-style access for S3. V2COMPAT_OPENVIDU_RECORDING_ZIP_FILES If true, save individual recordings as zip files V2COMPAT_OPENVIDU_RECORDING_RAW_FILES If true, save individual recordings as files directly V2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET Default bucket name for recordings V2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINT S3 service endpoint for the recordings V2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEY Access key for the recordings S3 bucket V2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEY Secret key for the recordings S3 bucket V2COMPAT_OPENVIDU_PRO_AWS_REGION AWS region of the recordings S3 bucket V2COMPAT_OPENVIDU_WEBHOOK If true, the OpenVidu V2 Compatibility Server will send webhooks to V2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT V2COMPAT_OPENVIDU_WEBHOOK_HEADERS JSON Array list of headers to send in the OpenVidu V2 Webhook events. For example: [\"Content-Type: application/json\"] V2COMPAT_OPENVIDU_WEBHOOK_EVENTS Comma-separated list of OpenVidu V2 Webhook events to send. All available events are:
                                                                                                                                                                                                    • sessionCreated
                                                                                                                                                                                                    • sessionDestroyed
                                                                                                                                                                                                    • participantJoined
                                                                                                                                                                                                    • participantLeft
                                                                                                                                                                                                    • webrtcConnectionCreated
                                                                                                                                                                                                    • webrtcConnectionDestroyed
                                                                                                                                                                                                    • recordingStatusChanged
                                                                                                                                                                                                    • signalSent
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#livekityaml","title":"livekit.yaml:","text":"

                                                                                                                                                                                                    As OpenVidu Server is built on top of LiveKit, the configuration of OpenVidu Server is done in the livekit.yaml file in its own openvidu section in this file. The rest of the configuration is the same as the LiveKit server configuration.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#community-openvidu-server-configuration","title":"COMMUNITY OpenVidu Server Configuration:","text":"
                                                                                                                                                                                                    openvidu:\n    analytics: # (1)\n        enabled: true # (2)\n        mongo_url: mongodb://<MONGO_ADMIN_USERNAME>:<MONGO_ADMIN_PASSWORD>@localhost:20000/ # (3)\n        interval: 10s # (4)\n        expiration: 768h # (5)\n
                                                                                                                                                                                                    1. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    2. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    3. MongoDB connection string. In OpenVidu Single Node, the MongoDB service is running on the same machine, so you can use localhost as the hostname. The default port in OpenVidu for MongoDB is 20000. MONGO_ADMIN_USERNAME and MONGO_ADMIN_PASSWORD are the credentials to access the MongoDB database.
                                                                                                                                                                                                    4. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    5. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#pro-openvidu-server-configuration","title":"PRO OpenVidu Server Configuration:","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Before deploying OpenVidu PRO, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    openvidu:\n    license: <YOUR_OPENVIDU_PRO_LICENSE> # (1)\n    cluster_id: <YOUR_DOMAIN_NAME> # (2)\n    analytics: # (3)\n        enabled: true # (4)\n        interval: 10s # (5)\n        expiration: 768h # (6)\n        mongo_url: <MONGO_URL> # (7)\n    rtc:\n        engine: pion # (8)\n    mediasoup:\n        debug: \"\" # (9)\n        log_level: error # (10)\n        log_tags: [info, ice, rtp, rtcp, message] # (11)\n
                                                                                                                                                                                                    1. Specify your OpenVidu Pro license key. If you don't have one, you can request one here.
                                                                                                                                                                                                    2. The cluster ID for the OpenVidu deployment. It is configured by default by OpenVidu Installer with the domain name of the deployment.
                                                                                                                                                                                                    3. The analytics configuration should be defined at the openvidu level in the livekit.yaml file.
                                                                                                                                                                                                    4. This must be set to true to send analytics data to MongoDB. If set to false, no analytics data will be sent.
                                                                                                                                                                                                    5. Time interval to send analytics data to MongoDB.
                                                                                                                                                                                                    6. Time to keep the analytics data in MongoDB. In this example, it is set to 32 days.
                                                                                                                                                                                                    7. MongoDB URL. This is the connection string to the MongoDB database where the analytics data will be stored.
                                                                                                                                                                                                    8. The rtc.engine parameter is set to pion by default. This is the WebRTC engine used by OpenVidu. Depending on your requirements, you can use:
                                                                                                                                                                                                      • pion
                                                                                                                                                                                                      • mediasoup
                                                                                                                                                                                                    9. Global toggle to enable debugging logs from Mediasoup. In most debugging cases, using just an asterisk (\"*\") here is enough, but this can be fine-tuned for specific log levels. More info.
                                                                                                                                                                                                      • Default is an empty string.
                                                                                                                                                                                                    10. Logging level for logs generated by Mediasoup. More info.
                                                                                                                                                                                                      • Valid values are: debug, warn, error, none.
                                                                                                                                                                                                      • Default is error.
                                                                                                                                                                                                    11. Comma-separated list of log tag names, for debugging. More info.
                                                                                                                                                                                                      • Valid values are: info, ice, dtls, rtp, srtp, rtcp, rtx, bwe, score, simulcast, svc, sctp, message.
                                                                                                                                                                                                      • Default is [info, ice, rtp, rtcp, message].
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/configuration/reference/#other-services-configuration","title":"Other Services Configuration","text":"

                                                                                                                                                                                                    OpenVidu comes with other services configured to work in the deployment. These are the configuration files for each service:

                                                                                                                                                                                                    Service Description Reference documentation OpenVidu Server Manage Rooms and Media Streams.
                                                                                                                                                                                                    • OpenVidu Config
                                                                                                                                                                                                    • LiveKit Config
                                                                                                                                                                                                    Ingress Service Imports video from other sources into OpenVidu rooms. LiveKit Ingress Config Egress Service Exports video from OpenVidu rooms for recording or streaming. LiveKit Egress Config Caddy Server Serves OpenVidu services and handles HTTPS. Caddy JSON Structure Grafana Service Used for visualizing monitoring data. Grafana Config Mimir Service Service for long-term prometheus storage Mimir Config Loki Service Used for log aggregation. Loki Config Prometheus Service Used for monitoring. Prometheus Config Promtail Service Collects logs and sends them to Loki. Promtail Config"},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/","title":"OpenVidu Elastic installation","text":"

                                                                                                                                                                                                    OpenVidu Elastic is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation: Set up OpenVidu Elastic on your own servers.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Elastic on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/","title":"OpenVidu Elastic Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    The deployment of OpenVidu Elastic on AWS is automated using AWS CloudFormation, with Media Nodes managed within an Auto Scaling Group. This group dynamically adjusts the number of instances based on a target average CPU utilization. Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises Elastic documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/#cluster-shutdown-and-startup","title":"Cluster Shutdown and Startup","text":"

                                                                                                                                                                                                    The Master Node is an EC2 instance, while the Media Nodes are part of an Auto Scaling Group. The process for starting and stopping these components differs. The following sections detail the procedures.

                                                                                                                                                                                                    Shutdown the ClusterStartup the Cluster

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Node. This way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to 0, and click on \"Update\".
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that there are no instances in the Auto Scaling Group.

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      It may happen that some instances are still in the \"Terminating:Wait\" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                    7. After confirming that all Media Node instances are terminated, go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.

                                                                                                                                                                                                    8. Right-click on the instance and select \"Stop instance\".

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.
                                                                                                                                                                                                    4. Right-click on the instance and select \"Start instance\".
                                                                                                                                                                                                    5. Wait until the instance is running.
                                                                                                                                                                                                    6. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    9. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. However, since the Media Nodes are part of an Auto Scaling Group, the process differs. The following section details the procedures.

                                                                                                                                                                                                    Master NodesMedia Nodes

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping the Master Node.

                                                                                                                                                                                                    1. Shutdown the cluster.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      You can stop only the Master Node instance to change its instance type, but it is recommended to stop the whole cluster to avoid any issues.

                                                                                                                                                                                                    2. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMasterNode. Click on it to go to the EC2 Dashboard with the Master Node instance selected.

                                                                                                                                                                                                    3. Right-click on the instance and select \"Instance Settings > Change Instance Type\".
                                                                                                                                                                                                    4. Select the new instance type and click on \"Apply\".
                                                                                                                                                                                                    5. Start the cluster.
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Modify template (Create new version)\".
                                                                                                                                                                                                    5. In the \"Instance type\" section, select the new instance type and click on \"Create template version\".
                                                                                                                                                                                                    6. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. In the Launch Template section, select the new version of the launch template we just created at step 5, which is the highest version number.

                                                                                                                                                                                                      Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      By configuring \"Latest\" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                    9. Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/#media-nodes-autoscaling-configuration","title":"Media Nodes Autoscaling Configuration","text":"

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. To configure scaling policies, navigate to the \"Automatic scaling\" tab within the Auto Scaling Group Dashboard, select the unique \"Target tracking scaling\" autoscaling policy, and click on \"Actions > Edit\".
                                                                                                                                                                                                    6. It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      OpenVidu Elastic is by default configured with a \"Target tracking scaling\" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/#fixed-number-of-media-nodes","title":"Fixed Number of Media Nodes","text":"

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    Set Fixed Number of Media Nodes
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the fixed number of Media Nodes you require, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that the Auto Scaling Group has the fixed number of instances running.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Elastic Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Elastic.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Elastic Deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu Elastic deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" in the Master Node instance to apply the changes.

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/","title":"OpenVidu Elastic Installation: AWS","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment in AWS. Deployed services are the same as the On Premises Elastic Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu Elastic in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/latest/aws/cf-openvidu-elastic.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/elastic/3.0.0/aws/cf-openvidu-elastic.yaml\n
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    OpenVidu Elastic AWS Architecture

                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (for OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill in the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#domain-and-ssl-certificate-configuration","title":"Domain and SSL Certificate Configuration","text":"

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    Let's Encrypt Certificate (recommended)Self-Signed CertificateCustom Certificates

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let\u2019s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    You don\u2019t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#openvidu-elastic-configuration","title":"OpenVidu Elastic Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu Elastic deployment.

                                                                                                                                                                                                    OpenVidu Elastic Configuration

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#media-nodes-autoscaling-group-configuration","title":"Media Nodes Autoscaling Group Configuration","text":"

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#vpc-configuration","title":"VPC Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    The OpenViduMasterNodeSubnet and OpenViduMediaNodeSubnet parameters specify the subnets where the Master and Media Nodes will be deployed. All of them must be in the previously specified OpenViduVPC.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services in the Master Node and Media Nodes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Elastic deployment is ready to use. You can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/","title":"OpenVidu Elastic Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Elastic.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Elastic on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Elastic deployments.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu Elastic deployment, you can use the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS\napp                        docker.io/openvidu/openvidu-call                   \"docker-entrypoint.s\u2026\"   app                        12 seconds ago   Up 10 seconds\ncaddy                      docker.io/openvidu/openvidu-pro-caddy              \"/bin/caddy run --co\u2026\"   caddy                      12 seconds ago   Up 10 seconds\ndashboard                  docker.io/openvidu/openvidu-pro-dashboard          \"./openvidu-dashboard\"   dashboard                  12 seconds ago   Up 10 seconds\ngrafana                    docker.io/grafana/grafana                          \"/run.sh\"                grafana                    11 seconds ago   Up 8 seconds\nloki                       docker.io/grafana/loki                             \"/usr/bin/loki -conf\u2026\"   loki                       11 seconds ago   Up 9 seconds\nmimir                      docker.io/grafana/mimir                            \"/bin/mimir -config.\u2026\"   mimir                      11 seconds ago   Up 9 seconds\nminio                      docker.io/bitnami/minio                            \"/opt/bitnami/script\u2026\"   minio                      11 seconds ago   Up 9 seconds\nmongo                      docker.io/mongo                                    \"docker-entrypoint.s\u2026\"   mongo                      11 seconds ago   Up 9 seconds\nopenvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        \"/bin/server\"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds\noperator                   docker.io/openvidu/openvidu-operator               \"/bin/operator\"          operator                   12 seconds ago   Up 10 seconds\npromtail                   docker.io/grafana/promtail                         \"/usr/bin/promtail -\u2026\"   promtail                   11 seconds ago   Up 9 seconds\nredis                      docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis                      12 seconds ago   Up 10 seconds\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS\negress       docker.io/livekit/egress                       \"/entrypoint.sh\"         egress       53 seconds ago   Up 51 seconds\ningress      docker.io/livekit/ingress                      \"ingress\"                ingress      53 seconds ago   Up 52 seconds\nopenvidu     docker.io/openvidu/openvidu-server-pro         \"/livekit-server --c\u2026\"   openvidu     53 seconds ago   Up 52 seconds\nprometheus   docker.io/prom/prometheus                      \"/bin/prometheus --c\u2026\"   prometheus   53 seconds ago   Up 51 seconds\npromtail     docker.io/grafana/promtail                     \"/usr/bin/promtail -\u2026\"   promtail     53 seconds ago   Up 52 seconds\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on:

                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Nodes Logs\": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Services Logs\": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#adding-media-nodes","title":"Adding Media Nodes","text":"

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#removing-media-nodes-gracefully","title":"Removing Media Nodes Gracefully","text":"

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    #!/bin/bash\n# Stop OpenVidu, Ingress, and Egress containers gracefully (1)\ndocker container kill --signal=SIGINT openvidu || true\ndocker container kill --signal=SIGINT ingress || true\ndocker container kill --signal=SIGINT egress || true\n\n# Wait for the containers to stop (2)\nwhile [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == \"true\" ]; do\n    echo \"Waiting for containers to stop...\"\n    sleep 5\ndone\n
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. This script waits for the containers to stop before exiting.

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#removing-media-nodes-forcefully","title":"Removing Media Nodes Forcefully","text":"

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/","title":"OpenVidu Elastic Installation: On-premises","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu Elastic is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Elastic deployment on-premises. The deployment requires one Master Node and any number of Media Nodes. Media Nodes are elastic and can be scaled up and down according to the workload.

                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Elastic On Premises

                                                                                                                                                                                                    • The Master Node acts as a Load Balancer, managing the traffic and distributing it among the Media Nodes and deployed services in the Master Node.
                                                                                                                                                                                                    • The Master Node has its own Caddy server acting as a Layer 4 (For TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates. Provides optional TLS for the TURN server.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 2 machines, each with a minimum of 4GB RAM, 4 CPU cores, and Linux installed (Ubuntu is recommended). One machine will serve as the Master Node, while the others will function as Media Nodes.
                                                                                                                                                                                                    • Significant disk space on the Master Node, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • Each machine must be assigned a Public IP. Additionally, the machine designated as the Master Node must have a Fully Qualified Domain Name (FQDN) that resolves to its Public IP.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#port-rules-master-node","title":"Port rules (Master Node)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Node.

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP traffic to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 1935 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest RTMP streams using Ingress service. TCP 9000 0.0.0.0/0, ::/0 (Optional), only needed if you want to expose MinIO publicly. TCP 4443 Media Nodes (Optional. Only needed when 'OpenVidu v2 Compatibility' module is used) Media Nodes need access to this port to reach OpenVidu V2 compatibility service TCP 6080 Media Nodes (Optional. Only needed when 'Default App' module is used) Media Nodes need access to this port to reach OpenVidu Call (Default Application). TCP 3100 Media Nodes (Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Loki. TCP 9009 Media Nodes (Optional. Only needed when 'Observability' module is used) Media Nodes need access to this port to reach Mimir. TCP 7000 Media Nodes Media Nodes need access to this port to reach Redis Service. TCP 9100 Media Nodes Media Nodes need access to this port to reach MinIO. TCP 20000 Media Nodes Media Nodes need access to this port to reach MongoDB.

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional). Only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Master Node (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Node needs access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Master Node (Optional). Only needed if you want to expose TURN service with TLS. Master Node needs access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Node LiveKit API. Master Node needs access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Node (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Node needs access to this port to reach WHIP HTTP service."},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Node and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu Elastic, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=elastic\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write the 'Master Node' Private IP: Write the private IP of the machine where you are going to install the Master Node.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup(Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Node': These rules are the same as those specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Node) may not appear (Optional ports). Double-check and modify it if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Node': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='elastic' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command in your Master Node to install it. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Elastic 'Master Node' Installation Finished Successfully! \ud83c\udf89   <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n
                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as those defined previously as with the Master Node. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='elastic' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Elastic 'Media Node' Installation Finished Successfully! \ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials for all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='selfsigned'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --private-ip='1.2.3.4' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --private-ip is very important. It should not change and Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/elastic/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --master-node-private-ip='1.2.3.4' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • The --master-node-private-ip is the private IP of the Master Node. Media Nodes should be able to reach the Master Node using this IP.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • At the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/elastic/on-premises/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Elastic deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/","title":"OpenVidu High Availability installation","text":"

                                                                                                                                                                                                    OpenVidu High Availability is part of the PRO edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation (DNS Load Balancing): Set up OpenVidu High Availability on your own servers with a DNS Load Balancing mechanism.
                                                                                                                                                                                                    • On-premises Installation (Network Load Balancer): Set up OpenVidu High Availability on your own servers with a Network Load Balancer.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Elastic on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/","title":"OpenVidu High Availability Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    The deployment of OpenVidu High Availability on AWS is automated using AWS CloudFormation, with 4 EC2 Instances as Master Nodes and any number of Media Nodes managed within an Auto Scaling Group. The Auto Scaling Group of Media Nodes is configured to scale based on the target average CPU utilization.

                                                                                                                                                                                                    Internally, the AWS deployment mirrors the on-premises setup, allowing you to follow the same administration and configuration guidelines provided in the On Premises High Availability documentation. However, there are specific considerations unique to the AWS environment that are worth taking into account.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/#cluster-shutdown-and-startup","title":"Cluster Shutdown and Startup","text":"

                                                                                                                                                                                                    You can start and stop the OpenVidu High Availability cluster at any time. The following sections detail the procedures.

                                                                                                                                                                                                    Shutdown the ClusterStartup the Cluster

                                                                                                                                                                                                    To shut down the cluster, you need to stop the Media Nodes first and then stop the Master Nodes; this way, any ongoing session will not be interrupted.

                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG, and click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to 0, and click on \"Update\".
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that there are no instances in the Auto Scaling Group.

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      It may happen that some instances are still in the \"Terminating:Wait\" lifecycle state after setting the desired capacity to 0. This is because the Auto Scaling Group waits for the instances to finish processing any ongoing room, ingress, or egress operations before terminating them. This can take a few minutes. If you want to force the termination of the instances, you can manually terminate them from the EC2 Dashboard.

                                                                                                                                                                                                    7. Navigate to the EC2 Dashboard on AWS.

                                                                                                                                                                                                    8. Stop all the Master Nodes instances by selecting them and clicking on \"Stop instance\".
                                                                                                                                                                                                    9. Wait until the instances are stopped.

                                                                                                                                                                                                    To start the cluster, we recommend starting the Master Node first and then the Media Nodes.

                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. Start all the Master Nodes instances by selecting them and clicking on \"Start instance\".
                                                                                                                                                                                                    3. Wait until the instances are running.
                                                                                                                                                                                                    4. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    5. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    6. Locate the resource with the logical ID: OpenViduMasterNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Master Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". For the Master Nodes auto scaling group, the number of instances must be 4.
                                                                                                                                                                                                    9. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    10. Go back to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    11. Click on \"Actions > Edit\".
                                                                                                                                                                                                    12. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the desired number of Media Nodes, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    13. Wait until the \"Instance Management\" tab shows that there are the desired number of instances in the Auto Scaling Group.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    It is possible to change the instance type of both the Master Node and the Media Nodes. The following section details the procedures.

                                                                                                                                                                                                    Master NodesMedia Nodes

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This procedure requires downtime, as it involves stopping all the Master Nodes and starting them again with the new instance type.

                                                                                                                                                                                                    1. Navigate to the EC2 Dashboard on AWS.
                                                                                                                                                                                                    2. Stop all the Master Nodes instances by selecting them and clicking on \"Stop instance\".
                                                                                                                                                                                                    3. Wait until the instances are stopped.
                                                                                                                                                                                                    4. For each node you want to change the instance type, select it, and click on \"Instance settings > Change instance type\".
                                                                                                                                                                                                    5. Select the new instance type and click on \"Change\".
                                                                                                                                                                                                    6. Repeat the process for all the Master Nodes.
                                                                                                                                                                                                    1. Go to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. Locate the resource with the logical ID: OpenViduMediaNodeLaunchTemplate. Click on it to go to the Launch Template Dashboard with the Launch Template of the Media Nodes selected.
                                                                                                                                                                                                    4. Click on \"Actions > Modify template (Create new version)\".
                                                                                                                                                                                                    5. In the \"Instance type\" section, select the new instance type and click on \"Create template version\".
                                                                                                                                                                                                    6. Go to the CloudFormation Stack and locate the resource with the logical ID: OpenViduMediaNodeASG. Click on it to go to the Auto Scaling Group Dashboard with the Auto Scaling Group of the Media Nodes selected.
                                                                                                                                                                                                    7. Click on \"Actions > Edit\".
                                                                                                                                                                                                    8. In the Launch Template section, select the new version of the launch template we just created at step 5 which is the highest version number.

                                                                                                                                                                                                      Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      By configuring \"Latest\" as the launch template version, you no longer need to update the Auto Scaling Group every time you modify the launch template. The Auto Scaling Group will automatically use the latest version of the launch template.

                                                                                                                                                                                                    9. Terminate the old instances manually from the EC2 Dashboard if you want to force the termination of the instances. New instances will be launched with the new instance type.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      If you want to avoid downtime, you can wait until the Auto Scaling Group replaces the old instances with the new ones. But you will need to increase the desired capacity to force the replacement of the instances and then decrease it to the desired number of instances.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/#media-nodes-autoscaling-configuration","title":"Media Nodes Autoscaling Configuration","text":"

                                                                                                                                                                                                    To configure the Auto Scaling settings for the Media Nodes, follow the steps outlined below. This configuration allows you to set the parameters that control how the Auto Scaling Group will scale based on the target average CPU utilization.

                                                                                                                                                                                                    Media Nodes Autoscaling Configuration
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. To configure scaling policies, navigate to the \"Automatic scaling\" tab within the Auto Scaling Group Dashboard, select the unique \"Target tracking scaling\" autoscaling policy, and click on \"Actions > Edit\".
                                                                                                                                                                                                    6. It will open a panel where you can configure multiple parameters. In this example, we set the target average CPU utilization to 30%. Then, click on \"Update\".

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      OpenVidu High Availability is by default configured with a \"Target tracking scaling\" policy that scales based on the target average CPU utilization, however, you can configure different autoscaling policies according to your needs. For more information on the various types of autoscaling policies and how to implement them, refer to the AWS Auto Scaling documentation.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/#fixed-number-of-media-nodes","title":"Fixed Number of Media Nodes","text":"

                                                                                                                                                                                                    If you need to maintain a fixed number of Media Nodes instead of allowing the Auto Scaling Group to dynamically adjust based on CPU utilization, you can configure the desired capacity settings accordingly. Follow the steps below to set a fixed number of Media Nodes:

                                                                                                                                                                                                    Set Fixed Number of Media Nodes
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Resources\" tab, locate the resource with the logical ID: OpenViduMediaNodeASG and click on it to go to the Auto Scaling Group Dashboard.
                                                                                                                                                                                                    4. Click on \"Actions > Edit\".
                                                                                                                                                                                                    5. Set the \"Desired capacity\", \"Min desired capacity\", and \"Max desired capacity\" to the fixed number of Media Nodes you require, and click on \"Update\". In this example, we set the desired capacity to 2.
                                                                                                                                                                                                    6. Wait until the \"Instance Management\" tab shows that the Auto Scaling Group has the fixed number of instances running.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises High Availability Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu High Availability.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu High Availability Deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu High Availability deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" in the Master Node instance to apply the changes.

                                                                                                                                                                                                    The changes will be applied automatically in all the Nodes of the OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/","title":"OpenVidu High Availability Installation: AWS","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu High Availability deployment in AWS. Deployed services are the same as the On Premises High Availability Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu High Availability in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/latest/aws/cf-openvidu-ha.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/pro/ha/3.0.0/aws/cf-openvidu-ha.yaml\n

                                                                                                                                                                                                    This is how the architecture of the deployment looks like.

                                                                                                                                                                                                    Architecture overviewArchitecture overview with TURN over TLS

                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture

                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.

                                                                                                                                                                                                    OpenVidu High Availability AWS Architecture with TURN over TLS

                                                                                                                                                                                                    • The Load Balancer distributes HTTPS traffic to the Master Nodes.
                                                                                                                                                                                                    • If RTMP media is ingested, the Load Balancer also routes this traffic to the Media Nodes.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.
                                                                                                                                                                                                    • An additional Load Balancer is created to route TURN over TLS traffic to the TURN server running on the Media Nodes. It is used to allow users behind restrictive firewalls to connect to the Media Nodes.
                                                                                                                                                                                                    • 4 fixed EC2 Instances are created for the Master Nodes. It must always be 4 Master Nodes to ensure high availability.
                                                                                                                                                                                                    • An autoscaling group of Media Nodes is created to scale the number of Media Nodes based on the system load.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#domain-and-load-balancer-configuration","title":"Domain and Load Balancer configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the domain name and the SSL certificate to use from AWS Certificate Manager.

                                                                                                                                                                                                    Domain and Load Balancer configuration

                                                                                                                                                                                                    The parameters in this section might look like this:

                                                                                                                                                                                                    Set the DomainName parameter to the domain name you intend to use for your OpenVidu deployment. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    For the OpenViduCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in DomainName.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#openvidu-ha-configuration","title":"OpenVidu HA Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify some properties needed for the OpenVidu HA deployment.

                                                                                                                                                                                                    OpenVidu Elastic Configuration

                                                                                                                                                                                                    The parameters in this section might appear as follows:

                                                                                                                                                                                                    Make sure to provide the OpenViduLicense parameter with the license key. If you don't have one, you can request one here.

                                                                                                                                                                                                    For the RTCEngine parameter, you can choose between Pion (the engine used by LiveKit) and Mediasoup (experimental).

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instances that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at MasterNodeInstanceType and MediaNodeInstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest Amazon Linux AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#media-nodes-autoscaling-group-configuration","title":"Media Nodes Autoscaling Group Configuration","text":"

                                                                                                                                                                                                    The number of Media Nodes can scale up or down based on the system load. You can configure the minimum and maximum number of Media Nodes and a target CPU utilization to trigger the scaling up or down.

                                                                                                                                                                                                    Media Nodes Autoscaling Group Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The InitialNumberOfMediaNodes parameter specifies the initial number of Media Nodes to deploy. The MinNumberOfMediaNodes and MaxNumberOfMediaNodes parameters specify the minimum and maximum number of Media Nodes that you want to be deployed.

                                                                                                                                                                                                    The ScaleTargetCPU parameter specifies the target CPU utilization to trigger the scaling up or down. The goal is to keep the CPU utilization of the Media Nodes close to this value. The autoscaling policy is based on Target Tracking Scaling Policy.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#vpc-configuration","title":"VPC Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the VPC and Subnet configuration for the deployment.

                                                                                                                                                                                                    VPC Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The OpenViduVPC parameter specifies the VPC where the deployment will be created.

                                                                                                                                                                                                    The OpenViduMasterNodeSubnets specifies the subnets where the Master Nodes will be deployed. You can specify a maximum of 4 subnets.

                                                                                                                                                                                                    The OpenViduMediaNodeSubnets specifies the subnets where the Media Nodes will be deployed. There is no limit on the number of subnets you can specify.

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    • It is recommended to deploy in a region with at least 4 availability zones and deploy the Master Nodes in 4 subnets, one in each availability zone. This is to ensure high availability.
                                                                                                                                                                                                    • You must use public subnets for the Master Nodes and Media Nodes and have enabled the auto-assign public IP option.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. Ensure this domain is not currently pointing to any other service; you can temporarily point it elsewhere.

                                                                                                                                                                                                    For the TurnCertificateARN parameter, specify the ARN of the SSL certificate you wish to use. This certificate should be created in the AWS Certificate Manager and configured for the domain specified in TurnDomainName.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#volumes-configuration","title":"Volumes Configuration","text":"

                                                                                                                                                                                                    In this section, you need to specify the configuration for the EBS volumes that will be created for the Master Nodes. Master Nodes will host all the recordings and metrics data replicated across all of them. The disk size of the EBS volumes is the same for all Master Nodes.

                                                                                                                                                                                                    Volumes Configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    The RetainVolumes parameter specifies whether the EBS volumes should be retained when the stack is deleted. If you set this parameter to true, the EBS volumes will not be deleted when the stack is deleted. This is useful if you want to keep the recordings and metrics data after deleting the stack. If you set this parameter to false, the EBS volumes will be deleted when the stack is deleted. In any case, it is recommended to create a snapshot backup policy.

                                                                                                                                                                                                    The DiskSize parameter specifies the size of the EBS volumes in GB.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services in all the Master Nodes and Media Nodes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu High Availability deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/","title":"OpenVidu High Availability Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu High Availability.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu High Availability on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu High Availability deployments.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    To start, stop, or restart any Node in your OpenVidu High Availability deployment, you can use the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    Depending on the node type, you will see different services running.

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME                       IMAGE                                              COMMAND                  SERVICE                    CREATED          STATUS\napp                        docker.io/openvidu/openvidu-call                   \"docker-entrypoint.s\u2026\"   app                        12 seconds ago   Up 10 seconds\ncaddy                      docker.io/openvidu/openvidu-pro-caddy              \"/bin/caddy run --co\u2026\"   caddy                      12 seconds ago   Up 10 seconds\ndashboard                  docker.io/openvidu/openvidu-pro-dashboard          \"./openvidu-dashboard\"   dashboard                  12 seconds ago   Up 10 seconds\ngrafana                    docker.io/grafana/grafana                          \"/run.sh\"                grafana                    11 seconds ago   Up 8 seconds\nloki                       docker.io/grafana/loki                             \"/usr/bin/loki -conf\u2026\"   loki                       11 seconds ago   Up 9 seconds\nmimir                      docker.io/grafana/mimir                            \"/bin/mimir -config.\u2026\"   mimir                      11 seconds ago   Up 9 seconds\nminio                      docker.io/bitnami/minio                            \"/opt/bitnami/script\u2026\"   minio                      11 seconds ago   Up 9 seconds\nmongo                      docker.io/mongo                                    \"docker-entrypoint.s\u2026\"   mongo                      11 seconds ago   Up 9 seconds\nopenvidu-v2compatibility   docker.io/openvidu/openvidu-v2compatibility        \"/bin/server\"            openvidu-v2compatibility   12 seconds ago   Up 10 seconds\noperator                   docker.io/openvidu/openvidu-operator               \"/bin/operator\"          operator                   12 seconds ago   Up 10 seconds\npromtail                   docker.io/grafana/promtail                         \"/usr/bin/promtail -\u2026\"   promtail                   11 seconds ago   Up 9 seconds\nredis-sentinel             docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis-sentinel             10 seconds ago   Up 10 seconds\nredis-server               docker.io/redis                                    \"docker-entrypoint.s\u2026\"   redis-server               10 seconds ago   Up 10 seconds\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                          COMMAND                  SERVICE      CREATED          STATUS\ncaddy        docker.io/openvidu/openvidu-caddy:main         \"/bin/caddy run --co\u2026\"   caddy        53 seconds ago   Up 53 seconds\negress       docker.io/livekit/egress                       \"/entrypoint.sh\"         egress       53 seconds ago   Up 51 seconds\ningress      docker.io/livekit/ingress                      \"ingress\"                ingress      53 seconds ago   Up 52 seconds\nopenvidu     docker.io/openvidu/openvidu-server-pro         \"/livekit-server --c\u2026\"   openvidu     53 seconds ago   Up 52 seconds\nprometheus   docker.io/prom/prometheus                      \"/bin/prometheus --c\u2026\"   prometheus   53 seconds ago   Up 51 seconds\npromtail     docker.io/grafana/promtail                     \"/usr/bin/promtail -\u2026\"   promtail     53 seconds ago   Up 52 seconds\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on:

                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Nodes Logs\": To check the logs of the OpenVidu services organized per node.
                                                                                                                                                                                                    • \"OpenVidu > OpenVidu Cluster Services Logs\": To check the logs of the OpenVidu services organized per service.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#adding-media-nodes","title":"Adding Media Nodes","text":"

                                                                                                                                                                                                    To add a new Media Node, simply spin up a new VM and run the OpenVidu installer script to integrate it into the existing cluster. Run the installation command on the new Media Node.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#removing-media-nodes-gracefully","title":"Removing Media Nodes Gracefully","text":"

                                                                                                                                                                                                    To stop a Media Node gracefully, you need to stop the containers openvidu, ingress, and egress with a SIGINT signal. Here is a simple script that you can use to stop all these containers gracefully:

                                                                                                                                                                                                    #!/bin/bash\n# Stop OpenVidu, Ingress, and Egress containers gracefully (1)\ndocker container kill --signal=SIGINT openvidu || true\ndocker container kill --signal=SIGINT ingress || true\ndocker container kill --signal=SIGINT egress || true\n\n# Wait for the containers to stop (2)\nwhile [ $(docker inspect -f '{{.State.Running}}' openvidu 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' ingress 2>/dev/null) == \"true\" ] || \\\n    [ $(docker inspect -f '{{.State.Running}}' egress 2>/dev/null) == \"true\" ]; do\n    echo \"Waiting for containers to stop...\"\n    sleep 5\ndone\n
                                                                                                                                                                                                    1. This script stops the OpenVidu, Ingress, and Egress containers gracefully. The true at the end of each command is to avoid the script from stopping if the container is not running.
                                                                                                                                                                                                    2. This script waits for the containers to stop before exiting.

                                                                                                                                                                                                    When all the containers are stopped, you can then stop the systemd service and remove the VM:

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#removing-media-nodes-forcefully","title":"Removing Media Nodes Forcefully","text":"

                                                                                                                                                                                                    To remove a Media Node forcefully, without considering the rooms, ingress, and egress processes running in the node, you can simply stop the OpenVidu service in the Media Node and delete the VM.

                                                                                                                                                                                                    sudo systemctl stop openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall any OpenVidu Node, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/","title":"OpenVidu High Availability Installation: On-premises with DNS Load Balancing","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing DNS for load balancing traffic. DNS allows multiple records, even of the same kind, to be registered, enabling the listing of multiple hosts under the same domain name. Such a mechanism allows for the distribution of traffic among the Master Nodes, offering an alternative to Network Load Balancers.

                                                                                                                                                                                                    Advantages of DNS Load Balancing:

                                                                                                                                                                                                    • Simplicity: Easier to configure compared to Network Load Balancing.
                                                                                                                                                                                                    • Cost: More cost-effective than Network Load Balancing.

                                                                                                                                                                                                    Disadvantages of DNS Load Balancing:

                                                                                                                                                                                                    • Health Checks: Less reliable for health checks compared to Network Load Balancing.
                                                                                                                                                                                                    • Caching Issues: IP addresses of the Master Nodes can be cached, causing issues if the server's IP changes.
                                                                                                                                                                                                    • DNS Round Robin: Some clients may not adhere to DNS Round Robin, potentially leading to uneven traffic distribution.
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu High Availability Architecture with DNS Load Balancing

                                                                                                                                                                                                    • The Master Nodes act as Load Balancers, managing the traffic and distributing it among the other Master Nodes and Media Nodes.
                                                                                                                                                                                                    • Each Master Node has its own Caddy server acting as a Layer 4 (for TURN with TLS and RTMPS) and Layer 7 (For OpenVidu Dashboard, OpenVidu Call, etc., APIs) reverse proxy.
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                    • All machines must have their own public IP.
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to all the public IPs of the Master Nodes. Simply create 4 A records in your DNS provider pointing to the public IPs of the Master Nodes using the same domain name.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#port-rules-master-nodes","title":"Port rules (Master Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 1935 0.0.0.0/0, ::/0 (Optional) For ingesting RTMP streams using Ingress service. TCP 9000 0.0.0.0/0, ::/0 (Optional) To expose MinIO publicly. TCP 3000 Master Nodes (Optional) For load balancing requests to Grafana (Observability module). TCP 5000 Master Nodes For load balancing requests to OpenVidu Dashboard. TCP 9101 Master Nodes For load balancing requests to MinIO Console. TCP 7946-7947 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 9095-9096 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 3100 Media Nodes (Optional) For Loki (Observability module). TCP 9009 Media Nodes (Optional) For Mimir (Observability module). TCP 4443 Master Nodes, Media Nodes (Optional) For OpenVidu V2 compatibility service. TCP 6080 Master Nodes, Media Nodes (Optional) For OpenVidu Call (Default Application). TCP 7000-7001 Master Nodes, Media Nodes For internal Redis communication TCP 9100 Master Nodes, Media Nodes For internal MinIO communication TCP 20000 Master Nodes, Media Nodes For internal Mongo communication

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Master Nodes (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Master Nodes (Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Nodes LiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Nodes (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service."},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=ha\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select No. It means that you are going to use DNS Load Balancing.
                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked for later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check them and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89\ud83c\udf89 OpenVidu HA 'Master Node' Installation Finished Successfully! \ud83c\udf89\ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu HA 'Media Node' Installation Finished Successfully! \ud83c\udf89         <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node on each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    The Master Node can be configured with multiple kinds of certificates. Here are the examples for each type of certificate:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='selfsigned'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. Define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-dlb/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/","title":"OpenVidu High Availability Installation: On-premises with Network Load Balancer","text":"

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    OpenVidu High Availability is part of OpenVidu PRO. Before deploying, you need to create an OpenVidu account to get your license key. There's a 15-day free trial waiting for you!

                                                                                                                                                                                                    This section provides instructions for deploying a production-ready OpenVidu High Availability setup on-premises, utilizing a Network Load Balancer in front of the cluster. Network Load Balancing is a method of distributing incoming network traffic across multiple servers. It is a highly available, scalable, and fault-tolerant solution that ensures your OpenVidu deployment is always up and running. Compared to DNS Load Balancing, Network Load Balancing is more reliable for health checks and ensures that traffic is evenly distributed across all nodes.

                                                                                                                                                                                                    Advantages of Network Load Balancing:

                                                                                                                                                                                                    • More control over the load balancing process.
                                                                                                                                                                                                    • Possibility to use custom health checks to determine the status of the nodes.

                                                                                                                                                                                                    Disadvantages of Network Load Balancing:

                                                                                                                                                                                                    • More complex to set up than DNS Load Balancing.
                                                                                                                                                                                                    • Requires a Load Balancer to be deployed in front of the cluster.
                                                                                                                                                                                                    • More expensive than DNS Load Balancing.
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks:

                                                                                                                                                                                                    OpenVidu High Availability Architecture with Network Load Balancer

                                                                                                                                                                                                    • The Load Balancer must be a Network Load Balancer that supports TCP and UDP traffic.
                                                                                                                                                                                                    • The Load Balancer distributes traffic across all Master Nodes.
                                                                                                                                                                                                    • If RTMP or TURN with TLS is enabled, the Load Balancer must also distribute traffic across all Media Nodes. (You can use a different Load Balancer for this purpose)
                                                                                                                                                                                                    • WebRTC traffic (SRTP/SCTP/STUN/TURN) is routed directly to the Media Nodes.

                                                                                                                                                                                                    For the Master Node, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server PRO and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as an internal reverse proxy for all services.
                                                                                                                                                                                                    • OpenVidu V2 Compatibility (v2compatibility module) is an optional service that provides an API designed to maintain compatibility for applications developed with OpenVidu version 2.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.

                                                                                                                                                                                                    For the Media Nodes, the following services are configured:

                                                                                                                                                                                                    • OpenVidu Server PRO (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • Prometheus, Promtail, and Loki (Observability module). Used to send metrics and logs to the observability stack.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#prerequisites","title":"Prerequisites","text":"
                                                                                                                                                                                                    • At least 6 machines:
                                                                                                                                                                                                      • 4 machines for the Master Nodes.
                                                                                                                                                                                                      • 2 machines for the Media Nodes.
                                                                                                                                                                                                    • Each machine must have:
                                                                                                                                                                                                      • A minimum of 4GB RAM and 4 CPU cores.
                                                                                                                                                                                                      • Linux installed (Ubuntu is recommended).
                                                                                                                                                                                                    • Significant disk space in all the Master Nodes, with 100GB recommended, especially if you plan to record your sessions (Egress). Media Nodes require less space; however, account for the space needed for ongoing recordings on these nodes.
                                                                                                                                                                                                    • Media Nodes must have a public IP. This is required because Media traffic is sent directly to these nodes. Master Nodes can have private IPs and will be accessed through the Load Balancer.
                                                                                                                                                                                                    • A Load Balancer that supports TCP and UDP traffic. You can use a hardware load balancer or a software load balancer like HAProxy, Nginx, or AWS Network Load Balancer.
                                                                                                                                                                                                    • A Fully Qualified Domain Name (FQDN) pointing to the Load Balancer. This domain name will be used to access the OpenVidu services.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#port-rules-master-nodes","title":"Port rules (Master Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Master Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 7880 Load Balancer Allows access to the following to the Load Balancer:
                                                                                                                                                                                                    • Livekit API.
                                                                                                                                                                                                    • OpenVidu v2 Compatibility API
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    TCP 7946-7947 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 9095-9096 Master Nodes (Optional) For Mimir and Loki cluster communication (Observability module). TCP 3100 Media Nodes (Optional) For Loki (Observability module). TCP 9009 Media Nodes (Optional) For Mimir (Observability module). TCP 4443 Media Nodes (Optional) For OpenVidu V2 compatibility service. TCP 6080 Media Nodes (Optional) For OpenVidu Call (Default Application). TCP 7000-7001 Master Nodes, Media Nodes For internal Redis communication TCP 9100 Master Nodes, Media Nodes For internal Minio communication TCP 20000 Master Nodes, Media Nodes For internal Mongo communication

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#port-rules-media-nodes","title":"Port rules (Media Nodes)","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your Media Nodes:

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description UDP 443 0.0.0.0/0, ::/0 STUN/TURN over UDP. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional). Only needed if you want to ingest WebRTC using WHIP. UDP 50000-60000 0.0.0.0/0, ::/0 WebRTC Media traffic. TCP 1935 Load Balancer (Optional). Only needed if you want to ingest RTMP streams using Ingress service. Master Nodes need access to this port to reach Ingress RTMP service and expose it using TLS (RTMPS). TCP 5349 Load Balancer (Optional). Only needed if you want to expose TURN service with TLS. Master Nodes need access to this port to reach TURN service and expose it using TLS (TURNS). TCP 7880 Master Nodes LiveKit API. Master Nodes need access to load balance LiveKit API and expose it through HTTPS. TCP 8080 Master Nodes (Optional). Only needed if you want to ingest WebRTC streams using WHIP. Master Nodes need access to this port to reach WHIP HTTP service."},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that all your machines meet the prerequisites and the port rules for the Master Nodes and Media Nodes are correctly configured.

                                                                                                                                                                                                    To install OpenVidu High Availability, begin by generating the commands required for setting up all nodes in the cluster. This is a simple and straightforward process; simply run the following command on any machine that has Docker installed:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=ha\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Write all 'Master Node' Private IPs separated by commas: Write the private IP of each Master Node separated by commas.
                                                                                                                                                                                                    • Write your OpenVidu PRO License: Write your OpenVidu PRO License.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you don't have a license key for OpenVidu PRO, you can get a 15-day free trial license key by creating an OpenVidu account.

                                                                                                                                                                                                    • Do you want to use an external load balancer?: Select Yes. We will use a Network Load Balancer in front of the cluster.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) TURN domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the Load Balancer you will use and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Select which RTC engine to use: Select the WebRTC engine you want to use. You can choose between Pion (The engine used by Livekit) or Mediasoup (Experimental).

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:

                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • OpenVidu V2 Compatibility: Compatibility API for applications developed with OpenVidu v2.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    This command will output the following instructions, which you should follow:

                                                                                                                                                                                                    1. Firewall Configuration for 'Master Nodes': These rules are the same as the ones specified in the instructions. Depending on the modules you have selected, some rules defined at Port rules (Master Nodes) may not appear (Optional ports). Double-check and modify them if you see something that can be enabled/disabled in your current port rules.
                                                                                                                                                                                                    2. Installation Commands for 'Master Nodes': This is the command needed to install your Master Node. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='master-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on all your Master Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89\ud83c\udf89 OpenVidu HA 'Master Node' Installation Finished Successfully! \ud83c\udf89\ud83c\udf89    <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Master Node will be installed in /opt/openvidu and configured as a systemd service. To start the service, use the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                      Your Master Nodes will be ready once all of them have been started.

                                                                                                                                                                                                    3. Firewall Configuration for 'Media Nodes': These rules are the same as the ones defined previously as with Master Nodes. Double-check the Port rules (Media Nodes) and modify them if you see something that can be enabled/disabled in your current port rules.

                                                                                                                                                                                                    4. Installation Commands for 'Media Nodes': This is the command needed to install your Media Nodes. It should look like this:

                                                                                                                                                                                                      sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --deployment-type='ha' \\\n    --node-role='media-node' \\\n...\n

                                                                                                                                                                                                      Note

                                                                                                                                                                                                      In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                      Execute that command on your Media Nodes to install them. When the installation process finishes, you will see the following output:

                                                                                                                                                                                                      > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu HA 'Media Node' Installation Finished Successfully! \ud83c\udf89         <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                      The Media Node in each machine will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                      systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana

                                                                                                                                                                                                    OpenVidu Server PRO URL (LiveKit compatible) will be available also in:

                                                                                                                                                                                                    • OpenVidu Server PRO: https://openvidu.example.io/
                                                                                                                                                                                                    • LiveKit API: https://openvidu.example.io/ and wss://openvidu.example.io/
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#load-balancer-configuration","title":"Load Balancer Configuration","text":"

                                                                                                                                                                                                    To configure the Load Balancer, you must create a new TCP listener for each port that the Master Nodes use. The Load Balancer should be set up to distribute traffic evenly across all Master Nodes, targeting their private IP addresses. Additionally, optional features like RTMP and TURN with TLS should be directed to use the private IP addresses of the Media Nodes. This ensures that traffic for these services is properly routed to the Media Nodes.

                                                                                                                                                                                                    Below is an example using NGINX as a Load Balancer:

                                                                                                                                                                                                    NGINX Load Balancer ConfigurationNGINX Load Balancer Configuration (With TLS for TURN)

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    events {\n    worker_connections 10240;\n}\n\nstream {\n\n    upstream openvidu_master_nodes {\n        server <MASTER_NODE_IP_1>:7880;\n        server <MASTER_NODE_IP_2>:7880;\n        server <MASTER_NODE_IP_3>:7880;\n        server <MASTER_NODE_IP_4>:7880;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    upstream openvidu_media_nodes_rtmp {\n        server <MEDIA_NODE_IP_1>:1935;\n        server <MEDIA_NODE_IP_2>:1935;\n        # Add more media nodes if needed\n    }\n\n    server {\n        listen 443 ssl;\n        server_name openvidu.example.com;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;\n        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_master_nodes;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    server {\n        listen 1935 ssl;\n        server_name openvidu.example.com;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     /etc/nginx/ssl/openvidu-cert.pem;\n        ssl_certificate_key /etc/nginx/ssl/openvidu-key.pem;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_media_nodes_rtmp;\n    }\n\n}\n
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and you should configure it in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem and openvidu-key.pem must be valid SSL certificates for your domain.
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.

                                                                                                                                                                                                    Example configuration for NGINX Load Balancer:

                                                                                                                                                                                                    events {\n    worker_connections 10240;\n}\n\nstream {\n\n    upstream openvidu_master_nodes {\n        server <MASTER_NODE_IP_1>:7880;\n        server <MASTER_NODE_IP_2>:7880;\n        server <MASTER_NODE_IP_3>:7880;\n        server <MASTER_NODE_IP_4>:7880;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    upstream openvidu_media_nodes_rtmp {\n        server <MEDIA_NODE_IP_1>:1935;\n        server <MEDIA_NODE_IP_2>:1935;\n        # Add more media nodes if needed\n    }\n\n    upstream turn_tls {\n        server <MEDIA_NODE_IP_1>:5349;\n        server <MEDIA_NODE_IP_2>:5349;\n        # Add more media nodes if needed\n    }\n\n    map $ssl_server_name $targetBackend {\n        openvidu.example.com openvidu_master_nodes;\n        turn.example.com turn_tls;\n    }\n\n    map $ssl_server_name $targetCert {\n        openvidu.example.com /etc/nginx/ssl/openvidu-cert.pem;\n        turn.example.com /etc/nginx/ssl/turn-cert.pem;\n    }\n\n    map $ssl_server_name $targetCertKey {\n        openvidu.example.com /etc/nginx/ssl/openvidu-key.pem;\n        turn.example.com /etc/nginx/ssl/turn-key.pem;\n    }\n\n    server {\n        listen 443 ssl;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     $targetCert;\n        ssl_certificate_key $targetCertKey;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass $targetBackend;\n    }\n\n    # Optional: Only if you want to ingest RTMP\n    server {\n        listen 1935 ssl;\n        ssl_protocols       TLSv1.2 TLSv1.3;\n        ssl_certificate     $targetCert;\n        ssl_certificate_key $targetCertKey;\n\n        proxy_connect_timeout 10s;\n        proxy_timeout 30s;\n\n        proxy_pass openvidu_media_nodes_rtmp;\n    }\n\n}\n
                                                                                                                                                                                                    • Notice that openvidu.example.com is the domain name you have chosen for your OpenVidu deployment and turn.example.com is the domain name you have chosen for your TURN with TLS. Both domains should be configured in your DNS to point to the Load Balancer. Also, the openvidu-cert.pem, openvidu-key.pem, turn-cert.pem, and turn-key.pem must be valid SSL certificates for your domains.
                                                                                                                                                                                                    • Replace <MASTER_NODE_IP_X> with the private IP addresses of your Master Nodes and <MEDIA_NODE_IP_X> with the private IP addresses of your Media Nodes.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env of any Master Node. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • Applications developed with LiveKit SDK:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                      • API Key: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_KEY
                                                                                                                                                                                                      • API Secret: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    • Applications developed with OpenVidu v2:

                                                                                                                                                                                                      • URL: The value in /opt/openvidu/config/cluster/openvidu.env of DOMAIN_OR_PUBLIC_IP as a URL. For example, https://openvidu.example.io/
                                                                                                                                                                                                      • Username: OPENVIDUAPP
                                                                                                                                                                                                      • Password: The value in /opt/openvidu/config/cluster/openvidu.env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    To automate the installation process, you just need to execute the specified command in the Guided Installation section and execute the generated commands.

                                                                                                                                                                                                    Each installation command for each type of node looks like this:

                                                                                                                                                                                                    Master NodeMedia Node

                                                                                                                                                                                                    To install a Master Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_master_node.sh) \\\n    --no-tty --install \\\n    --node-role='master-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --openvidu-pro-license='xxxxx' \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --rtc-engine='pion' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --mongo-replica-set-key='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --external-load-balancer\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Notes:

                                                                                                                                                                                                    • --openvidu-pro-license is mandatory. You can get a 15-day free trial license key by creating an OpenVidu account.
                                                                                                                                                                                                    • Depending on the RTC engine, the argument --rtc-engine can be pion or mediasoup.
                                                                                                                                                                                                    • --master-node-private-ip-list is the list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.

                                                                                                                                                                                                    To install a Media Node, you can use the following command:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/pro/ha/latest/install_ov_media_node.sh) \\\n    --no-tty --install \\\n    --node-role='media-node' \\\n    --master-node-private-ip-list='10.5.0.1,10.5.0.2,10.5.0.3,10.5.0.4' \\\n    --enabled-modules='observability,v2compatibility,app' \\\n    --redis-password='xxxxx'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • --master-node-private-ip must be the same list of private IPs of all Master Nodes separated by commas. It should not change, and Media Nodes should be able to reach all Master Nodes using these IPs.
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media. If you decide to install the Media Node with --public-ip, you must reinstall the Master Node with --force-media-node-public-ip.

                                                                                                                                                                                                    You can run these commands in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some general notes about all commands:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack), app (Default App - OpenVidu Call), and v2compatibility (OpenVidu v2 compatibility API).

                                                                                                                                                                                                    To start each node, remember to execute the following command in each node:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/ha/on-premises/install-nlb/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu High Availability deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/","title":"How To Guides","text":"

                                                                                                                                                                                                    OpenVidu deployments are installed with sane defaults, but you may want to customize your deployment to suit your needs. This section contains guides on how to configure OpenVidu for specific use cases, so you can get the most out of your deployment.

                                                                                                                                                                                                    • How to configure an external S3 bucket for recordings instead of the default MinIO
                                                                                                                                                                                                    • Force all traffic including WebRTC to go through 443 with TLS
                                                                                                                                                                                                    • Enable webhooks
                                                                                                                                                                                                    • Enable and Disable modules
                                                                                                                                                                                                    • Create and configurate AWS certificate for HA deployment
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/","title":"Create AWS certificate for OpenVidu HA deployment","text":"

                                                                                                                                                                                                    You will need this certificate to be able to deploy the High Availability deployment. This guide is meant to show you how to do it.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/#prerequisites","title":"Prerequisites","text":"

                                                                                                                                                                                                    Is important to notice that in your AWS you will need to have access to the Certificate Manager. As well as having access to a domain provider. You will need to have one domain to be able to create and vinculate the certificate.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/create-configure-AWS-certificate/#creation","title":"Creation","text":"AWS Certificate creation

                                                                                                                                                                                                    Those are the steps you need to follow to create the AWS certificate, keep in mind that you need a domain.

                                                                                                                                                                                                    First go to AWS Certificate Manager and request a new public certificate. The following parameter is the most important. Domain configuration

                                                                                                                                                                                                    You need to replace yourdesiredname for whatever name you want and yourdomain for the name of the domain that you own.

                                                                                                                                                                                                    Next leave the rest of the parameters as they are and click request.

                                                                                                                                                                                                    The next page will prompt out the certificate status, here you will need to create a record in your domain provider to validate the status, first you will have status pending.

                                                                                                                                                                                                    Create record in your domain providerCreate record in Route 53

                                                                                                                                                                                                    Here you will need to create a new CNAME record in the domain you own by using as subdomain the CNAME name until the domain name and the CNAME value as the value of that record.

                                                                                                                                                                                                    In AWS Certificate Manager you can check the CNAME name and value clicking into the certificate you want.

                                                                                                                                                                                                    Create record in Route 53

                                                                                                                                                                                                    You need to click the button called Create records in Route 53. This will lead you to the next image where you just click Create records and that's it.

                                                                                                                                                                                                    Create record for certificate

                                                                                                                                                                                                    Please verify that you have a new entry in the records table of the specified Hosted Zone in Route 53 with the CNAME of the certificate you just created.

                                                                                                                                                                                                    Try to refresh until you reach the Issued status in green.

                                                                                                                                                                                                    Finally when deploying the HA stack in CloudFormation follow these steps

                                                                                                                                                                                                    Configuration of Load Balancer

                                                                                                                                                                                                    Load balancer configuration

                                                                                                                                                                                                    Those are parameters related to the certificate you just created.

                                                                                                                                                                                                    You have to fill field DomainName with the domain name that appears in the certificate that you created, the one that matches yourdesiredname.yourdomain mentioned earlier.

                                                                                                                                                                                                    Next for the OpenViduCertificateARN, you can find it at the top of the same page I mentioned earlier, it is called ARN, as you can see in the image below.

                                                                                                                                                                                                    Domain name and ARN location

                                                                                                                                                                                                    When everything is up and running you will need to create a new record in the Hosted Zone referring to the Load Balancer resource created in the stack.

                                                                                                                                                                                                    Vinculating Load Balancer

                                                                                                                                                                                                    Create Load Balancer record

                                                                                                                                                                                                    Note that Alias is checked.

                                                                                                                                                                                                    In subdomain you just have to put the same as you put in yourdesiredname creating the AWS certificate. In Choose endpoint you just have to select Alias to Network Load Balancer, and in Choose Region select your region where the stack is deployed. After selecting the endpoint and region a new field will appear, select there the load balancer that belongs to the stack you have deployed.

                                                                                                                                                                                                    For the other fields, leave them as they are.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-disable-modules/","title":"Enable and disable modules","text":"

                                                                                                                                                                                                    OpenVidu allows you to enable or disable modules to customize your deployment. These modules are:

                                                                                                                                                                                                    • app: The OpenVidu Default App (OpenVidu Call)
                                                                                                                                                                                                    • observability: Grafana, Loki, Mimir, and Promtail observability services.
                                                                                                                                                                                                    • v2compatibility: OpenVidu V2 Compatibility. (Only available in OpenVidu Pro)

                                                                                                                                                                                                    These modules are configured in the parameter COMPOSE_PROFILES at:

                                                                                                                                                                                                    • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                    • Elastic / High Availability:
                                                                                                                                                                                                      • Master Node: /opt/openvidu/config/cluster/node/master_node.env
                                                                                                                                                                                                      • Media Node: /opt/openvidu/config/cluster/node/media_node.env

                                                                                                                                                                                                    This parameter is one of the parameters that is not replicated per node in the cluster. To enable or disable a module, you need to modify the parameter in all the nodes where you want to apply the changes.

                                                                                                                                                                                                    For example, to enable only v2compatibility and app, the parameter should look like this:

                                                                                                                                                                                                    COMPOSE_PROFILES=app,v2compatibility\n

                                                                                                                                                                                                    After modifying the parameter, you need to restart the node to apply the changes:

                                                                                                                                                                                                    systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/","title":"Enable Webhooks","text":"

                                                                                                                                                                                                    If you need to integrate OpenVidu with other services, you can use webhooks to send notifications about events that occur in your OpenVidu deployment. This guide explains how to enable webhooks.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/#openvidu-server-configuration","title":"OpenVidu Server Configuration","text":"
                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add to the file livekit.yaml the following configuration:

                                                                                                                                                                                                      webhook:\n    api_key: ${openvidu.LIVEKIT_API_KEY:?mandatory}\n    urls:\n    ...\n        - https://<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                      The file is located at:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/livekit.yaml
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/livekit.yaml

                                                                                                                                                                                                      Make sure the webhook section exists in the file, and if it doesn't, add it as stated in the previous snippet. Then, add the URL where you want to receive the webhook notifications. In this example, <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                    3. Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/#pro-v2-compatibility-configuration","title":"PRO V2 Compatibility Configuration","text":"

                                                                                                                                                                                                    If you are using the V2 Compatibility module, you can also enable webhooks for the V2 Compatibility layer.

                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add to the file v2compatibility.env the following parameters:

                                                                                                                                                                                                      V2COMPAT_OPENVIDU_WEBHOOK=true\nV2COMPAT_OPENVIDU_WEBHOOK_ENDPOINT=https://<YOUR_WEBHOOK_URL>\n

                                                                                                                                                                                                      Where <YOUR_WEBHOOK_URL> is the URL where you want to receive the notifications.

                                                                                                                                                                                                      Check in the Configuration Reference all the webhook events that you can receive setting up the parameter V2COMPAT_OPENVIDU_WEBHOOK_EVENTS.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/enable-webhooks/#send-webhooks-to-a-local-application-server","title":"Send Webhooks to a Local Application Server","text":"

                                                                                                                                                                                                    When developing locally pointing to a production deployment and webhooks events are required by your application, you will face issues because OpenVidu cannot access your local application server.

                                                                                                                                                                                                    To receive webhooks from OpenVidu on your local machine, you need to expose your local application server to the internet. This exposure allows OpenVidu to send webhooks directly to your application server.

                                                                                                                                                                                                    The following images illustrate the difference between an unreachable and a reachable local application server:

                                                                                                                                                                                                    Unreachable local application server

                                                                                                                                                                                                    Reachable local application server

                                                                                                                                                                                                    Exposing your local application server to the internet is a common practice when developing applications locally. Tools like Ngrok, LocalTunnel, LocalXpose and Zrok can help you achieve this.

                                                                                                                                                                                                    These tools provide you with a public URL that forwards requests to your local application server. You can use this URL to receive webhooks from OpenVidu, configuring it in the OpenVidu Server as explained in the previous section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/","title":"Configuring external S3 for OpenVidu recordings","text":"

                                                                                                                                                                                                    By default, OpenVidu uses MinIO for storing recordings. You can configure it to use an external S3 bucket instead. This guide uses AWS S3, but can be adapted for other S3-compatible services.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/#global-configuration-with-openviduenv","title":"Global Configuration with openvidu.env","text":"

                                                                                                                                                                                                    The openvidu.env file defines global parameters used in service configurations. So we can use it to define our S3 configuration details and afterwards use them in the services that need them.

                                                                                                                                                                                                    1. SSH into one of your Master Nodes (or Single Node).
                                                                                                                                                                                                    2. Add these variables to openvidu.env:

                                                                                                                                                                                                      RECORDINGS_S3_BUCKET=openvidu-recordings\nRECORDINGS_S3_ENDPOINT=https://s3.us-east-2.amazonaws.com\nRECORDINGS_AWS_ACCESS_KEY=<YOUR_AWS_ACCESS_KEY>\nRECORDINGS_AWS_SECRET_KEY=<YOUR_AWS_ACCESS_SECRET>\nRECORDINGS_AWS_REGION=us-east-2\nRECORDINGS_S3_FORCE_PATH_STYLE=false\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/openvidu.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/openvidu.env

                                                                                                                                                                                                      Warning

                                                                                                                                                                                                      In AWS it is necessary to specify the region in the endpoint URL as you can see in RECORDINGS_S3_ENDPOINT. Check the AWS S3 endpoints documentation for more information.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The parameters defined at openvidu.env can be used in other configuration files by using the ${openvidu.VARIABLE_NAME} syntax. If you want to know more about the configuration system of OpenVidu, check the Configuration In-depth section.

                                                                                                                                                                                                    3. Update egress.yaml to use these variables:

                                                                                                                                                                                                      s3:\n    access_key: ${openvidu.RECORDINGS_AWS_ACCESS_KEY}\n    secret: ${openvidu.RECORDINGS_AWS_SECRET_KEY}\n    region: ${openvidu.RECORDINGS_AWS_REGION}\n    endpoint: ${openvidu.RECORDINGS_S3_ENDPOINT}\n    bucket: ${openvidu.RECORDINGS_S3_BUCKET}\n    force_path_style: ${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n
                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/egress.yaml
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/media_node/egress.yaml
                                                                                                                                                                                                    4. Restart the Master Node (or Single Node) to apply the changes:

                                                                                                                                                                                                      systemctl restart openvidu\n

                                                                                                                                                                                                      This command will restart the services which changed their configuration files in your entire OpenVidu deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/#additional-configuration-for-default-app-and-v2-compatibility","title":"Additional Configuration for Default App and V2 Compatibility","text":"

                                                                                                                                                                                                    If using the Default App (OpenVidu Call) or V2 Compatibility, additional configurations are required.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/#openvidu-default-app-openvidu-call","title":"OpenVidu Default App (OpenVidu Call)","text":"
                                                                                                                                                                                                    1. Update app.env with:

                                                                                                                                                                                                      CALL_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}\nCALL_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}\nCALL_S3_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}\nCALL_S3_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}\nCALL_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}\nCALL_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/app.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/app.env
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/external-s3/#pro-v2-compatibility","title":"PRO V2 Compatibility","text":"
                                                                                                                                                                                                    1. Update v2compatibility.env with:

                                                                                                                                                                                                      V2COMPAT_OPENVIDU_PRO_RECORDING_STORAGE=s3\nV2COMPAT_OPENVIDU_PRO_AWS_S3_BUCKET=${openvidu.RECORDINGS_S3_BUCKET}\nV2COMPAT_OPENVIDU_PRO_AWS_S3_SERVICE_ENDPOINT=${openvidu.RECORDINGS_S3_ENDPOINT}\nV2COMPAT_OPENVIDU_PRO_AWS_ACCESS_KEY=${openvidu.RECORDINGS_AWS_ACCESS_KEY}\nV2COMPAT_OPENVIDU_PRO_AWS_SECRET_KEY=${openvidu.RECORDINGS_AWS_SECRET_KEY}\nV2COMPAT_OPENVIDU_PRO_AWS_REGION=${openvidu.RECORDINGS_AWS_REGION}\nV2COMPAT_OPENVIDU_PRO_AWS_S3_WITH_PATH_STYLE_ACCESS=${openvidu.RECORDINGS_S3_FORCE_PATH_STYLE}\n

                                                                                                                                                                                                      The location of the file depends on the type of deployment:

                                                                                                                                                                                                      • Single Node: /opt/openvidu/config/v2compatibility.env
                                                                                                                                                                                                      • Elastic / High Availability: /opt/openvidu/config/cluster/master_node/v2compatibility.env
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/","title":"Force all traffic including WebRTC to go through 443 with TLS","text":"

                                                                                                                                                                                                    In certain scenarios, users may be behind restrictive firewalls or network policies that only permit traffic through port 443 using TLS. By default, OpenVidu is configured to allow traffic through port 443 with TLS if a TURN domain name is specified during the installation process. However, users in less restrictive environments can still utilize other ports to establish WebRTC connections.

                                                                                                                                                                                                    In some cases, it is necessary to ensure that all traffic, including WebRTC, is routed through port 443 with TLS due to network policies, security requirements, or other considerations.

                                                                                                                                                                                                    To enforce this configuration, OpenVidu must be installed with a TURN domain name, which is an optional step in the installation process. If this was not done initially, you will need to reinstall OpenVidu with a TURN domain name.

                                                                                                                                                                                                    Once OpenVidu is installed with a TURN domain name, ensure that the following ports are not open or are explicitly closed:

                                                                                                                                                                                                    Single Node closed Ports

                                                                                                                                                                                                    Node Port Protocol OpenVidu Server 443 UDP OpenVidu Server 50000-60000 UDP

                                                                                                                                                                                                    Elastic and High Availability closed Ports

                                                                                                                                                                                                    Node Port Protocol Media Node 443 UDP Media Node 50000-60000 UDP

                                                                                                                                                                                                    In this way, all the traffic will go through port 443 with TLS using the TURN domain name configured in the installation process.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/how-to-guides/force-443-tls/#considerations","title":"Considerations","text":"
                                                                                                                                                                                                    • Media over UDP using WebRTC does not mean that the media is not encrypted. WebRTC encrypts the media using SRTP and DTLS. WebRTC is designed to be encrypted by default.

                                                                                                                                                                                                    • Media going through 443 with TLS has a penalty in the media quality and CPU usage. This is because of the TLS roundtrip, TCP being used and media processed twice by the TURN server and the Media Server. This can lead to a worse user experience and higher CPU usage in the Media Server. We recommend using this configuration only if it is strictly necessary.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/","title":"Production ready","text":"

                                                                                                                                                                                                    OpenVidu is designed to be self-hosted, whether it is on premises or in a cloud provider. It brings to your own managed service advanced capabilities usually reserved only for SaaS solutions. There are two main reasons why you may need to self-host the real-time solution yourself:

                                                                                                                                                                                                    • Privacy: you can't afford to let your client's data get out of your reach. OpenVidu allows you to meet all your privacy and regulatory requirements: no data at all is sent to any third-party server. Everything is self-contained on your own servers.
                                                                                                                                                                                                    • Leverage your resources: your organization has access to its own infrastructure that can be used to host these services. SaaS solutions generally offer complete freedom from infrastructure management, but this comes with generally high prices that cover both the provider's infrastructure and their service surcharge. OpenVidu allows taking full advantage of your own infrastructure, reducing costs and increasing performance.

                                                                                                                                                                                                    It is important to mention that when we talk about self-hosting OpenVidu, we don't just mean installing it in bare-metal servers or private VPCs. OpenVidu also supports deployments in the most popular cloud providers, using their native services when possible. AWS is now supported, and others are coming soon. You can learn more about the different options to deploy OpenVidu in the deployment types section.

                                                                                                                                                                                                    One of OpenVidu's main goals is offering a self-hosted, production-ready live-video platform with all the advanced capabilities typically reserved for SaaS solutions. This includes outstanding performance, scalability, fault tolerance and observability:

                                                                                                                                                                                                    • Performance

                                                                                                                                                                                                      OpenVidu is built to be incredibly powerful. It is based on the best open source WebRTC stacks: LiveKit and mediasoup. By combining the best of both worlds, OpenVidu provides outstanding performance.

                                                                                                                                                                                                      Learn more about performance

                                                                                                                                                                                                    • Scalability

                                                                                                                                                                                                      OpenVidu has been designed from the outset with scalability in mind. Host videoconference rooms and large live streams with hundreds of participants. Autoscale your cluster to adapt to the demand and optimize your resources.

                                                                                                                                                                                                      Learn more about scalability

                                                                                                                                                                                                    • Fault Tolerance

                                                                                                                                                                                                      OpenVidu offers fault tolerance in all its components. Deploy a reliable high-availability cluster knowing that if one of your node goes down, others will be able to continue working with no downtime.

                                                                                                                                                                                                      Learn more about fault tolerance

                                                                                                                                                                                                    • Observability

                                                                                                                                                                                                      OpenVidu brings everything necessary to monitor the status, health, load and history of your deployment. It automatically collects events, metrics and logs, and provides OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                      Learn more about observability

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/","title":"Fault Tolerance","text":"

                                                                                                                                                                                                    Real-time media is particularly sensitive to downtime events, as they directly affect the user experience in a very disruptive way. OpenVidu is designed from the ground up to be fault tolerant in all its services in case of node downtime, especially in its High Availability deployment.

                                                                                                                                                                                                    The extent of fault tolerance depends on the OpenVidu deployment type:

                                                                                                                                                                                                    • OpenVidu Single Node: it is not fault tolerant. Fault tolerance requires a multi-node deployment.
                                                                                                                                                                                                    • OpenVidu Elastic: fault tolerant only for Media Nodes.
                                                                                                                                                                                                    • OpenVidu High Availability: fault tolerant for both Media Nodes and Master Nodes.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#fault-tolerance-in-openvidu-elastic","title":"Fault tolerance in OpenVidu Elastic","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#master-node","title":"Master Node","text":"

                                                                                                                                                                                                    An OpenVidu Elastic deployment has a single Master Node, so a failure on this node is fatal and any ongoing video Rooms will be interrupted. The service won't be restored until the Master Node is recovered.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#media-nodes","title":"Media Nodes","text":"

                                                                                                                                                                                                    You can have any number of Media Nodes in an OpenVidu Elastic deployment. Media Nodes are stateless, meaning that they do not store critical information about the Rooms, Egress or Ingress processes they are handling. This means that they can be easily replicated in any other Media Node in case of a failure.

                                                                                                                                                                                                    In the event of a Media Node failure, there are 3 services affected with the following behaviors:

                                                                                                                                                                                                    • Active Rooms hosted by the failed Media Node will suffer a temporary interruption of about 5 seconds (this is the time the clients take to realize the Media Node has crashed). After that time has elapsed, the Room will be automatically reconstructed in a healthy Media Node. Every participant and track will be recreated and the Room will be fully operational again.
                                                                                                                                                                                                    • Active Egress hosted by the failed Media Node will be interrupted. If the node's disk is still accessible, egress output files can still be recovered. See Recovering Egress from node failures.
                                                                                                                                                                                                    • Active Ingress hosted by the failed Media Node will be interrupted. The participants of the Room will receive the proper events indicating the Ingress participant has left the Room: TrackUnpublished and ParticipantDisconnected. Some famous tools for streaming such as OBS Studio will automatically try to reconnect the stream when they detect a connection loss, so in this case interruption will be minimal and the Ingress tracks will be restored on their own on a healthy Media Node.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#fault-tolerance-in-openvidu-high-availability","title":"Fault tolerance in OpenVidu High Availability","text":"

                                                                                                                                                                                                    OpenVidu High Availability delivers the highest possible degree of fault tolerance. This is achieved by running all of the services in the Master Nodes and the Media Nodes in their High Availability flavour.

                                                                                                                                                                                                    An OpenVidu High Availability deployment runs Master Nodes and Media Nodes in separated groups. Let's see the extent of fault tolerance for each node group:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#master-nodes","title":"Master Nodes","text":"

                                                                                                                                                                                                    The number of Master Nodes in an OpenVidu High Availability deployment is 4. This minimum number of nodes ensures that every service running in the Master Nodes is fault tolerant.

                                                                                                                                                                                                    If one Master Node fails, the service won't be affected. Some users may trigger event Reconnecting closely followed by Reconnected, but the service will remain fully operational.

                                                                                                                                                                                                    When two or more Master Nodes fail simultaneously, there can be some degradation of the service:

                                                                                                                                                                                                    • If two Master Nodes fail, the service will still be operational for the most part. Only active Egress might be affected, as they won't be stored in the Minio storage. See Recovering Egress from node failures.
                                                                                                                                                                                                    • If three or four Master Nodes fail, the service will be interrupted.

                                                                                                                                                                                                    In the event of Master Node failures, the service will be automatically restored as soon as the failed node(s) are recovered.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#media-nodes_1","title":"Media Nodes","text":"

                                                                                                                                                                                                    Fault tolerance of Media Nodes in OpenVidu Elastic behaves the same as in OpenVidu High Availability.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#recovering-egress-from-node-failures","title":"Recovering Egress from node failures","text":"

                                                                                                                                                                                                    Egress processes can be affected by the crash of a Master Node or a Media Node. To recover Egress from...

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#from-master-node-failures","title":"From Master Node failures","text":"

                                                                                                                                                                                                    This only applies to OpenVidu High Availability

                                                                                                                                                                                                    If 2 Master Nodes crash, the Egress process won't be able to use the Minio storage. This has different consequences depending on the configured outputs for your Egress process:

                                                                                                                                                                                                    • For MP4, OGG or WEBM files, if the Egress is stopped when 2 Master Nodes are down, the output files will not be uploaded to Minio.
                                                                                                                                                                                                    • For HLS, the segments will stop being uploaded to Minio. If you are consuming these segments from another process, note that new segments will stop appearing.

                                                                                                                                                                                                    In both cases, files are not lost and can be recovered. They will be available in the Egress backup path of the Media Node hosting the Egress process (by default /opt/openvidu/egress_data/home/egress/backup_storage).

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/fault-tolerance/#from-a-media-node-failure","title":"From a Media Node failure","text":"

                                                                                                                                                                                                    This applies to both OpenVidu High Availability and OpenVidu Elastic

                                                                                                                                                                                                    If the Media Node hosting an ongoing Egress process crashes, then the Egress process will be immediately interrupted. But as long as the disk of the crashed Media Node is still accessible, you may recover the output files. They will be available in the Media Node at path /opt/openvidu/egress_data/home/egress/tmp.

                                                                                                                                                                                                    It is possible that if the crashed Egress had MP4 as configured output (which is an option available for Room Composite and Track Composite) the recovered file may not be directly playable and it may require a repair process.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/","title":"Performance","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    mediasoup integration in OpenVidu is experimental, and should not be used in production environments. There are some limitations that are currently being worked on, expected to be ironed out in the near future.

                                                                                                                                                                                                    OpenVidu is able to handle up to 2x the load in a single server, doubling the amount of media Tracks that can be transmitted compared to base LiveKit. By not only building upon the giant Open-Source shoulders of LiveKit, but also pushing the bar further, OpenVidu uses the best-in-class technologies to bring considerable performance improvements to the table.

                                                                                                                                                                                                    The key element of any WebRTC server solution is the ability to exchange media between participants of a room, in the so-called WebRTC SFU. LiveKit implements its own SFU, and that's where OpenVidu makes a different choice by using mediasoup.

                                                                                                                                                                                                    The key points of how this works are:

                                                                                                                                                                                                    • On the surface, OpenVidu is the same than LiveKit, and for the most part features work equally, such as connection establishment, participant management, and SDK support.
                                                                                                                                                                                                    • Internally however, mediasoup is used to replace the original WebRTC engine implementation of LiveKit. mediasoup is built with the most efficient technologies and has outstanding low-level optimizations, which translates in a 2x improvement with respect to the original LiveKit Open Source performance.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#about-mediasoup-integration","title":"About mediasoup integration","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#architecture","title":"Architecture","text":"

                                                                                                                                                                                                    LiveKit created its own WebRTC SFU, based on the Pion library to route media between participants:

                                                                                                                                                                                                    OpenVidu is built by a team of expert WebRTC developers who know all the ins and outs of low-level WebRTC development, so it was possible to replace LiveKit's own implementation with an alternative, and mediasoup was the clear best choice given its fantastic performance characteristics:

                                                                                                                                                                                                    This means that applications built on top of LiveKit will continue to work exactly the same, while the internal WebRTC engine inside the server can be swapped at will and applications can benefit from that change, without having to be rebuilt.

                                                                                                                                                                                                    In terms of the signaling protocol, API and SDKs, OpenVidu maintains the original LiveKit implementation. LiveKit's API is very well designed, with a simple but powerful set of concepts, and the amount of SDKs available is very large.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#choice-of-technology","title":"Choice of technology","text":"

                                                                                                                                                                                                    Both LiveKit and Pion are written in the Go programming language, and this has some implications for speed and efficiency. While Go is popular for its simplicity, readability, and approach to concurrency, when it comes to performance other alternatives rank higher in common benchmarks.

                                                                                                                                                                                                    First and foremost, the two most defining limitations of Go is that it requires a quite heavy runtime that is able to handle all of the low-level features of the language, such as goroutines and memory allocations. Also, speaking of memory management, Go requires a Garbage Collector, which knowledgeable readers will recognize as a hindrance for performance-critical applications.

                                                                                                                                                                                                    mediasoup, on the other hand, focuses all of its efforts on maximum efficiency. It is written in C++, and it is ultra-optimized for the specific task of routing media packets. C++ is a language that provides fully manual management of all resources, and direct access to the hardware, with the benefit of software that is as fast as it can be on any machine.

                                                                                                                                                                                                    We believe that by combining the best of the LiveKit stack with a top-notch WebRTC engine like mediasoup, OpenVidu is the best option for those who need a self-hosted and high-performance real-time solution.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#limitations","title":"Limitations","text":"

                                                                                                                                                                                                    OpenVidu developers are hard at work with integrating mediasoup as a WebRTC engine within LiveKit, aiming to provide feature parity with the original Pion engine.

                                                                                                                                                                                                    Currently there are two client SDK events that are not triggered when using mediasoup:

                                                                                                                                                                                                    • No ConnectionQualityChanged event (LiveKit JS reference).
                                                                                                                                                                                                    • No TrackStreamStateChanged event (LiveKit JS reference).
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#benchmarking","title":"Benchmarking","text":"

                                                                                                                                                                                                    Numerous load tests have been performed to determine the true capabilities of OpenVidu on different hardware. To do so we have developed the tool Openvidu LoadTest: an in development project that aims to improve the precision of load and performance tests in WebRTC systems.

                                                                                                                                                                                                    We have compared OpenVidu using the original Pion WebRTC engine (this is the default LiveKit Open Source implementation) and using mediasoup as WebRTC engine. We tested the performance for both cases in the scenario below.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#results-conference-rooms","title":"Results: Conference rooms","text":"

                                                                                                                                                                                                    This tests increasingly adds Rooms of 8 Participants each, every one sending 1 video Track and 1 audio Track, and subscribing to all remote Tracks.

                                                                                                                                                                                                    The following plot shows the number of Participants that can be added to a Room in OpenVidu using Pion and using mediasoup as WebRTC engines:

                                                                                                                                                                                                    The conclusion is that for multiple Rooms, mediasoup performs much better than Pion, almost doubling the total number of Participants (and Tracks) that fit in the server.

                                                                                                                                                                                                    Below there is the deatiled connection progression for each Participant in each test.

                                                                                                                                                                                                    The X axis reflects the point of time in seconds. For each Participant there is a bar indicating its connection status:

                                                                                                                                                                                                    • An orange bar indicates that the browser is up, but the connection to the media server is still in progress.
                                                                                                                                                                                                    • A green bar indicates that the connection is up and running.
                                                                                                                                                                                                    • A red bar indicates that the connection has failed, indicating the time that it's down.

                                                                                                                                                                                                    CPU load of the server is also shown with a black marked plot (from 0 to 1, representing 0% to 100% CPU load).

                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with Pion

                                                                                                                                                                                                    Progression of the connection of each Participant through the test execution. Benchmark test for Rooms with 8 Participants using OpenVidu with mediasoup"},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#benchmarking-technical-details","title":"Benchmarking technical details","text":"
                                                                                                                                                                                                    • Each participant sending video and audio to the media server uses the following video in loop: Video. The video is in YUV4MPEG2 format and with a 640x480 resolution. The audio is in WAV format: Audio.
                                                                                                                                                                                                    • All tests were done using AWS EC2 instances. The media server runs with a m6in.xlarge instance type, an instance type with 4 vCPUs and better network capabilities compared to other instance types.
                                                                                                                                                                                                    • The workers running the browsers that act as participants ran in c5.xlarge instances, an instance type with 4 vCPUs with better computing capabilities.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#benchmarking-methodology","title":"Benchmarking methodology","text":"

                                                                                                                                                                                                    Each test begins with no participants on the media server. First, the test controller creates EC2 instances to host the browsers. The controller then sends a request to create a number of participants (this number is known as the batch size). After each browser sends confirmation to the controller that it is connected, the controller sends another request to add more participants (as many participants as the batch size specifies). A participant is considered connected to the room if:

                                                                                                                                                                                                    • If the participants sends video and audio, the participant is connected after confirming that both local tracks are being sent correctly.
                                                                                                                                                                                                    • If the participant acts as viewer (is only receiving video and audio from a different participant), the participant is connected when it confirms that it is receiving at least both tracks from a user in the room.

                                                                                                                                                                                                    The test stops when it determines that no more users can be added to a room. This happens when a user has 5 failed connections. A connection is considered to have failed when it terminates with a fatal error (in LiveKit this is captured when a Disconnected event occurs) or when the connection times out. A failure in connection can occur when trying to join a room (ending usually in timeout) or during the connection (a Disconnected event is thrown). Each time a failure is communicated to the controller, it will kill that browser and restart it again, effectively restarting the connection (up to 5 times, as mentioned before).

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/performance/#about-openvidu-loadtest","title":"About OpenVidu LoadTest","text":"

                                                                                                                                                                                                    Tools like livekit-cli simulate participants directly using WebRTC SDKs, but we found out that browsers add significant more load that these kind of systems. This makes Openvidu LoadTest give results that are closer to real-world scenarios, as it uses real browsers. Using real browsers also allows for the collection of useful data related to connections, events and WebRTC statistics. On the other hand, tests performed with Openvidu LoadTest are more expensive, as they require real instances to host the browsers.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/","title":"Scalability","text":"

                                                                                                                                                                                                    Scalability is a very broad term with implications on many levels. In the case of real-time applications, it usually refers to the number of simultaneous Rooms you can host and the maximum number of participants in each Room, or more accurately, the number of media tracks sent and received in each Room.

                                                                                                                                                                                                    OpenVidu offers scalability out-of-the-box for typical videoconferencing use cases, but also for large low-latency live streams with hundreds of viewers. With OpenVidu Elastic and OpenVidu High Availability you can easily scale your deployment to host many simultaneous videoconferences and live streams. And it is also possible to scale automatically with our autoscaling feature, so you can truly adapt your resources to the demand.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/#scalability-depending-on-the-use-case","title":"Scalability depending on the use case","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/#small-and-medium-videoconferences","title":"Small and medium videoconferences","text":"

                                                                                                                                                                                                    OpenVidu allows you to host multiple small and medium videoconferences (up to 10 participants). The number of simultaneous rooms depends on the deployment used and the power of machines.

                                                                                                                                                                                                    • Single Node deployment (OpenVidu Community): In this deployment, OpenVidu can manage up to XXX simultaneous videoconferences of 10 participants in a 4 CPU server. If you need more videoconferences at the same time, you can use more powerful server. This is known as vertical scalability. The limit here is usually the maximum computational power available for a single server and the maximum network bandwidth for it.

                                                                                                                                                                                                    • Elastic and High Availability deployments (OpenVidu Pro): In these deployments, OpenVidu is able to distribute the videoconferences in multiple media servers. This is known as horizontal scalability. In this case, the maximum number of simultaneous videoconferences depends on the number of media server used and the computational power of each of them. Also, the service used to coordinate the media servers (Redis) can be the bottleneck and limit the number of videoconferences. In High Availability deployments, Redis is distributed in 4 master nodes, so it is able to handle more load than in the Elastic deployment (with only one master node).

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/#big-live-streams","title":"Big live streams","text":"

                                                                                                                                                                                                    Live streaming is different from a video conference. In a videoconference, usually all participants can publish audio and video. Instead, in a live stream, only one participant can publish audio and video (known as the publisher) and others can view it (known as viewers).

                                                                                                                                                                                                    OpenVidu is able to manage live streams with up to XXX viewers (1 publisher and XXX subscribers) in a single Room hosted in a server with 4 CPUs. To manage more than one live stream simultaneously, an Elastic or High Availability deployment is needed with several media servers.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/#big-videoconferences-and-massive-live-streams-working-on-it","title":"Big videoconferences and massive live streams (Working on it! )","text":"

                                                                                                                                                                                                    For big videoconferences with many participants (in the order of 100- or even 1000-) and massive live streams with few publishers and thousands of viewers, OpenVidu will offer in the near future two distinct strategies:

                                                                                                                                                                                                    • Distributing participants of one Room in multiple servers: By connecting multiple media servers between them, OpenVidu will be able to manage Rooms with unlimited number of participants and live streams with unlimited number of viewers.
                                                                                                                                                                                                    • Only show last speakers: A browser or mobile app is able to show a limited number of participants. A powerful computer can visualize up to 10 simultaneous videoconference participants at the same time with high video quality. To allow big videoconferences, OpenVidu will provide features on its frontend SDKs to show only last speakers in the videoconference.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/scalability/#autoscaling","title":"Autoscaling","text":"

                                                                                                                                                                                                    OpenVidu Elastic and OpenVidu High Availability have multiple Media Nodes to handle the load.

                                                                                                                                                                                                    • Rooms are distributed among the available nodes prioritizing the less-loaded nodes.
                                                                                                                                                                                                    • It is possible to dynamically add new Media Nodes to the cluster when the load increases.
                                                                                                                                                                                                    • It is possible to remove Media Nodes from the cluster when the load decreases. If the Media Node is hosting ongoing Rooms, it won't accept new Rooms and will wait until the ongoing Rooms finish before terminating.

                                                                                                                                                                                                    When deploying on AWS, OpenVidu will automatically add and remove Media Nodes according to load, thanks to Auto Scaling Groups. When deploying On Premises you are responsible of monitoring the load of your Media Nodes and triggering the addition of new Media Nodes or removal of existing Media Nodes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/","title":"Observability","text":"

                                                                                                                                                                                                    Any production software needs to be observable. But in real-time applications this becomes an absolute priority. You must be able to:

                                                                                                                                                                                                    • Detect and solve networking issues that may prevent your users from connecting to your Rooms.
                                                                                                                                                                                                    • Monitor the quality of the video and audio streams, that will reflect in your users' experience.
                                                                                                                                                                                                    • Analyze the load in your hardware to detect bottlenecks and scale your deployment accordingly.
                                                                                                                                                                                                    • Store historical data to analyze past issues and trends to make future decisions based on them.

                                                                                                                                                                                                    OpenVidu brings everything you need to fulfill these requirements. We collect events, metrics and logs from your deployment and provide OpenVidu Dashboard and a Grafana stack to navigate them.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/","title":"Grafana Stack","text":"

                                                                                                                                                                                                    OpenVidu also provides different Grafana dashboards to monitor metrics from OpenVidu Server and logs from your cluster.

                                                                                                                                                                                                    Grafana is available at https://your.domain/grafana/ and can be accessed using your Grafana admin credentials.

                                                                                                                                                                                                    Dashboards can be found in the OpenVidu folder at https://your.domain/grafana/dashboards/f/openvidu-dashboards/openvidu.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#services","title":"Services","text":"

                                                                                                                                                                                                    The Grafana stack that comes with OpenVidu is composed of the following services:

                                                                                                                                                                                                    • Grafana : Tool for querying, visualizing, alerting on and exploring metrics, logs and traces. It queries different data sources to show data in beautiful dashboards. In OpenVidu, contains all dashboards built from Mimir/Prometheus and Loki data sources to monitor OpenVidu Server and logs from your cluster.
                                                                                                                                                                                                    • Prometheus : System monitoring and alerting toolkit. It collects and stores metrics from different targets as time series data. In OpenVidu, it collects metrics from OpenVidu Server of each Media Node and sends them to Mimir.
                                                                                                                                                                                                    • Mimir: Grafana software project that provides multi-tenant, long-term storage for Prometheus metrics. In OpenVidu, it is used to store metrics collected by Prometheus.
                                                                                                                                                                                                    • Promtail: Agent that ships the contents of local logs to a Loki instance. In OpenVidu, it is used to collect logs from all services in your cluster and send them to Loki.
                                                                                                                                                                                                    • Loki: Horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. In OpenVidu, it is used to store logs collected by Promtail.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#dashboards","title":"Dashboards","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-server-metrics","title":"OpenVidu Server Metrics","text":"

                                                                                                                                                                                                    This dashboard provides metrics about OpenVidu Server. It includes charts about active rooms, active participants, published tracks, subscribed tracks, send/receive bytes, packet loss percentage and quality score.

                                                                                                                                                                                                    In case you are using OpenVidu PRO and you have more than one Media Node deployed, you will see all metrics from all nodes combined in the same chart.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-media-nodes-server-metrics","title":"OpenVidu Media Nodes Server Metrics","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    This dashboard provides the same metrics as the OpenVidu Server Metrics dashboard, but grouped by Media Node.

                                                                                                                                                                                                    You can select the Media Node you want to see metrics from in the media_node dropdown. You will see different charts in the same panel according to the selected Media Nodes.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you add new Media Nodes to your OpenVidu deployment, you will have to refresh the page in order to see the new Media Nodes in the dropdown.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-logs","title":"OpenVidu Logs","text":"

                                                                                                                                                                                                    In case you are using OpenVidu COMMUNITY, this dashboard provides different visualizations for logs from your OpenVidu Single Node deployment.

                                                                                                                                                                                                    There is a panel showing all containers logs,

                                                                                                                                                                                                    another panel to filter logs by room_id and participant_id,

                                                                                                                                                                                                    and one row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-cluster-nodes-logs","title":"OpenVidu Cluster Nodes Logs","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by node.

                                                                                                                                                                                                    First of all, there is a panel showing all containers logs from all nodes.

                                                                                                                                                                                                    Then, there is a row for each selected node, containing all logs, warnings and errors from that node. Besides, each row contains a panel for each selected container, showing all its logs.

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    Note that some panels have no data. This is because some containers are running in Master Nodes and others in Media Nodes.

                                                                                                                                                                                                    You can also filter logs containing a specific text by using the filter search box.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#openvidu-cluster-services-logs","title":"OpenVidu Cluster Services Logs","text":"

                                                                                                                                                                                                    This dashboard is part of OpenVidu PRO edition.

                                                                                                                                                                                                    In case you are using OpenVidu PRO, this dashboard provides different visualizations for logs from your OpenVidu Elastic or OpenVidu High Availability cluster, grouped by service.

                                                                                                                                                                                                    First of all, there is a panel to filter logs by room_id and participant_id.

                                                                                                                                                                                                    Then, there is a row for each selected service, containing all logs, warnings and errors from that service.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/grafana-stack/#limitations","title":"Limitations","text":"

                                                                                                                                                                                                    For now, in OpenVidu High Availability deployments, we have decided to not implement Grafana in High Availability (HA) mode. This decision is based on the fact that Grafana needs a configured HA MySQL or PostgreSQL database to work in HA mode, and we want to keep the deployment as simple as possible.

                                                                                                                                                                                                    There are 4 instances of Grafana in an OpenVidu High Availability deployment, one for each Master Node, but they are not synchronized between them. Therefore, if you make any change (change your admin password, create a new dashboard...) in one Grafana instance and the Master Node suddenly goes down, you will be redirected to another Grafana instance where the changes will not be reflected. That is the reason why we disable user signups and saving dashboard or datasource modifications in Grafana.

                                                                                                                                                                                                    However, all metrics and logs from all nodes are available in all Grafana instances, so you can monitor your OpenVidu cluster without any problem.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/","title":"OpenVidu Dashboard","text":"

                                                                                                                                                                                                    It is a web application designed to provide OpenVidu administrators with a comprehensive view of usage statistics and real-time monitoring of video Rooms. OpenVidu Dashboard is included by default in any OpenVidu deployment.

                                                                                                                                                                                                    To access OpenVidu Dashboard, go to https://your.domain/dashboard/ and log in using your admin credentials.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#views","title":"Views","text":""},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#analytics","title":"Analytics","text":"

                                                                                                                                                                                                    Display graphical analytics for client SDKs, connection types, bandwidth usage, unique participants, rooms and egresses created over different time periods (last 24 hours, last 7 days, last 28 days or current month).

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#rooms","title":"Rooms","text":"

                                                                                                                                                                                                    Review the total count of active rooms and active participants, along with a roster of currently active rooms and a history of closed rooms within the last 28 days. Detailed information on each room is accessible by clicking on the respective row.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#room-details","title":"Room Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Retrieve in-depth information about a specific room, including its duration, bandwidth consumption, participants and related events. A chart illustrating the active participants count over time is also provided.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#participant-details","title":"Participant Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Obtain detailed insights into each participant, covering their duration, bandwidth usage, average audio and video quality score, information about the client they are connecting with, connection stats, published tracks and related events.

                                                                                                                                                                                                    A participant may connect and disconnect from a room multiple times while it remains open. Each instance of connection using the same participant identity is referred to as a participant session. If multiple sessions occur, we will aggregate all participant sessions together and organize them into a timeline at the top of the participant details view. You can easily switch between participant sessions by clicking on each corresponding row:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#egress-ingress","title":"Egress-Ingress","text":"

                                                                                                                                                                                                    Review an overview of all egresses and ingresses, including their duration and status. Detailed information for each egress or ingress can be accessed by clicking on the respective row.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#egress-details","title":"Egress Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Access comprehensive details about a specific egress, including its duration, current status, type, associated room, destinations, status timeline and request information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/production-ready/observability/openvidu-dashboard/#ingress-details","title":"Ingress Details","text":"

                                                                                                                                                                                                    This view is part of OpenVidu PRO edition.

                                                                                                                                                                                                    Explore detailed information about a specific ingress, including its total duration, status and a list of all associated rooms.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/","title":"OpenVidu Single Node installation","text":"

                                                                                                                                                                                                    OpenVidu Single Node is part of the COMMUNITY edition of OpenVidu. You have the following deployment options:

                                                                                                                                                                                                    • On-premises Installation: Set up OpenVidu Single Node on your own servers.
                                                                                                                                                                                                    • AWS Installation: Deploy OpenVidu Single Node on Amazon Web Services.

                                                                                                                                                                                                    Once your deployment is complete, refer to the following sections for configuration and management:

                                                                                                                                                                                                    • On-premises: Configuration and Administration
                                                                                                                                                                                                    • AWS: Configuration and Administration
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/","title":"OpenVidu Single Node Administration: AWS","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    AWS deployment of OpenVidu Single Node is internally identical to the on-premises deployment, so you can follow the same instructions from the On Premises Single Node for administration and configuration. The only difference is that the deployment is automated with AWS CloudFormation.

                                                                                                                                                                                                    However, there are certain things worth mentioning:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/#start-and-stop-openvidu-through-aws-console","title":"Start and stop OpenVidu through AWS Console","text":"

                                                                                                                                                                                                    You can start and stop all services as explained in the On Premises Single Node section. But you can also start and stop the EC2 instance directly from the AWS Console. This will stop all services running in the instance and reduce AWS costs.

                                                                                                                                                                                                    Stop OpenVidu Single NodeStart OpenVidu Single Node
                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. Right-click on the instance you want to start and select \"Stop instance\".

                                                                                                                                                                                                    1. Go to the EC2 Dashboard of AWS.
                                                                                                                                                                                                    2. Right-click on the instance you want to start and select \"Start instance\".

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/#change-the-instance-type","title":"Change the instance type","text":"

                                                                                                                                                                                                    You can change the instance type of the OpenVidu Single Node instance to adapt it to your needs. To do this, follow these steps:

                                                                                                                                                                                                    1. Stop the instance.
                                                                                                                                                                                                    2. Right-click on the instance and select \"Instance Settings > Change Instance Type\".

                                                                                                                                                                                                      Change instance type

                                                                                                                                                                                                    3. Select the new instance type and click on \"Apply\".

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/admin/#administration-and-configuration","title":"Administration and Configuration","text":"

                                                                                                                                                                                                    For administration, you can follow the instructions from the On Premises Single Node Administration section.

                                                                                                                                                                                                    Regarding the configuration, in AWS it is managed similarly to an on-premises deployment. For detailed instructions, please refer to the Changing Configuration section. Additionally, the How to Guides offer multiple resources to assist with specific configuration changes.

                                                                                                                                                                                                    In addition to these, an AWS deployment provides the capability to manage global configurations via the AWS Console using AWS Secrets created during the deployment. To manage configurations this way, follow these steps:

                                                                                                                                                                                                    Changing Configuration through AWS Secrets
                                                                                                                                                                                                    1. Navigate to the CloudFormation Dashboard on AWS.
                                                                                                                                                                                                    2. Select the CloudFormation Stack that you used to deploy OpenVidu Single Node.
                                                                                                                                                                                                    3. In the \"Outputs\" tab, click the Link at \"ServicesAndCredentials\". This will open the AWS Secrets Manager which contains all the configurations of the OpenVidu Single Node deployment.
                                                                                                                                                                                                    4. Click on the \"Retrieve secret value\" button to get the JSON with all the information.
                                                                                                                                                                                                    5. Modify the parameter you want to change and click on \"Save\". The changes will be applied to the OpenVidu Single Node deployment.
                                                                                                                                                                                                    6. Go to the EC2 Console and click on \"Reboot instance\" to apply the changes to the Master Node.

                                                                                                                                                                                                    The changes will be applied automatically.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/","title":"OpenVidu Single Node Installation: AWS","text":"

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment in AWS. Deployed services are the same as the On Premises Single Node Installation but automate the process with AWS CloudFormation.

                                                                                                                                                                                                    First of all, import the template in the AWS CloudFormation console. You can click the following button...

                                                                                                                                                                                                    Deploy OpenVidu Single Node in

                                                                                                                                                                                                    ...or access your AWS CloudFormation console and manually set this S3 URL in the Specify template section:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/latest/aws/cf-openvidu-singlenode.yaml\n

                                                                                                                                                                                                    Info

                                                                                                                                                                                                    If you want to deploy an specific version of OpenVidu Elastic, replace latest with the version you want to deploy. For example, to deploy version 3.0.0, use the following URL:

                                                                                                                                                                                                    https://s3.eu-west-1.amazonaws.com/get.openvidu.io/community/singlenode/3.0.0/aws/cf-openvidu-singlenode.yaml\n
                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Single Node AWS Architecture

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#cloudformation-parameters","title":"CloudFormation Parameters","text":"

                                                                                                                                                                                                    Depending on your needs, you need to fill the following CloudFormation parameters:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#domain-and-ssl-certificate-configuration","title":"Domain and SSL Certificate Configuration","text":"

                                                                                                                                                                                                    These are the three possible scenarios you may have to configure in this section:

                                                                                                                                                                                                    Let's Encrypt Certificate (recommended)Self-Signed CertificateCustom Certificates

                                                                                                                                                                                                    For a production-ready setup, this scenario is ideal when you have an FQDN (Fully Qualified Domain Name) and an Elastic IP at your disposal. It leverages the services of Let's Encrypt to automatically generate valid certificates.

                                                                                                                                                                                                    First, you need to have the FQDN pointing to the Elastic IP you are going to use.

                                                                                                                                                                                                    Then, you need to fill in the following parameters:

                                                                                                                                                                                                    As you can see, you need to specify the DomainName with your FQDN, the PublicElasticIP with the Elastic IP that the domain points to, and the LetsEncryptEmail with your email address for Let\u2019s Encrypt notifications. These parameters are mandatory.

                                                                                                                                                                                                    This is the most straightforward option for deploying OpenVidu on AWS when you do not have a Fully Qualified Domain Name (FQDN). This method allows for the immediate use of OpenVidu in AWS using CloudFormation.

                                                                                                                                                                                                    However, this convenience comes with the caveat that users will need to manually accept the certificate in their web browsers. Please be aware that this configuration is solely for developmental and testing purposes and is not suitable for a production environment.

                                                                                                                                                                                                    These are the parameters needed in this section to use self-signed certificates:

                                                                                                                                                                                                    You don\u2019t need to specify any parameters; just select the CertificateType as self-signed. The domain name used will be an AWS-generated one.

                                                                                                                                                                                                    Opt for this method if you possess your own certificate for an existing FQDN. It enables you to deploy OpenVidu on AWS using your certificates.

                                                                                                                                                                                                    You need to have a Fully Qualified Domain Name (FQDN) pointing to a previously created Elastic IP.

                                                                                                                                                                                                    Also, you need a temporary HTTP server hosting your private and public certificate under a specific URL. These URLs are needed for the instance to be able to download and install your certificates.

                                                                                                                                                                                                    The configured parameters would look like this:

                                                                                                                                                                                                    You need to specify at OwnPublicCertificate and OwnPrivateCertificate the URLs where the public and private certificates are hosted, respectively. The DomainName and PublicElasticIP are mandatory parameters.

                                                                                                                                                                                                    Certificates need to be in PEM format and the URLs must be accessible from the instance.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#ec2-instance-configuration","title":"EC2 Instance Configuration","text":"

                                                                                                                                                                                                    You need to specify some properties for the EC2 instance that will be created.

                                                                                                                                                                                                    EC2 Instance configuration

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Simply select the type of instance you want to deploy at InstanceType, the SSH key you want to use to access the machine at KeyName, and the Amazon Image ID (AMI) to use at AmiId.

                                                                                                                                                                                                    By default, the parameter AmiId is configured to use the latest LTS Ubuntu AMI, so ideally you don\u2019t need to modify this.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#optional-turn-server-configuration-with-tls","title":"(Optional) TURN server configuration with TLS","text":"

                                                                                                                                                                                                    This section is optional. It is useful when your users are behind a restrictive firewall that blocks UDP traffic. This parameter will only works if you are using letsencrypt or owncert as the CertificateType parameter.

                                                                                                                                                                                                    TURN server configuration with TLS

                                                                                                                                                                                                    The parameters in this section may look like this:

                                                                                                                                                                                                    Set the TurnDomainName parameter to the domain name you intend to use for your TURN server. It should be pointing to the PublicElasticIP specified in the previous section.

                                                                                                                                                                                                    If you are using letsencrypt as the CertificateType parameter, you can leave the TurnOwnPublicCertificate and TurnOwnPrivateCertificate parameters empty. If you are using owncert, you need to specify the URLs where the public and private certificates are hosted.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#deploying-the-stack","title":"Deploying the Stack","text":"

                                                                                                                                                                                                    When you are ready with your CloudFormation parameters, just click on \"Next\", specify in \"Stack failure options\" the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of error, click on \"Next\" again, and finally \"Submit\".

                                                                                                                                                                                                    When everything is ready, you will see the following links in the \"Outputs\" section of CloudFormation:

                                                                                                                                                                                                    CloudFormation Outputs

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    The Output Key ServicesAndCredentials of the previous section points to an AWS Secret Manager secret that contains all URLs and credentials to access the services deployed. You can access the secret by clicking on the link in the Output Value column.

                                                                                                                                                                                                    Then, click on Retrieve secret value to get the JSON with all the information.

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the values of the JSON secret. All access credentials of all services are defined in this object.

                                                                                                                                                                                                    Your authentication credentials and URL to point your applications would be:

                                                                                                                                                                                                    • URL: The value in the AWS Secret of DOMAIN_NAME as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in the AWS Secret of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in the AWS Secret of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#troubleshooting-initial-cloudformation-stack-creation","title":"Troubleshooting Initial CloudFormation Stack Creation","text":"

                                                                                                                                                                                                    If something goes wrong during the initial CloudFormation stack creation, your stack may reach the CREATE_FAILED status for multiple reasons. It could be due to a misconfiguration in the parameters, a lack of permissions, or a problem with the AWS services. When this happens, the following steps can help you troubleshoot the issue and identify what went wrong:

                                                                                                                                                                                                    1. While deploying the stack, make sure at \"Stack failure options\" you have selected the option \"Preserve successfully provisioned resources\" to be able to troubleshoot the deployment in case of an error.

                                                                                                                                                                                                      Disable Rollback on failure

                                                                                                                                                                                                    2. Check if the EC2 instance or instances are running. If they are not, check the CloudFormation events for any error messages.

                                                                                                                                                                                                    3. If the EC2 instance or instances are running, SSH into the instance and check the logs of the following files:

                                                                                                                                                                                                      • /var/log/cloud-init-output.log
                                                                                                                                                                                                      • /var/log/cloud-init.log

                                                                                                                                                                                                      These logs will give you more information about the CloudFormation stack creation process.

                                                                                                                                                                                                    4. If everything seems fine, check the status and the logs of the installed OpenVidu services.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/aws/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    When your CloudFormation stack reaches the CREATE_COMPLETE status, your OpenVidu Single Node deployment is ready to use. You can check the Administration section to learn how to manage your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/","title":"OpenVidu Single Node Administration: On-premises","text":"

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    While in BETA this section is subject to changes. We are working to simplify the configuration and administration of OpenVidu Single Node.

                                                                                                                                                                                                    The OpenVidu installer offers an easy way to deploy OpenVidu Single Node on-premises. However, once the deployment is complete, you may need to perform administrative tasks based on your specific requirements, such as changing passwords, specifying custom configurations, and starting or stopping services.

                                                                                                                                                                                                    This section provides details on configuration parameters and common administrative tasks for on-premises OpenVidu Single Node deployments.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/#starting-stopping-and-restarting-openvidu","title":"Starting, stopping, and restarting OpenVidu","text":"

                                                                                                                                                                                                    You can start, stop, and restart the OpenVidu services using the following commands:

                                                                                                                                                                                                    Start OpenVidu

                                                                                                                                                                                                    sudo systemctl start openvidu\n

                                                                                                                                                                                                    Stop OpenVidu

                                                                                                                                                                                                    sudo systemctl stop openvidu\n

                                                                                                                                                                                                    Restart OpenVidu

                                                                                                                                                                                                    sudo systemctl restart openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/#checking-the-status-of-services","title":"Checking the status of services","text":"

                                                                                                                                                                                                    You can check the status of the OpenVidu services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose ps\n

                                                                                                                                                                                                    The services are operating correctly if you see an output similar to the following and there are no restarts from any of the services:

                                                                                                                                                                                                    NAME         IMAGE                                        COMMAND                  SERVICE      CREATED          STATUS\napp          docker.io/openvidu/openvidu-call             \"docker-entrypoint.s\u2026\"   app          19 seconds ago   Up 16 seconds\ncaddy        docker.io/openvidu/openvidu-caddy            \"/bin/caddy run --co\u2026\"   caddy        19 seconds ago   Up 16 seconds\ndashboard    docker.io/openvidu/openvidu-dashboard        \"./openvidu-dashboard\"   dashboard    19 seconds ago   Up 16 seconds\negress       docker.io/livekit/egress                     \"/entrypoint.sh\"         egress       18 seconds ago   Up 14 seconds\ngrafana      docker.io/grafana/grafana                    \"/run.sh\"                grafana      18 seconds ago   Up 13 seconds\ningress      docker.io/livekit/ingress                    \"ingress\"                ingress      19 seconds ago   Up 14 seconds\nloki         docker.io/grafana/loki                       \"/usr/bin/loki -conf\u2026\"   loki         18 seconds ago   Up 14 seconds\nminio        docker.io/bitnami/minio                      \"/opt/bitnami/script\u2026\"   minio        18 seconds ago   Up 14 seconds\nmongo        docker.io/mongo                              \"docker-entrypoint.s\u2026\"   mongo        18 seconds ago   Up 15 seconds\nopenvidu     docker.io/openvidu/openvidu-server           \"/livekit-server --c\u2026\"   openvidu     19 seconds ago   Up 14 seconds\nprometheus   docker.io/prom/prometheus                    \"/bin/prometheus --c\u2026\"   prometheus   18 seconds ago   Up 14 seconds\npromtail     docker.io/grafana/promtail                   \"/usr/bin/promtail -\u2026\"   promtail     18 seconds ago   Up 14 seconds\nredis        docker.io/redis                              \"docker-entrypoint.s\u2026\"   redis        19 seconds ago   Up 15 seconds\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/#checking-logs","title":"Checking logs","text":"

                                                                                                                                                                                                    If any of the services are not working as expected, you can check the logs of the services using the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs <service-name>\n

                                                                                                                                                                                                    Replace <service-name> with the name of the service you want to check. For example, to check the logs of the OpenVidu Server, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs openvidu\n

                                                                                                                                                                                                    To check the logs of all services, use the following command:

                                                                                                                                                                                                    cd /opt/openvidu/\ndocker compose logs\n

                                                                                                                                                                                                    You can also review your logs using the Grafana dashboard provided with OpenVidu. To access it, go to https://<your-domain.com>/grafana and use the credentials located in /opt/openvidu/.env to log in. Once inside, navigate to the \"Home\" section, select \"Dashboard\", and then click on \"OpenVidu > OpenVidu Logs\". All the logs will be displayed there.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/#changing-the-configuration","title":"Changing the configuration","text":"

                                                                                                                                                                                                    You can check how to change the configuration in the Changing Configuration section. Also, there are multiple guides in the How to Guides section that can help you with specific configuration changes.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/admin/#uninstalling-openvidu","title":"Uninstalling OpenVidu","text":"

                                                                                                                                                                                                    To uninstall OpenVidu, just execute the following commands:

                                                                                                                                                                                                    sudo su\nsystemctl stop openvidu\nrm -rf /opt/openvidu/\nrm /etc/systemd/system/openvidu.service\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/","title":"OpenVidu Single Node Installation: On-premises","text":"

                                                                                                                                                                                                    Regarding OpenVidu v2 compatibility

                                                                                                                                                                                                    OpenVidu Single Node is not compatible with OpenVidu v2 API. For having compatibility with OpenVidu v2 applications, you must use OpenVidu Elastic or OpenVidu High Availability.

                                                                                                                                                                                                    This section contains the instructions to deploy a production-ready OpenVidu Single Node deployment on-premises. It is a deployment based on Docker and Docker Compose, which will automatically configure all the necessary services for OpenVidu to work properly.

                                                                                                                                                                                                    Architecture overview

                                                                                                                                                                                                    This is how the architecture of the deployment looks like:

                                                                                                                                                                                                    OpenVidu Single Node On Premises Architecture

                                                                                                                                                                                                    All services are deployed on a single machine, which includes:

                                                                                                                                                                                                    • OpenVidu Server (LiveKit compatible).
                                                                                                                                                                                                    • Ingress and Egress services.
                                                                                                                                                                                                    • OpenVidu Dashboard, a web application interface to visualize your Rooms, Ingress, and Egress services.
                                                                                                                                                                                                    • MinIO as an S3 storage service for recordings.
                                                                                                                                                                                                    • Redis as a shared database for OpenVidu Server and Ingress/Egress services.
                                                                                                                                                                                                    • MongoDB as a database for storing analytics and monitoring data.
                                                                                                                                                                                                    • Caddy as a reverse proxy. It can be deployed with self-signed certificates, Let's Encrypt certificates, or custom certificates.
                                                                                                                                                                                                    • OpenVidu Call (Default Application module), an optional ready-to-use videoconferencing application.
                                                                                                                                                                                                    • Grafana, Mimir, Promtail, and Loki (Observability module) form an optional observability stack for monitoring, allowing you to keep track of logs and deployment statistics for OpenVidu.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#prerequisites","title":"Prerequisites","text":"

                                                                                                                                                                                                    Before starting the installation process, make sure you have the following prerequisites:

                                                                                                                                                                                                    • A machine with at least 4GB RAM and 4 CPU cores and Linux installed (Ubuntu recommended).
                                                                                                                                                                                                    • Generous disk space (100GB recommended) if you are going to record your sessions.
                                                                                                                                                                                                    • The machine must have a Public IP and an FQDN (Fully Qualified Domain Name) pointing to it.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#port-rules","title":"Port rules","text":"

                                                                                                                                                                                                    Ensure all these rules are configured in your firewall, security group, or any kind of network configuration that you have in your machine.

                                                                                                                                                                                                    Inbound port rules:

                                                                                                                                                                                                    Protocol Ports Source Description TCP 80 0.0.0.0/0, ::/0 Redirect HTTP traffic to HTTPS and Let's Encrypt validation. TCP 443 0.0.0.0/0, ::/0 Allows access to the following:
                                                                                                                                                                                                    • LiveKit API.
                                                                                                                                                                                                    • OpenVidu Dashboard.
                                                                                                                                                                                                    • OpenVidu Call (Default Application).
                                                                                                                                                                                                    • WHIP API.
                                                                                                                                                                                                    • TURN with TLS.
                                                                                                                                                                                                    • Custom layouts
                                                                                                                                                                                                    UDP 443 0.0.0.0/0, ::/0 STUN/TURN server over UDP. TCP 1935 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest RTMP streams using Ingress service. TCP 7881 0.0.0.0/0, ::/0 (Optional), only needed if you want to allow WebRTC over TCP. UDP 7885 0.0.0.0/0, ::/0 (Optional), only needed if you want to ingest WebRTC using WHIP protocol. TCP 9000 0.0.0.0/0, ::/0 (Optional), only needed if you want to expose MinIO publicly. UDP 50000 - 60000 0.0.0.0/0, ::/0 WebRTC Media traffic.

                                                                                                                                                                                                    Outbound port rules:

                                                                                                                                                                                                    Typically, all outbound traffic is allowed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#guided-installation","title":"Guided Installation","text":"

                                                                                                                                                                                                    Before the installation, ensure that your machine meets the prerequisites and the port rules. Then, execute the following command on the machine where you want to deploy OpenVidu:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh)\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    A wizard will guide you through the installation process. You will be asked for the following information:

                                                                                                                                                                                                    • Select which certificate type to use:
                                                                                                                                                                                                      • Self Signed Certificate: It will generate a self-signed certificate. It is not recommended for production environments, but it is useful for testing or development purposes.
                                                                                                                                                                                                      • Let's Encrypt: It will automatically generate a certificate for your domain. The Let's Encrypt email is required and will be asked later in the wizard.
                                                                                                                                                                                                      • ZeroSSL: It will automatically generate a certificate for your domain using ZeroSSL. An API Key is required and will be asked later in the wizard.
                                                                                                                                                                                                      • Own Certificate: It will ask you for the certificate and key files. Just copy and paste the content of the files when the wizard asks for them.
                                                                                                                                                                                                    • Domain name: The domain name for your deployment. It must be an FQDN pointing to the machine where you are deploying OpenVidu.
                                                                                                                                                                                                    • (Optional) Turn domain name: The domain name for your TURN server with TLS. It must be an FQDN pointing to the machine where you are deploying OpenVidu and must be different from the OpenVidu domain name. Recommended if users who are going to connect to your OpenVidu deployment are behind restrictive firewalls.
                                                                                                                                                                                                    • Modules to enable: Select the modules you want to enable. You can enable the following modules:
                                                                                                                                                                                                      • Default App: OpenVidu Call, a ready-to-use videoconferencing application.
                                                                                                                                                                                                      • Observability: Grafana stack, which includes logs and monitoring stats.

                                                                                                                                                                                                    The rest of the parameters are secrets, usernames, and passwords. If empty, the wizard will generate random values for them.

                                                                                                                                                                                                    When the installation process finishes, you will see the following message:

                                                                                                                                                                                                    > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n>                                                                             <\n>  \ud83c\udf89 OpenVidu Community Installation Finished Successfully! \ud83c\udf89               <\n>                                                                             <\n> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <\n

                                                                                                                                                                                                    OpenVidu will be installed at /opt/openvidu and configured as a systemd service. You can start the service with the following command:

                                                                                                                                                                                                    systemctl start openvidu\n

                                                                                                                                                                                                    If everything goes well, all containers will be up and running without restarts, and you will be able to access any of the following services:

                                                                                                                                                                                                    • OpenVidu Call (Default Application): https://openvidu.example.io/
                                                                                                                                                                                                    • OpenVidu Dashboard: https://openvidu.example.io/dashboard
                                                                                                                                                                                                    • MinIO: https://openvidu.example.io/minio-console
                                                                                                                                                                                                    • Grafana: https://openvidu.example.io/grafana
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#configure-your-application-to-use-the-deployment","title":"Configure your Application to use the Deployment","text":"

                                                                                                                                                                                                    To point your applications to your OpenVidu deployment, check the file at /opt/openvidu/.env. All access credentials of all services are defined in this file.

                                                                                                                                                                                                    Your authentication credentials and URLs to point your applications to are:

                                                                                                                                                                                                    • URL: The value in .env of DOMAIN_OR_PUBLIC_IP as a URL. It could be wss://openvidu.example.io/ or https://openvidu.example.io/ depending on the SDK you are using.
                                                                                                                                                                                                    • API Key: The value in .env of LIVEKIT_API_KEY
                                                                                                                                                                                                    • API Secret: The value in .env of LIVEKIT_API_SECRET
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#non-interactive-installation","title":"Non-interactive installation","text":"

                                                                                                                                                                                                    If you want to automate the installation process, you can generate a command with all the parameters needed to install OpenVidu by answering the wizard questions. You can do this by running the following command:

                                                                                                                                                                                                    docker run --pull always --rm -it \\\n    openvidu/openvidu-installer:latest \\\n    --deployment-type=single_node\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    This is going to generate a command like this, but it may vary depending on the answers you provide. Here are three examples of the command you can run depending on the certificate type you choose:

                                                                                                                                                                                                    Let's Encrypt certificatesSelf-signed certificatesCustom certificates

                                                                                                                                                                                                    Example using Let's Encrypt certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='letsencrypt' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Example using self-signed certificates:

                                                                                                                                                                                                    sh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='selfsigned' \\\n    --letsencrypt-email='example@example.io'\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    Example using custom certificates:

                                                                                                                                                                                                    CERT_PRIVATE_KEY=$(cat privkey.pem | base64 -w 0)\nCERT_PUBLIC_KEY=$(cat fullchain.pem | base64 -w 0)\n\n# Optional, only if you want to enable TURN with TLS\nCERT_TURN_PRIVATE_KEY=$(cat turn-privkey.pem | base64 -w 0)\nCERT_TURN_PUBLIC_KEY=$(cat turn-fullchain.pem | base64 -w 0)\n\nsh <(curl -fsSL http://get.openvidu.io/community/singlenode/latest/install.sh) \\\n    --no-tty --install \\\n    --domain-name='openvidu.example.io' \\\n    --enabled-modules='observability,app' \\\n    --turn-domain-name='turn.example.io' \\\n    --livekit-api-key='xxxxx' \\\n    --livekit-api-secret='xxxxx' \\\n    --dashboard-admin-user='xxxxx' \\\n    --dashboard-admin-password='xxxxx' \\\n    --redis-password='xxxxx' \\\n    --minio-access-key='xxxxx' \\\n    --minio-secret-key='xxxxx' \\\n    --mongo-admin-user='xxxxx' \\\n    --mongo-admin-password='xxxxx' \\\n    --grafana-admin-user='xxxxx' \\\n    --grafana-admin-password='xxxxx' \\\n    --default-app-user='xxxxx' \\\n    --default-app-password='xxxxx' \\\n    --default-app-admin-user='xxxxx' \\\n    --default-app-admin-password='xxxxx' \\\n    --certificate-type='owncert' \\\n    --owncert-private-key=\"$CERT_PRIVATE_KEY\" \\\n    --owncert-public-key=\"$CERT_PUBLIC_KEY\" \\\n    --turn-owncert-private-key=\"$CERT_TURN_PRIVATE_KEY\" \\\n    --turn-owncert-public-key=\"$CERT_TURN_PUBLIC_KEY\"\n

                                                                                                                                                                                                    Note

                                                                                                                                                                                                    In case you want to deploy a specific version, just replace latest with the desired version. For example: 3.0.0.

                                                                                                                                                                                                    • Note that you just need to pass --owncert-private-key and --owncert-public-key with the content of the private and public key files in base64 format. The installation script will decode them and save them in the proper files.
                                                                                                                                                                                                    • --turn-owncert-private-key and --turn-owncert-public-key are optional. You only need to pass them if you want to enable TURN with TLS.

                                                                                                                                                                                                    You can run that command in a CI/CD pipeline or in a script to automate the installation process.

                                                                                                                                                                                                    Some notes about the command:

                                                                                                                                                                                                    • The argument --turn-domain-name is optional. You define it only if you want to enable TURN with TLS in case users are behind restrictive firewalls.
                                                                                                                                                                                                    • In the argument --enabled-modules, you can enable the modules you want to deploy. You can enable observability (Grafana stack) and app (Default App - OpenVidu Call).
                                                                                                                                                                                                    • If no media appears in your conference, reinstall specifying the --public-ip parameter with your machine's public IP. OpenVidu usually auto-detects the public IP, but it can fail. This IP is used by clients to send and receive media.

                                                                                                                                                                                                    To start OpenVidu, remember to run:

                                                                                                                                                                                                    systemctl start openvidu\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/self-hosting/single-node/on-premises/install/#configuration-and-administration","title":"Configuration and administration","text":"

                                                                                                                                                                                                    Once you have OpenVidu deployed, you can check the Administration section to learn how to manage your OpenVidu Single Node deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/","title":"Advanced Features Tutorials","text":"

                                                                                                                                                                                                    Explore more advanced features of LiveKit! For now, we have implemented a basic recording tutorial and an advanced one, but our tutorials for streaming and ingesting are coming soon.

                                                                                                                                                                                                    Recording Basic

                                                                                                                                                                                                    Recording Advanced

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/","title":"Advanced Recording Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial improves the basic recording tutorial by doing the following:

                                                                                                                                                                                                    • Complete recording metadata: Listen to webhook events and save all necessary metadata in a separate file.
                                                                                                                                                                                                    • Real time recording status notification: Implement a custom notification system to inform participants about the recording status by listening to webhook events and updating room metadata.
                                                                                                                                                                                                    • Recording deletion notification: Implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.
                                                                                                                                                                                                    • Direct access to recording files: Add an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#3-run-the-application","title":"3. Run the application","text":"

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-advanced-node\n
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    npm install\n
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Limitation: Playing recordings with the S3 strategy from other devices in your local network is not possible due to MinIO not being exposed. To play recordings from other devices, you need to change the environment variable RECORDING_PLAYBACK_STRATEGY to PROXY.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#enhancements","title":"Enhancements","text":""},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#refactoring-backend","title":"Refactoring backend","text":"

                                                                                                                                                                                                    The backend has been refactored to prevent code duplication and improve readability. The main changes are:

                                                                                                                                                                                                    • Endpoints have been moved to the controllers folder, creating a controller for each set of related endpoints:

                                                                                                                                                                                                      • RoomController for the room creation endpoint.
                                                                                                                                                                                                      • RecordingController for the recording endpoints.
                                                                                                                                                                                                      • WebhookController for the webhook endpoint.
                                                                                                                                                                                                    • The index.js file now simply sets the route for each controller:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      app.use(\"/token\", roomController);\napp.use(\"/recordings\", recordingController);\napp.use(\"/livekit/webhook\", webhookController);\n
                                                                                                                                                                                                    • The configuration of environment variables and constants has been moved to the config.js file:

                                                                                                                                                                                                      config.js
                                                                                                                                                                                                      export const SERVER_PORT = process.env.SERVER_PORT || 6080;\nexport const APP_NAME = \"openvidu-recording-advanced-node\";\n\n// LiveKit configuration\nexport const LIVEKIT_URL = process.env.LIVEKIT_URL || \"http://localhost:7880\";\nexport const LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\";\nexport const LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\";\n\n// S3 configuration\nexport const S3_ENDPOINT = process.env.S3_ENDPOINT || \"http://localhost:9000\";\nexport const S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || \"minioadmin\";\nexport const S3_SECRET_KEY = process.env.S3_SECRET_KEY || \"minioadmin\";\nexport const AWS_REGION = process.env.AWS_REGION || \"us-east-1\";\nexport const S3_BUCKET = process.env.S3_BUCKET || \"openvidu\";\n\nexport const RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? \"recordings/\";\nexport const RECORDINGS_METADATA_PATH = \".metadata/\";\nexport const RECORDING_PLAYBACK_STRATEGY = process.env.RECORDING_PLAYBACK_STRATEGY || \"S3\"; // PROXY or S3\nexport const RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // 5MB\n
                                                                                                                                                                                                    • Operations of the EgressClient and functions related to recording management have been moved to the RecordingService class within the services folder.

                                                                                                                                                                                                    After refactoring and implementing the improvements, the backend of the application has the following structure:

                                                                                                                                                                                                    src\n\u251c\u2500\u2500 controllers\n\u2502   \u251c\u2500\u2500 recording.controller.js\n\u2502   \u251c\u2500\u2500 room.controller.js\n\u2502   \u2514\u2500\u2500 webhook.controller.js\n\u251c\u2500\u2500 services\n\u2502   \u251c\u2500\u2500 recording.service.js\n\u2502   \u251c\u2500\u2500 room.service.js\n\u2502   \u2514\u2500\u2500 s3.service.js\n\u251c\u2500\u2500 config.js\n\u251c\u2500\u2500 index.js\n

                                                                                                                                                                                                    Where room.service.js defines the RoomService class, that contains the logic to manage rooms using the RoomServiceClient.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#adding-room-metadata","title":"Adding room metadata","text":"

                                                                                                                                                                                                    In order to store the recording status in the room metadata, we have to create the room explicitly the first time a user joins it, setting the metadata field with an object that contains the recording status. This object also contains the app name, which is used to identify webhook events related to the application. This is done in the POST /token endpoint:

                                                                                                                                                                                                    room.controller.js
                                                                                                                                                                                                    roomController.post(\"/\", async (req, res) => {\n    const roomName = req.body.roomName;\n    const participantName = req.body.participantName;\n\n    if (!roomName || !participantName) {\n        res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n        return;\n    }\n\n    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {\n        identity: participantName\n    });\n    at.addGrant({ room: roomName, roomJoin: true, roomRecord: true });\n    const token = await at.toJwt();\n\n    try {\n        // Create room if it doesn't exist\n        const exists = await roomService.exists(roomName); // (1)!\n\n        if (!exists) {\n            await roomService.createRoom(roomName); // (2)!\n        }\n\n        res.json({ token });\n    } catch (error) {\n        console.error(\"Error creating room.\", error);\n        res.status(500).json({ errorMessage: \"Error creating room\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the room exists.
                                                                                                                                                                                                    2. Create the room if it doesn't exist.

                                                                                                                                                                                                    After generating the access token with the required permissions, this endpoint does the following:

                                                                                                                                                                                                    1. Checks if the room exists by calling the exists method of the RoomService with the roomName as a parameter. This method returns a boolean indicating whether the room obtained from the getRoom method is not null. This other method lists all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter, and returns the first element of the list if it exists:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async getRoom(roomName) {\n    const rooms = await this.roomClient.listRooms([roomName]); // (1)!\n    return rooms.length > 0 ? rooms[0] : null; // (2)!\n}\n\nasync exists(roomName) {\n    const room = await this.getRoom(roomName);\n    return room !== null;\n}\n
                                                                                                                                                                                                      1. List all active rooms that match the roomName by calling the listRooms method of the RoomServiceClient with an array containing the roomName as a parameter.
                                                                                                                                                                                                      2. Return the first element of the list if it exists.
                                                                                                                                                                                                    2. Creates the room if it doesn't exist by calling the createRoom method of the RoomService with the roomName as a parameter. This method creates a room with the roomName and sets the metadata field with an object that contains the app name (defined in the config.js file) and the recording status initialized to STOPPED. To achieve this, the method calls the createRoom method of the RoomServiceClient with an object indicating the room name and metadata:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async createRoom(roomName) {\n    const roomOptions = {\n        name: roomName,\n        metadata: JSON.stringify({\n            createdBy: APP_NAME, // (1)!\n            recordingStatus: \"STOPPED\" // (2)!\n        })\n    };\n    return this.roomClient.createRoom(roomOptions); // (3)!\n}\n
                                                                                                                                                                                                      1. Set the app name.
                                                                                                                                                                                                      2. Set the recording status to STOPPED.
                                                                                                                                                                                                      3. Create the room with the roomOptions object by calling the createRoom method of the RoomServiceClient.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#handling-webhook-events","title":"Handling webhook events","text":"

                                                                                                                                                                                                    In previous tutorials, we listened to all webhook events and printed them in the console without doing anything else. In this tutorial, we have to first check if the webhook is related to the application and then act accordingly depending on the event type. This is done in the POST /livekit/webhook endpoint:

                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    webhookController.post(\"/\", async (req, res) => {\n    try {\n        const webhookEvent = await webhookReceiver.receive(req.body, req.get(\"Authorization\"));\n        const isWebhookRelatedToMe = await checkWebhookRelatedToMe(webhookEvent); // (1)!\n\n        if (isWebhookRelatedToMe) {\n            console.log(webhookEvent);\n            const { event: eventType, egressInfo } = webhookEvent; // (2)!\n\n            switch (eventType) {\n                case \"egress_started\": // (3)!\n                case \"egress_updated\":\n                    await notifyRecordingStatusUpdate(egressInfo);\n                    break;\n                case \"egress_ended\": // (4)!\n                    await handleEgressEnded(egressInfo);\n                    break;\n            }\n        }\n    } catch (error) {\n        console.error(\"Error validating webhook event.\", error);\n    }\n\n    res.status(200).send();\n});\n
                                                                                                                                                                                                    1. Check if the webhook is related to the application.
                                                                                                                                                                                                    2. Destructure the event type and egress info from the webhook event.
                                                                                                                                                                                                    3. If the event type is egress_started or egress_updated, notify the recording status update.
                                                                                                                                                                                                    4. If the event type is egress_ended, handle the egress ended.

                                                                                                                                                                                                    After receiving the webhook event, this endpoint does the following:

                                                                                                                                                                                                    1. Checks if the webhook is related to the application by calling the checkWebhookRelatedToMe function with the webhook event as a parameter. This function returns a boolean indicating whether the app name obtained from the metadata field of the room related to the webhook event is equal to the app name defined in the config.js file:

                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      const checkWebhookRelatedToMe = async (webhookEvent) => {\n    const { room, egressInfo, ingressInfo } = webhookEvent; // (1)!\n    let roomInfo = room;\n    // (2)!\n    if (!room || !room.metadata) {\n        const roomName = room?.name ?? egressInfo?.roomName ?? ingressInfo?.roomName; // (3)!\n        roomInfo = await roomService.getRoom(roomName); // (4)!\n\n        if (!roomInfo) {\n            return false;\n        }\n    }\n\n    const metadata = roomInfo.metadata ? JSON.parse(roomInfo.metadata) : null; // (5)!\n    return metadata?.createdBy === APP_NAME; // (6)!\n};\n
                                                                                                                                                                                                      1. Destructure the room, egress info, and ingress info from the webhook event.
                                                                                                                                                                                                      2. Check if the room and metadata fields exist.
                                                                                                                                                                                                      3. If the room or metadata fields don't exist, get the room name from the room, egress info, or ingress info.
                                                                                                                                                                                                      4. Get the room info by calling the getRoom method of the RoomService with the roomName as a parameter.
                                                                                                                                                                                                      5. Parse the metadata field of the room info.
                                                                                                                                                                                                      6. Return whether the app name is equal to the app name defined in the config.js file.
                                                                                                                                                                                                    2. Destructures the event type and egress info from the webhook event.

                                                                                                                                                                                                    3. If the event type is egress_started or egress_updated, calls the notifyRecordingStatusUpdate function with the egress info as a parameter. This function notifies all participants in the room related to the egress info about the recording status update. See the Notifying recording status update section for more information.

                                                                                                                                                                                                    4. If the event type is egress_ended, calls the handleEgressEnded function with the egress info as a parameter. This function saves the recording metadata in a separate file (see the Saving recording metadata section) and notifies all participants in the room related to the egress info that the recording has been stopped:

                                                                                                                                                                                                      webhook.controller.js
                                                                                                                                                                                                      const handleEgressEnded = async (egressInfo) => {\n    try {\n        await recordingService.saveRecordingMetadata(egressInfo); // (1)!\n    } catch (error) {\n        console.error(\"Error saving recording metadata.\", error);\n    }\n\n    await notifyRecordingStatusUpdate(egressInfo); // (2)!\n};\n
                                                                                                                                                                                                      1. Save the recording metadata.
                                                                                                                                                                                                      2. Notify all participants in the room that the recording has been stopped.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#notifying-recording-status-update","title":"Notifying recording status update","text":"

                                                                                                                                                                                                    When the recording status changes, all participants in the room have to be notified. This is done by updating the metadata field of the room with the new recording status, which will trigger the RoomEvent.RoomMetadataChanged event in the client side. This is implemented in the notifyRecordingStatusUpdate function:

                                                                                                                                                                                                    webhook.controller.js
                                                                                                                                                                                                    const notifyRecordingStatusUpdate = async (egressInfo) => {\n    const roomName = egressInfo.roomName; // (1)!\n    const recordingStatus = recordingService.getRecordingStatus(egressInfo.status); // (2)!\n\n    try {\n        await roomService.updateRoomMetadata(roomName, recordingStatus); // (3)!\n    } catch (error) {\n        console.error(\"Error updating room metadata.\", error);\n    }\n};\n
                                                                                                                                                                                                    1. Get the room name from the egress info.
                                                                                                                                                                                                    2. Get the recording status from the egress info status.
                                                                                                                                                                                                    3. Update the room metadata with the new recording status.

                                                                                                                                                                                                    After getting the room name from the egress info, this function does the following:

                                                                                                                                                                                                    1. Gets the recording status by calling the getRecordingStatus method of the RecordingService with the egress info status as a parameter. This method returns the recording status based on the egress info status:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getRecordingStatus(egressStatus) {\n    switch (egressStatus) {\n        case EgressStatus.EGRESS_STARTING:\n            return \"STARTING\";\n        case EgressStatus.EGRESS_ACTIVE:\n            return \"STARTED\";\n        case EgressStatus.EGRESS_ENDING:\n            return \"STOPPING\";\n        case EgressStatus.EGRESS_COMPLETE:\n            return \"STOPPED\";\n        default:\n            return \"FAILED\";\n    }\n}\n

                                                                                                                                                                                                      We distinguish between the following recording statuses:

                                                                                                                                                                                                      • STARTING: The recording is starting.
                                                                                                                                                                                                      • STARTED: The recording is active.
                                                                                                                                                                                                      • STOPPING: The recording is stopping.
                                                                                                                                                                                                      • STOPPED: The recording has stopped.
                                                                                                                                                                                                      • FAILED: The recording has failed.
                                                                                                                                                                                                    2. Updates the room metadata with the new recording status by calling the updateRoomMetadata method of the RoomService with the roomName and recordingStatus as parameters. This method updates the metadata field of the room with an object that contains the app name and the new recording status by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters:

                                                                                                                                                                                                      room.service.js
                                                                                                                                                                                                      async updateRoomMetadata(roomName, recordingStatus) {\n    const metadata = {\n        createdBy: APP_NAME,\n        recordingStatus // (1)!\n    };\n    return this.roomClient.updateRoomMetadata(roomName, JSON.stringify(metadata)); // (2)!\n}\n
                                                                                                                                                                                                      1. Update the recording status.
                                                                                                                                                                                                      2. Update the room metadata with the new metadata by calling the updateRoomMetadata method of the RoomServiceClient with the roomName and a stringified object as parameters.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#saving-recording-metadata","title":"Saving recording metadata","text":"

                                                                                                                                                                                                    When the recording ends, the metadata related to the recording has to be saved in a separate file. This is done in the saveRecordingMetadata function:

                                                                                                                                                                                                    recording.service.js
                                                                                                                                                                                                    async saveRecordingMetadata(egressInfo) {\n    const recordingInfo = this.convertToRecordingInfo(egressInfo); // (1)!\n    const key = this.getMetadataKey(recordingInfo.name); // (2)!\n    await s3Service.uploadObject(key, recordingInfo); // (3)!\n}\n
                                                                                                                                                                                                    1. Convert the egress info to a recording info object.
                                                                                                                                                                                                    2. Get the metadata key from the recording info name.
                                                                                                                                                                                                    3. Upload the recording metadata to the S3 bucket.

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    1. Converts the egress info to a recording info object by calling the convertToRecordingInfo method:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      convertToRecordingInfo(egressInfo) {\n    const file = egressInfo.fileResults[0];\n    return {\n        id: egressInfo.egressId,\n        name: file.filename.split(\"/\").pop(),\n        roomName: egressInfo.roomName,\n        roomId: egressInfo.roomId,\n        startedAt: Number(egressInfo.startedAt) / 1_000_000,\n        duration: Number(file.duration) / 1_000_000_000,\n        size: Number(file.size)\n    };\n}\n

                                                                                                                                                                                                      Getting recording metadata

                                                                                                                                                                                                      In this tutorial, we can access detailed information about the recording directly from the metadata file stored in the S3 bucket, without needing to make additional requests. This is made possible by saving all the necessary data retrieved from the egress info object. Compared to the basic recording tutorial, we are now storing additional details such as the recording name, duration and size.

                                                                                                                                                                                                    2. Gets the metadata key from the recordings path and the recordings metadata path, both defined in the config.js file, and the recording name replacing the .mp4 extension with .json:

                                                                                                                                                                                                      recording.service.js
                                                                                                                                                                                                      getMetadataKey(recordingName) {\n    return RECORDINGS_PATH + RECORDINGS_METADATA_PATH + recordingName.replace(\".mp4\", \".json\");\n}\n
                                                                                                                                                                                                    3. Uploads the recording metadata to the S3 bucket by calling the uploadObject method of the S3Service with the key and recordingInfo as parameters. This method uploads an object to the S3 bucket by sending a PutObjectCommand with the key and the stringified object as parameters:

                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      async uploadObject(key, body) {\n    const params = {\n        Bucket: S3_BUCKET,\n        Key: key,\n        Body: JSON.stringify(body)\n    };\n    const command = new PutObjectCommand(params);\n    return this.run(command);\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#notifying-recording-deletion","title":"Notifying recording deletion","text":"

                                                                                                                                                                                                    When a recording is deleted, all participants in the room have to be notified. This is done by sending a data message to all participants in the room. To achieve this, the DELETE /recordings/:recordingName endpoint has been modified as follows:

                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.delete(\"/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const exists = await recordingService.existsRecording(recordingName);\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        const { roomName } = await recordingService.getRecordingMetadata(recordingName); // (1)!\n        await recordingService.deleteRecording(recordingName);\n\n        // Notify to all participants that the recording was deleted\n        const existsRoom = await roomService.exists(roomName); // (2)!\n\n        if (existsRoom) {\n            await roomService.sendDataToRoom(roomName, { recordingName }); // (3)!\n        }\n\n        res.json({ message: \"Recording deleted\" });\n    } catch (error) {\n        console.error(\"Error deleting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error deleting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Get the room name from the recording metadata.
                                                                                                                                                                                                    2. Check if the room exists.
                                                                                                                                                                                                    3. Send a data message to the room indicating that the recording was deleted.

                                                                                                                                                                                                    Before deleting the recording, we get the room name from the recording metadata. After deleting the recording, we check if the room exists and, if it does, send a data message to the room indicating that the recording was deleted. This is done by calling the sendDataToRoom method of the RoomService with the roomName and an object containing the recordingName as parameters:

                                                                                                                                                                                                    room.service.js
                                                                                                                                                                                                    async sendDataToRoom(roomName, rawData) {\n    const data = encoder.encode(JSON.stringify(rawData)); // (1)!\n    const options = {\n        topic: \"RECORDING_DELETED\", // (2)!\n        destinationSids: [] // (3)!\n    };\n\n    try {\n        await this.roomClient.sendData(roomName, data, DataPacket_Kind.RELIABLE, options); // (4)!\n    } catch (error) {\n        console.error(\"Error sending data to room\", error);\n    }\n}\n
                                                                                                                                                                                                    1. Encodes the raw data.
                                                                                                                                                                                                    2. Sets the topic to RECORDING_DELETED.
                                                                                                                                                                                                    3. Sets the destination SIDs to an empty array (all participants in the room).
                                                                                                                                                                                                    4. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters.

                                                                                                                                                                                                    This method does the following:

                                                                                                                                                                                                    1. Encodes the raw data by calling the encode method of the TextEncoder with the stringified raw data as a parameter.
                                                                                                                                                                                                    2. Sets the topic of the data message to RECORDING_DELETED.
                                                                                                                                                                                                    3. Sets the destination SIDs to an empty array, which means that the message will be sent to all participants in the room.
                                                                                                                                                                                                    4. Sends the data message to the room by calling the sendData method of the RoomServiceClient with the roomName, data, DataPacket_Kind.RELIABLE and options as parameters. The DataPacket_Kind.RELIABLE parameter indicates that the message will be sent reliably.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#accessing-recording-files-directly-from-the-s3-bucket","title":"Accessing recording files directly from the S3 bucket","text":"

                                                                                                                                                                                                    In this tutorial, we have added an additional method to allow access to recording files directly from the S3 bucket by creating a presigned URL. To accomplish this, we have created a new endpoint (GET /recordings/:recordingName/url) to get the recording URL depending on the playback strategy defined in the environment variable RECORDING_PLAYBACK_STRATEGY, whose value can be PROXY or S3:

                                                                                                                                                                                                    recording.controller.js
                                                                                                                                                                                                    recordingController.get(\"/:recordingName/url\", async (req, res) => {\n    const { recordingName } = req.params;\n    const exists = await recordingService.existsRecording(recordingName); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    // If the recording playback strategy is \"PROXY\", return the endpoint URL\n    if (RECORDING_PLAYBACK_STRATEGY === \"PROXY\") {\n        res.json({ recordingUrl: `/recordings/${recordingName}` }); // (2)!\n        return;\n    }\n\n    try {\n        // If the recording playback strategy is \"S3\", return a signed URL to access the recording directly from S3\n        const recordingUrl = await recordingService.getRecordingUrl(recordingName); // (3)!\n        res.json({ recordingUrl });\n    } catch (error) {\n        console.error(\"Error getting recording URL.\", error);\n        res.status(500).json({ errorMessage: \"Error getting recording URL\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists.
                                                                                                                                                                                                    2. Return the GET /recordings/:recordingName endpoint URL if the playback strategy is PROXY.
                                                                                                                                                                                                    3. Create a presigned URL to access the recording directly from the S3 bucket if the playback strategy is S3.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists. If it does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. If the playback strategy is PROXY, it returns the GET /recordings/:recordingName endpoint URL to get the recording file from the backend.
                                                                                                                                                                                                    4. If the playback strategy is S3, it creates a presigned URL to access the recording directly from the S3 bucket by calling the getRecordingUrl method of the RecordingService with the recordingName as a parameter. This method simply calls the getObjectUrl method of the S3Service with the key of the recording as a parameter:

                                                                                                                                                                                                      s3.service.js
                                                                                                                                                                                                      async getObjectUrl(key) {\n    const params = {\n        Bucket: S3_BUCKET,\n        Key: key\n    };\n    const command = new GetObjectCommand(params);\n    return getSignedUrl(this.s3Client, command, { expiresIn: 86400 }); // 24 hours\n}\n

                                                                                                                                                                                                      This method creates a presigned URL to access the object in the S3 bucket by calling the getSignedUrl function from the @aws-sdk/s3-request-presigner package, indicating the S3Client, GetObjectCommand and the expiration time in seconds as parameters. In this case, the expiration time is set to 24 hours.

                                                                                                                                                                                                      Presigned URLs

                                                                                                                                                                                                      Presigned URLs are URLs that provide access to an S3 object for a limited time. This is useful when you want to share an object with someone for a limited time without providing them with your AWS credentials.

                                                                                                                                                                                                      Compared to the proxy strategy, accessing recording files directly from the S3 bucket via presigned URLs is more efficient, as it reduces server load. However, it presents a security risk, as the URL, once generated, can be used by anyone until it expires.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-advanced/#handling-new-room-events-in-the-client-side","title":"Handling new room events in the client side","text":"

                                                                                                                                                                                                    In the client side, we have to handle the new room events related to the recording status and the recording deletion. This is done by listening to the RoomEvent.RoomMetadataChanged and RoomEvent.DataReceived events in the joinRoom method:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // ...\n    // When recording status changes...\n    room.on(LivekitClient.RoomEvent.RoomMetadataChanged, async (metadata) => {\n        const { recordingStatus } = JSON.parse(metadata);\n        await updateRecordingInfo(recordingStatus);\n    });\n\n    // When a message is received...\n    room.on(LivekitClient.RoomEvent.DataReceived, async (payload, _participant, _kind, topic) => {\n        // If the message is a recording deletion notification, remove the recording from the list\n        if (topic === \"RECORDING_DELETED\") {\n            const { recordingName } = JSON.parse(new TextDecoder().decode(payload));\n            deleteRecordingContainer(recordingName);\n        }\n    });\n    // ...\n}\n

                                                                                                                                                                                                    When a new RoomEvent.RoomMetadataChanged event is received, we parse the metadata to get the recording status and update the recording info accordingly. The updateRecordingInfo function has been updated to handle the new recording statuses.

                                                                                                                                                                                                    In addition to handling this event, we need to update the recording info in the UI the first time a user joins the room. Once the user has joined, we retrieve the current room metadata and update the UI accordingly. Recordings will be listed unless the recording status is STOPPED or FAILED, to prevent listing recordings twice:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // ...\n    // Update recording info\n    const { recordingStatus } = JSON.parse(room.metadata);\n    await updateRecordingInfo(recordingStatus);\n\n    if (recordingStatus !== \"STOPPED\" && recordingStatus !== \"FAILED\") {\n        const roomId = await room.getSid();\n        await listRecordings(room.name, roomId);\n    }\n    // ...\n}\n

                                                                                                                                                                                                    When a new RoomEvent.DataReceived event is received, we check if the topic of the message is RECORDING_DELETED. If it is, we decode the payload using a TextDecoder and parse the message to get the recording name. Then, we remove the recording from the list by calling the deleteRecordingContainer function.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/","title":"Basic Recording Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application, built upon Node.js server and JavaScript client tutorials, and extends them by adding recording capabilities:

                                                                                                                                                                                                    • Start and stop recording a room.
                                                                                                                                                                                                    • List all recordings in a room.
                                                                                                                                                                                                    • Play a recording.
                                                                                                                                                                                                    • Delete a recording.
                                                                                                                                                                                                    • List all available recordings and filter them by room name.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#3-run-the-application","title":"3. Run the application","text":"

                                                                                                                                                                                                    To run this application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the application directory
                                                                                                                                                                                                    cd openvidu-livekit-tutorials/advanced-features/openvidu-recording-basic-node\n
                                                                                                                                                                                                    1. Install dependencies
                                                                                                                                                                                                    npm install\n
                                                                                                                                                                                                    1. Run the application
                                                                                                                                                                                                    npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:6080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:6443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This application consists of two essential backend files under the src directory:

                                                                                                                                                                                                    • index.js: This file holds the server application and defines the REST API endpoints.
                                                                                                                                                                                                    • s3.service.js: This file encapsulates the operations to interact with the S3 bucket.

                                                                                                                                                                                                    And the following essential frontend files under the public directory:

                                                                                                                                                                                                    • index.html: This is the client application's main HTML file.
                                                                                                                                                                                                    • app.js: This is the main JavaScript file that interacts with the server application and handles the client application's logic and functionality.
                                                                                                                                                                                                    • style.css: This file contains the client application's styling.
                                                                                                                                                                                                    • recordings.html: This file defines the HTML for the general recording page.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#backend","title":"Backend","text":"

                                                                                                                                                                                                    The server application extends the Node.js server tutorial by adding the following REST API endpoints:

                                                                                                                                                                                                    • POST /recordings/start: Starts the recording of a room.
                                                                                                                                                                                                    • POST /recordings/stop: Stops the recording of a room.
                                                                                                                                                                                                    • GET /recordings: Lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID.
                                                                                                                                                                                                    • GET /recordings/:recordingName: Retrieves a recording from the S3 bucket and returns it as a stream.
                                                                                                                                                                                                    • DELETE /recordings/:recordingName: This endpoint deletes a recording from the S3 bucket.

                                                                                                                                                                                                    Before we dive into the code of each endpoint, let's first see the changes introduced in the index.js file:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const SERVER_PORT = process.env.SERVER_PORT || 6080;\n\n// LiveKit configuration\nconst LIVEKIT_URL = process.env.LIVEKIT_URL || \"http://localhost:7880\"; // (1)!\nconst LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\";\nconst LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\";\n\nconst RECORDINGS_PATH = process.env.RECORDINGS_PATH ?? \"recordings/\"; // (2)!\nconst RECORDING_FILE_PORTION_SIZE = 5 * 1024 * 1024; // (3)!\n\nconst app = express();\n\napp.use(cors());\napp.use(express.json());\napp.use(express.raw({ type: \"application/webhook+json\" }));\n\n// Set the static files location\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\napp.use(express.static(path.join(__dirname, \"../public\"))); // (4)!\n
                                                                                                                                                                                                    1. The URL of the LiveKit server.
                                                                                                                                                                                                    2. The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    3. The portion size of the recording that will be sent to the client in each request. This value is set to 5 MB.
                                                                                                                                                                                                    4. Set the public directory as the static files location.

                                                                                                                                                                                                    There are three new environment variables:

                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server.
                                                                                                                                                                                                    • RECORDINGS_PATH: The path where recordings will be stored in the S3 bucket.
                                                                                                                                                                                                    • RECORDING_FILE_PORTION_SIZE: The portion size of the recording that will be sent to the client in each request.

                                                                                                                                                                                                    Besides, the index.js file configures the server to serve static files from the public directory.

                                                                                                                                                                                                    It also initializes the EgressClient, which will help interacting with Egress API to manage recordings, and the S3Service, which will help interacting with the S3 bucket:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const egressClient = new EgressClient(LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET);\nconst s3Service = new S3Service();\n

                                                                                                                                                                                                    The POST /token endpoint has been modified to add the roomRecord permission to the access token, so that participants can start recording a room:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/token\", async (req, res) => {\n    const roomName = req.body.roomName;\n    const participantName = req.body.participantName;\n\n    if (!roomName || !participantName) {\n        res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n        return;\n    }\n\n    const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, {\n        identity: participantName\n    });\n    at.addGrant({ roomJoin: true, room: roomName, roomRecord: true }); // (1)!\n    const token = await at.toJwt();\n    res.json({ token });\n});\n
                                                                                                                                                                                                    1. Add the roomRecord permission to the access token.

                                                                                                                                                                                                    Now let's explore the code for each recording feature:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#start-recording","title":"Start recording","text":"

                                                                                                                                                                                                    The POST /recordings/start endpoint starts the recording of a room. It receives the room name of the room to record as parameter and returns the recording metadata:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/recordings/start\", async (req, res) => {\n    const { roomName } = req.body;\n\n    if (!roomName) {\n        res.status(400).json({ errorMessage: \"roomName is required\" });\n        return;\n    }\n\n    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!\n\n    // Check if there is already an active recording for this room\n    if (activeRecording) {\n        res.status(409).json({ errorMessage: \"Recording already started for this room\" }); // (2)!\n        return;\n    }\n\n    // Use the EncodedFileOutput to save the recording to an MP4 file\n    // (3)!\n    const fileOutput = new EncodedFileOutput({\n        fileType: EncodedFileType.MP4, // (4)!\n        filepath: `${RECORDINGS_PATH}{room_name}-{room_id}-{time}` // (5)!\n    });\n\n    try {\n        // Start a RoomCompositeEgress to record all participants in the room\n        const egressInfo = await egressClient.startRoomCompositeEgress(roomName, { file: fileOutput }); // (6)!\n        const recording = {\n            name: egressInfo.fileResults[0].filename.split(\"/\").pop(), // (7)!\n            startedAt: Number(egressInfo.startedAt) / 1_000_000\n        };\n        res.json({ message: \"Recording started\", recording }); // (8)!\n    } catch (error) {\n        console.error(\"Error starting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error starting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. If there is already an active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    3. Use the EncodedFileOutput class to export the recording to an external file.
                                                                                                                                                                                                    4. Define the file type as MP4.
                                                                                                                                                                                                    5. Define the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID and timestamp, respectively. Check out all available filename templates.
                                                                                                                                                                                                    6. Start a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with the roomName and fileOutput as parameters.
                                                                                                                                                                                                    7. Extract the recording name from the fileResults array.
                                                                                                                                                                                                    8. Return the recording metadata to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. Check if there is already an active recording for the room. If there is, it returns a 409 error to prevent starting a new recording. To accomplish this, we use the getActiveRecordingByRoom function, which lists all active egresses for a specified room by calling the listEgress method of the EgressClient with the roomName and active parameters, and then returns the egress ID of the first active egress found:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getActiveRecordingByRoom = async (roomName) => {\n    try {\n        // List all active egresses for the room\n        const egresses = await egressClient.listEgress({ roomName, active: true });\n        return egresses.length > 0 ? egresses[0].egressId : null;\n    } catch (error) {\n        console.error(\"Error listing egresses.\", error);\n        return null;\n    }\n};\n
                                                                                                                                                                                                    3. Initializes an EncodedFileOutput object to export the recording to an external file. It sets the file type as MP4 and defines the file path where the recording will be stored. The {room_name}, {room_id}, and {time} templates will be replaced by the actual room name, room ID, and timestamp, respectively. Check out all available filename templates.

                                                                                                                                                                                                      Saving recording metadata

                                                                                                                                                                                                      The EncodedFileOutput class allows you to save the recording metadata to an external file. If you don't explicitly set the disableManifest property to true, the metadata will be saved in the same folder and with the same name as the recording file, but with a .json extension. This metadata file will contain information such as the egress ID, the recording start time, and the name and ID of the room recorded.

                                                                                                                                                                                                      This information may be insufficient depending on your requirements (e.g., you can't get the recording duration). If this is the case, you can follow the steps described in the advanced recording tutorial, where we show how to save all necessary metadata in a separate file listening to webhook events.

                                                                                                                                                                                                    4. Starts a RoomCompositeEgress to record all participants in the room by calling the startRoomCompositeEgress method of the EgressClient with roomName and fileOutput as parameters.

                                                                                                                                                                                                    5. Extracts the recording name from the fileResults array.
                                                                                                                                                                                                    6. Returns the recording metadata to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#stop-recording","title":"Stop recording","text":"

                                                                                                                                                                                                    The POST /recordings/stop endpoint stops the recording of a room. It receives the room name of the room to stop recording as a parameter and returns the updated recording metadata:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/recordings/stop\", async (req, res) => {\n    const { roomName } = req.body;\n\n    if (!roomName) {\n        res.status(400).json({ errorMessage: \"roomName is required\" });\n        return;\n    }\n\n    const activeRecording = await getActiveRecordingByRoom(roomName); // (1)!\n\n    // Check if there is an active recording for this room\n    if (!activeRecording) {\n        res.status(409).json({ errorMessage: \"Recording not started for this room\" }); // (2)!\n        return;\n    }\n\n    try {\n        // Stop the egress to finish the recording\n        const egressInfo = await egressClient.stopEgress(activeRecording); // (3)!\n        const file = egressInfo.fileResults[0];\n        const recording = {\n            name: file.filename.split(\"/\").pop(),\n            startedAt: Number(egressInfo.startedAt) / 1_000_000,\n            size: Number(file.size)\n        };\n        res.json({ message: \"Recording stopped\", recording }); // (4)!\n    } catch (error) {\n        console.error(\"Error stopping recording.\", error);\n        res.status(500).json({ errorMessage: \"Error stopping recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. The getActiveRecordingByRoom function retrieves the active recording for a room.
                                                                                                                                                                                                    2. If there is no active recording for the room, the server returns a 409 Conflict status code.
                                                                                                                                                                                                    3. Stop the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    4. Return the updated recording metadata to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Obtains the roomName parameter from the request body. If it is not available, it returns a 400 error.
                                                                                                                                                                                                    2. Retrieves all active egresses for the room. If there is no active egress for the room, it returns a 409 error to prevent stopping a non-existent recording.
                                                                                                                                                                                                    3. Extracts the egressId from the active egress.
                                                                                                                                                                                                    4. Stops the egress to finish the recording by calling the stopEgress method of the EgressClient with the egress ID (activeRecording) as a parameter.
                                                                                                                                                                                                    5. Returns the updated recording metadata to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#list-recordings","title":"List recordings","text":"

                                                                                                                                                                                                    The GET /recordings endpoint lists all recordings stored in the S3 bucket. This endpoint also allows filtering recordings by room name or room ID:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get(\"/recordings\", async (req, res) => {\n    const roomName = req.query.roomName?.toString();\n    const roomId = req.query.roomId?.toString();\n\n    try {\n        const keyStart = RECORDINGS_PATH + (roomName ? `${roomName}-` + (roomId ? roomId : \"\") : \"\"); // (1)!\n        const keyEnd = \".mp4.json\";\n        const regex = new RegExp(`^${keyStart}.*${keyEnd}$`); // (2)!\n\n        // List all egress metadata files in the recordings path that match the regex\n        const payloadKeys = await s3Service.listObjects(RECORDINGS_PATH, regex); // (3)!\n        const recordings = await Promise.all(payloadKeys.map((payloadKey) => getRecordingInfo(payloadKey))); // (4)!\n        const sortedRecordings = filterAndSortRecordings(recordings, roomName, roomId); // (5)!\n        res.json({ recordings: sortedRecordings }); // (6)!\n    } catch (error) {\n        console.error(\"Error listing recordings.\", error);\n        res.status(500).json({ errorMessage: \"Error listing recordings\" });\n    }\n});\n
                                                                                                                                                                                                    1. Define the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    2. Create a regex pattern with the start and end of the key.
                                                                                                                                                                                                    3. List all Egress metadata files in the recordings path in the S3 bucket that match the regex.
                                                                                                                                                                                                    4. Retrieve the recording metadata for each recording that matches the regex.
                                                                                                                                                                                                    5. Filter the recordings by room name and room ID and sort them by start time.
                                                                                                                                                                                                    6. Return the list of recordings to the client.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the roomName and roomId query parameters from the request.
                                                                                                                                                                                                    2. Defines the start of the key (path) depending on the roomName and roomId query parameters.
                                                                                                                                                                                                    3. Creates a regex pattern with the start and end of the key.
                                                                                                                                                                                                    4. Lists all Egress metadata files in the recordings path in the S3 bucket that match the regex. To accomplish this, we use the listObjects method of the S3Service with the RECORDINGS_PATH and regex as parameters.
                                                                                                                                                                                                    5. Retrieves the recording metadata for each recording that matches the regex. To accomplish this, we use the getRecordingInfo function, which retrieves the egress metadata file as JSON and the recording file size by calling the getObjectAsJson and getObjectSize methods of the S3Service, respectively. It then extracts the recording name from the recording key and returns the recording metadata:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingInfo = async (payloadKey) => {\n    // Get the egress metadata file as JSON\n    const data = await s3Service.getObjectAsJson(payloadKey); // (1)!\n\n    // Get the recording file size\n    const recordingKey = payloadKey.replace(\".json\", \"\");\n    const size = await s3Service.getObjectSize(recordingKey); // (2)!\n\n    const recordingName = recordingKey.split(\"/\").pop();\n    const recording = {\n        id: data.egress_id,\n        name: recordingName,\n        roomName: data.room_name,\n        roomId: data.room_id,\n        startedAt: Number(data.started_at) / 1000000,\n        size: size\n    };\n    return recording;\n};\n
                                                                                                                                                                                                      1. Get the egress metadata file as JSON.
                                                                                                                                                                                                      2. Get the recording file size.
                                                                                                                                                                                                    6. Filter the recordings by room name and room ID and sort them by start time. To accomplish this, we use the filterAndSortRecordings function:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const filterAndSortRecordings = (recordings, roomName, roomId) => {\n    let filteredRecordings = recordings;\n\n    if (roomName || roomId) {\n        filteredRecordings = recordings.filter((recording) => {\n            return (!roomName || recording.roomName === roomName) && (!roomId || recording.roomId === roomId); // (1)!\n        });\n    }\n\n    return filteredRecordings.sort((a, b) => b.startedAt - a.startedAt); // (2)!\n};\n
                                                                                                                                                                                                      1. Filter the recordings by room name and room ID if they are provided.
                                                                                                                                                                                                      2. Sort the recordings by start time in descending order.
                                                                                                                                                                                                    7. Returns the list of recordings to the client.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#get-recording","title":"Get recording","text":"

                                                                                                                                                                                                    The GET /recordings/:recordingName endpoint retrieves a specific portion of a recording from the S3 bucket and returns it as a stream. The server sends the recording file in portions of 5 MB each time the client requests a range of the recording file. This is done to prevent loading the entire recording file into memory and to allow the client to play the recording while it is being downloaded and seek to a specific time:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.get(\"/recordings/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const { range } = req.headers;\n    const key = RECORDINGS_PATH + recordingName;\n    const exists = await s3Service.exists(key); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        // Get the recording file from S3\n        const { stream, size, start, end } = await getRecordingStream(recordingName, range); // (2)!\n\n        // Set the response headers\n        res.status(206); // (3)!\n        res.setHeader(\"Cache-Control\", \"no-cache\"); // (4)!\n        res.setHeader(\"Content-Type\", \"video/mp4\"); // (5)!\n        res.setHeader(\"Accept-Ranges\", \"bytes\"); // (6)!\n        res.setHeader(\"Content-Range\", `bytes ${start}-${end}/${size}`); // (7)!\n        res.setHeader(\"Content-Length\", end - start + 1); // (8)!\n\n        // Pipe the recording file to the response\n        body.pipe(res).on(\"finish\", () => res.end()); // (9)!\n    } catch (error) {\n        console.error(\"Error getting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error getting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. Get the recording file from the S3 bucket.
                                                                                                                                                                                                    3. Set the response status code to 206 Partial Content.
                                                                                                                                                                                                    4. Set the Cache-Control header as no-cache.
                                                                                                                                                                                                    5. Set the Content-Type header as video/mp4.
                                                                                                                                                                                                    6. Set the Accept-Ranges header as bytes.
                                                                                                                                                                                                    7. Set the Content-Range header with the start and end of the recording file and its size.
                                                                                                                                                                                                    8. Set the Content-Length header as the size of the recording file portion.
                                                                                                                                                                                                    9. Pipe the recording file to the response.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. Gets the requested range of the recording file by calling the getRecordingStream function:

                                                                                                                                                                                                      index.js
                                                                                                                                                                                                      const getRecordingStream = async (recordingName, range) => {\n    const key = RECORDINGS_PATH + recordingName;\n    const size = await s3Service.getObjectSize(key); // (1)!\n\n    // Get the requested range\n    const parts = range?.replace(/bytes=/, \"\").split(\"-\");\n    const start = range ? parseInt(parts[0], 10) : 0; // (2)!\n    const endRange = parts[1] ? parseInt(parts[1], 10) : start + RECORDING_FILE_PORTION_SIZE; // (3)!\n    const end = Math.min(endRange, size - 1); // (4)!\n\n    const stream = await s3Service.getObject(key, { start, end }); // (5)!\n    return { stream, size, start, end };\n};\n
                                                                                                                                                                                                      1. Get the size of the recording file.
                                                                                                                                                                                                      2. Get the start of the requested range.
                                                                                                                                                                                                      3. Get the end of the requested range or set it to the start plus the established portion size.
                                                                                                                                                                                                      4. Get the minimum between the end of the requested range and the size of the recording file minus one.
                                                                                                                                                                                                      5. Get the recording file from the S3 bucket with the requested range.

                                                                                                                                                                                                      This function does the following:

                                                                                                                                                                                                      1. Gets the size of the recording file by calling the getObjectSize method of the S3Service with the key as a parameter.
                                                                                                                                                                                                      2. Extracts the start of the requested range from the range header.
                                                                                                                                                                                                      3. Extracts the end of the requested range from the range header. If the end is not provided, it sets the end to the start plus the established portion size.
                                                                                                                                                                                                      4. Gets the minimum between the end of the requested range and the size of the recording file minus one. This is done to prevent requesting a range that exceeds the recording file size.
                                                                                                                                                                                                      5. Gets the recording file from the S3 bucket with the requested range by calling the getObject method of the S3Service with the key and range as parameters.
                                                                                                                                                                                                    4. Sets the response headers:

                                                                                                                                                                                                      • Cache-Control: no-cache.
                                                                                                                                                                                                      • Content-Type: video/mp4.
                                                                                                                                                                                                      • Accept-Ranges: bytes.
                                                                                                                                                                                                      • Content-Range: The start and end of the recording file and its size.
                                                                                                                                                                                                      • Content-Length: The size of the recording file portion.
                                                                                                                                                                                                    5. Pipes the recording file to the response.

                                                                                                                                                                                                    Direct access to S3 bucket

                                                                                                                                                                                                    With this approach, the backend acts as a proxy between the client and S3, which may result in increased server resource usage. To avoid this, it is more efficient to provide the client with a presigned URL, allowing direct access to the recording files from the S3 bucket. In the advanced recording tutorial, we show how to implement this method, along with a discussion of its advantages and disadvantages.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#delete-recording","title":"Delete recording","text":"

                                                                                                                                                                                                    The DELETE /recordings/:recordingName endpoint deletes a recording from the S3 bucket:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.delete(\"/recordings/:recordingName\", async (req, res) => {\n    const { recordingName } = req.params;\n    const key = RECORDINGS_PATH + recordingName;\n    const exists = await s3Service.exists(key); // (1)!\n\n    if (!exists) {\n        res.status(404).json({ errorMessage: \"Recording not found\" });\n        return;\n    }\n\n    try {\n        // Delete the recording file and metadata file from S3\n        await Promise.all([s3Service.deleteObject(key), s3Service.deleteObject(`${key}.json`)]); // (2)!\n        res.json({ message: \"Recording deleted\" });\n    } catch (error) {\n        console.error(\"Error deleting recording.\", error);\n        res.status(500).json({ errorMessage: \"Error deleting recording\" });\n    }\n});\n
                                                                                                                                                                                                    1. Check if the recording exists in the S3 bucket.
                                                                                                                                                                                                    2. Delete the recording file and metadata file from the S3 bucket.

                                                                                                                                                                                                    This endpoint does the following:

                                                                                                                                                                                                    1. Extracts the recordingName parameter from the request.
                                                                                                                                                                                                    2. Checks if the recording exists in the S3 bucket by calling the exists method of the S3Service with the key as a parameter. If the recording does not exist, it returns a 404 error.
                                                                                                                                                                                                    3. Deletes the recording file and metadata file from the S3 bucket by calling the deleteObject method of the S3Service with the key and ${key}.json as a parameter, respectively.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#s3-service","title":"S3 service","text":"

                                                                                                                                                                                                    Finally, let's take a look at the s3.service.js file, which encapsulates the operations to interact with the S3 bucket:

                                                                                                                                                                                                    s3.service.js
                                                                                                                                                                                                    // S3 configuration\nconst S3_ENDPOINT = process.env.S3_ENDPOINT || \"http://localhost:9000\"; // (1)!\nconst S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || \"minioadmin\"; // (2)!\nconst S3_SECRET_KEY = process.env.S3_SECRET_KEY || \"minioadmin\"; // (3)!\nconst AWS_REGION = process.env.AWS_REGION || \"us-east-1\"; // (4)!\nconst S3_BUCKET = process.env.S3_BUCKET || \"openvidu\"; // (5)!\n\nexport class S3Service {\n    static instance;\n\n    constructor() {\n        if (S3Service.instance) {\n            return S3Service.instance;\n        }\n        // (6)!\n        this.s3Client = new S3Client({\n            endpoint: S3_ENDPOINT,\n            credentials: {\n                accessKeyId: S3_ACCESS_KEY,\n                secretAccessKey: S3_SECRET_KEY\n            },\n            region: AWS_REGION,\n            forcePathStyle: true\n        });\n\n        S3Service.instance = this;\n        return this;\n    }\n    // (7)!\n    async exists(key) {\n        try {\n            await this.headObject(key);\n            return true;\n        } catch (error) {\n            return false;\n        }\n    }\n    // (8)!\n    async headObject(key) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key\n        };\n        const command = new HeadObjectCommand(params);\n        return this.run(command);\n    }\n    // (9)!\n    async getObjectSize(key) {\n        const { ContentLength: size } = await this.headObject(key);\n        return size;\n    }\n    // (10)!\n    async getObject(key, range) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key,\n            Range: range ? `bytes=${range.start}-${range.end}` : undefined\n        };\n        const command = new GetObjectCommand(params);\n        const { Body: body } = await this.run(command);\n        return body;\n    }\n    // (11)!\n    async getObjectAsJson(key) {\n        const body = await this.getObject(key);\n        const stringifiedData = await body.transformToString();\n        return JSON.parse(stringifiedData);\n    }\n    // (12)!\n    async listObjects(prefix, regex) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Prefix: prefix\n        };\n        const command = new ListObjectsV2Command(params);\n        const { Contents: objects } = await this.run(command);\n\n        // Filter objects by regex and return the keys\n        return objects?.filter((object) => regex.test(object.Key)).map((payload) => payload.Key) ?? [];\n    }\n    // (13)!\n    async deleteObject(key) {\n        const params = {\n            Bucket: S3_BUCKET,\n            Key: key\n        };\n        const command = new DeleteObjectCommand(params);\n        return this.run(command);\n    }\n    // (14)!\n    async run(command) {\n        return this.s3Client.send(command);\n    }\n}\n
                                                                                                                                                                                                    1. The URL of the S3 server.
                                                                                                                                                                                                    2. The access key of the S3 server.
                                                                                                                                                                                                    3. The secret key of the S3 server.
                                                                                                                                                                                                    4. The AWS region of the S3 server.
                                                                                                                                                                                                    5. The name of the S3 bucket.
                                                                                                                                                                                                    6. Initialize the S3Client with the provided configuration.
                                                                                                                                                                                                    7. Check if an object exists in the S3 bucket.
                                                                                                                                                                                                    8. Retrieve the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    9. Retrieve the size of an object in the S3 bucket.
                                                                                                                                                                                                    10. Retrieve a specified range of bytes from an object in the S3 bucket.
                                                                                                                                                                                                    11. Retrieve an object from the S3 bucket as JSON.
                                                                                                                                                                                                    12. List objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    13. Delete an object from the S3 bucket.
                                                                                                                                                                                                    14. Execute an S3 command.

                                                                                                                                                                                                    This file loads environment variables for the S3 configuration:

                                                                                                                                                                                                    • S3_ENDPOINT: The URL of the S3 server.
                                                                                                                                                                                                    • S3_ACCESS_KEY: The access key of the S3 server.
                                                                                                                                                                                                    • S3_SECRET_KEY: The secret key of the S3 server.
                                                                                                                                                                                                    • AWS_REGION: The AWS region of the S3 server.
                                                                                                                                                                                                    • S3_BUCKET: The name of the S3 bucket.

                                                                                                                                                                                                    Then, it defines the S3Service class as a singleton, which initializes the S3Client with the provided configuration. The class encapsulates the following methods to interact with the S3 bucket:

                                                                                                                                                                                                    • exists: Checks if an object exists in the S3 bucket.
                                                                                                                                                                                                    • headObject: Retrieves the metadata of an object in the S3 bucket.
                                                                                                                                                                                                    • getObjectSize: Retrieves the size of an object in the S3 bucket.
                                                                                                                                                                                                    • getObject: Retrieves an object from the S3 bucket.
                                                                                                                                                                                                    • getObjectAsJson: Retrieves an object from the S3 bucket as JSON.
                                                                                                                                                                                                    • listObjects: Lists objects in the S3 bucket that match a regex pattern.
                                                                                                                                                                                                    • deleteObject: Deletes an object from the S3 bucket.
                                                                                                                                                                                                    • run: Executes an S3 command.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#frontend","title":"Frontend","text":"

                                                                                                                                                                                                    The client application extends the JavaScript client tutorial by adding recording features, introducing new buttons to facilitate actions such as starting and stopping recording a room, as well as listing, playing and deleting recordings. When these newly introduced buttons are interacted with, the client triggers requests to the REST API endpoints of the server application.

                                                                                                                                                                                                    In order to update the user interface of all participants in the room according to the recording status, the client application subscribes to the RoomEvent.RecordingStatusChanged event, which is triggered when the room changes from being recorded to not being recorded, and vice versa. When this event is triggered, the updateRecordingInfo function is called to update the recording information of the room displayed on the screen. This function is also called when a participant joins the room, using the current value of the room.recording property at that moment. This is done in the joinRoom function of the app.js file:

                                                                                                                                                                                                    Limitations of the RoomEvent.RecordingStatusChanged event

                                                                                                                                                                                                    By using the RoomEvent.RecordingStatusChanged event, we can only detect when the recording has started or stopped, but not other states like starting, stopping or failed. Additionally, when the recording stops, the event is not triggered until the recorder participant leaves the room, causing a delay of 20 seconds approximately between the stop and when participants are notified.

                                                                                                                                                                                                    To overcome these limitations, you can follow the steps described in the advanced recording tutorial, where we implement a custom notification system. This system informs participants about the recording status by listening to webhook events and updating room metadata.

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new LivekitClient.Room();\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    // When recording status changes...\n    room.on(LivekitClient.RoomEvent.RecordingStatusChanged, async (isRecording) => {\n        await updateRecordingInfo(isRecording);\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value;\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName);\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token);\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName;\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone();\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n\n        // Update recording info\n        await updateRecordingInfo(room.isRecording);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n        await leaveRoom();\n    }\n}\n

                                                                                                                                                                                                    The updateRecordingInfo function updates the recording information of the room by changing the recording button's text and color according to the recording status. It also shows or hides the alert message that informs the user that the room is being recorded. Finally, it updates the recording list by calling the listRecordings function.

                                                                                                                                                                                                    This function retrieves all recordings available for the room from the backend and displays their relevant information by invoking the showRecordingList function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function showRecordingList(recordings) {\n    const recordingsList = document.getElementById(\"recording-list\");\n\n    if (recordings.length === 0) {\n        recordingsList.innerHTML = \"<span>There are no recordings available</span>\";\n    } else {\n        recordingsList.innerHTML = \"\";\n    }\n\n    recordings.forEach((recording) => {\n        const recordingName = recording.name;\n        const recordingSize = formatBytes(recording.size ?? 0);\n        const recordingDate = new Date(recording.startedAt).toLocaleString();\n\n        const recordingContainer = document.createElement(\"div\");\n        recordingContainer.className = \"recording-container\";\n        recordingContainer.id = recordingName;\n\n        recordingContainer.innerHTML = `\n            <i class=\"fa-solid fa-file-video\"></i>\n            <div class=\"recording-info\">\n                <p class=\"recording-name\">${recordingName}</p>\n                <p class=\"recording-size\">${recordingSize}</p>\n                <p class=\"recording-date\">${recordingDate}</p>\n            </div>\n            <div class=\"recording-actions\">\n                <button title=\"Play\" class=\"icon-button\" onclick=\"displayRecording('${recordingName}')\">\n                    <i class=\"fa-solid fa-play\"></i>\n                </button>\n                <button title=\"Delete\" class=\"icon-button delete-button\" onclick=\"deleteRecording('${recordingName}')\">\n                    <i class=\"fa-solid fa-trash\"></i>\n                </button>\n            </div>\n        `;\n\n        recordingsList.append(recordingContainer);\n    });\n}\n

                                                                                                                                                                                                    The showRecordingList function creates a new div element for each recording available in the room and appends it to the recording-list container. Each div element contains the recording name, size, and start date, as well as buttons to play and delete the recording.

                                                                                                                                                                                                    Recording deletion

                                                                                                                                                                                                    When a recording is deleted, it is removed from the recording list, but only for the user who initiated the deletion. Other users will continue to see the recording in their list until it is refreshed.

                                                                                                                                                                                                    In the advanced recording tutorial, we show how to implement a custom notification system that alerts all participants of a recording's deletion by sending data messages.

                                                                                                                                                                                                    When the user clicks the play button, the displayRecording function is called to play the recording. This function opens a dialog window with an embedded video element and sets the source of the video to the get recording endpoint of the server application:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    function displayRecording(recordingName) {\n    const recordingVideoDialog = document.getElementById(\"recording-video-dialog\");\n    recordingVideoDialog.showModal();\n    const recordingVideo = document.getElementById(\"recording-video\");\n    recordingVideo.src = `/recordings/${recordingName}`;\n}\n
                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    <dialog id=\"recording-video-dialog\">\n    <video id=\"recording-video\" autoplay controls></video>\n    <button class=\"btn btn-secondary\" id=\"close-recording-video-dialog\" onclick=\"closeRecording()\">Close</button>\n</dialog>\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/advanced-features/recording-basic/#general-recording-page","title":"General recording page","text":"

                                                                                                                                                                                                    The recordings.html file defines the HTML for the general recording page. This page lists all available recordings from all rooms and allows the user to filter them by room name. It also provides buttons to play and delete each recording.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/","title":"Angular Components Tutorials","text":"Angular Components

                                                                                                                                                                                                    In the following tutorials you can learn how to use each one of the available Angular Components to build your application UI tailored to your needs:

                                                                                                                                                                                                    • Custom UI: learn how to customize the UI, changing colors, shapes and add your branding logo.
                                                                                                                                                                                                    • Custom toolbar: learn how to replace the default toolbar with your own.
                                                                                                                                                                                                    • Toolbar buttons: learn how to add custom buttons to the toolbar.
                                                                                                                                                                                                    • Toolbar panel buttons: learn how to add custom panel buttons to the toolbar.
                                                                                                                                                                                                    • Custom layout: learn how to replace the default layout with your own.
                                                                                                                                                                                                    • Custom stream: learn how to replace the default stream with your own.
                                                                                                                                                                                                    • Custom panels: learn how to replace the default panels with your own.
                                                                                                                                                                                                    • Additional panel: learn how to add a new extra panel besides the default ones.
                                                                                                                                                                                                    • Custom chat panel: learn how to replace the default chat panel with your own.
                                                                                                                                                                                                    • Custom activities panel: learn how to replace the default activities panel with your own.
                                                                                                                                                                                                    • Custom participants panel: learn how to replace the default participants panel with your own.
                                                                                                                                                                                                    • Custom participant panel item: learn how to replace the default participants panel item with your own.
                                                                                                                                                                                                    • Custom participant panel item element: learn how to replace the default participants panel item element with your own.
                                                                                                                                                                                                    • Toggle hand: learn how to add extra features to the videoconference.
                                                                                                                                                                                                    • Admin dashboard: learn how to add an admin dashboard to the videoconference.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/","title":"Additional panels using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-additional-panels tutorial demonstrates how to add new panels to the videoconference, providing a more tailored user experience.

                                                                                                                                                                                                    Adding new videoconference panels is made simple with the AdditionalPanelsDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Additional Panel

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalPanelButtonsDirective and the AdditionalPanelsDirective to add new buttons to the toolbar and new panels to the videoconference. If you want to learn how to add new buttons to the toolbar, you can check the openvidu-toolbar-panel-buttons tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#4-run-the-openvidu-additional-panels-tutorial","title":"4. Run the openvidu-additional-panels tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-additional-panels\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Additional Toolbar Buttons -->\n      <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleMyPanel('my-panel1')\">\n          <mat-icon>360</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleMyPanel('my-panel2')\">\n          <mat-icon>star</mat-icon>\n        </button>\n      </div>\n\n      <!-- Additional Panels -->\n      <div *ovAdditionalPanels id=\"my-panels\">\n        @if (showExternalPanel) {\n        <div id=\"my-panel1\">\n          <h2>NEW PANEL 1</h2>\n          <p>This is my new additional panel</p>\n        </div>\n        } @if (showExternalPanel2) {\n        <div id=\"my-panel2\">\n          <h2>NEW PANEL 2</h2>\n          <p>This is another new panel</p>\n        </div>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-additional-panels';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Flags to control the visibility of external panels\n  showExternalPanel: boolean = false; // (5)!\n  showExternalPanel2: boolean = false; // (6)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    this.subscribeToPanelToggling(); // (7)!\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (8)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to panel toggling events\n  subscribeToPanelToggling() {\n    this.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => { // (9)!\n      this.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';\n      this.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';\n    });\n  }\n\n  // Toggle the visibility of external panels\n  toggleMyPanel(type: string) { // (10)!\n    this.panelService.togglePanel(type);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    6. showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    7. subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    8. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    9. panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    10. toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • showExternalPanel: Flag to control the visibility of the first external panel.
                                                                                                                                                                                                    • showExternalPanel2: Flag to control the visibility of the second external panel.
                                                                                                                                                                                                    • subscribeToPanelToggling method that subscribes to panel toggling events.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • panelService.panelStatusObs observable that listens to panel toggling events.
                                                                                                                                                                                                    • toggleMyPanel method that toggles the visibility of external panels.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-additional-panels/#adding-new-panels","title":"Adding new panels","text":"

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            [toolbarDisplayRoomName]=\"false\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Additional Toolbar Buttons -->\n            <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n                <button mat-icon-button (click)=\"toggleMyPanel('my-panel1')\">\n                    <mat-icon>360</mat-icon>\n                </button>\n                <button mat-icon-button (click)=\"toggleMyPanel('my-panel2')\">\n                    <mat-icon>star</mat-icon>\n                </button>\n            </div>\n\n            <!-- Additional Panels -->\n            <div *ovAdditionalPanels id=\"my-panels\">\n                @if (showExternalPanel) {\n                <div id=\"my-panel1\">\n                    <h2>NEW PANEL 1</h2>\n                    <p>This is my new additional panel</p>\n                </div>\n                } @if (showExternalPanel2) {\n                <div id=\"my-panel2\">\n                    <h2>NEW PANEL 2</h2>\n                    <p>This is another new panel</p>\n                </div>\n                }\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add new buttons to the toolbar and the *ovAdditionalPanels directive is used to add new panels to the videoconference.

                                                                                                                                                                                                    When the user clicks on the buttons, the toggleMyPanel method is called to toggle the visibility of the new panels. These new panels are handled by the showExternalPanel and showExternalPanel2 flags.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/","title":"Create admin dashboard using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-admin-dashboard tutorial demonstrates how to create an admin dashboard to manage the recordings of a videoconference using the OpenVidu Components Angular library.

                                                                                                                                                                                                    OpenVidu Components - Admin Login

                                                                                                                                                                                                    OpenVidu Components - Admin Dashboard"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#4-run-the-openvidu-admin-dashboard-tutorial","title":"4. Run the openvidu-admin-dashboard tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-admin-dashboard\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-admin-dashboard/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-admin-login component to create a login form and the ov-admin-dashboard component to create the admin dashboard.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    @if (logged) {\n    <ov-admin-dashboard\n      [recordingsList]=\"recordings()\"\n      (onLogoutRequested)=\"onLogoutRequested()\"\n      (onRefreshRecordingsRequested)=\"onRefreshRecordingsRequested()\"\n      (onLoadMoreRecordingsRequested)=\"onLoadMoreRecordingsRequested()\"\n      (onRecordingDeleteRequested)=\"onRecordingDeleteRequested($event)\"\n    ></ov-admin-dashboard>\n    } @else {\n    <ov-admin-login (onLoginRequested)=\"onLoginRequested($event)\">\n    </ov-admin-login>\n    }\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n\n  roomName = 'openvidu-admin-dashboard'; // (1)!\n\n  logged: boolean = false; // (2)!\n\n  // Recordings list to show in the dashboard\n  // This is a dummy list, you should replace it with your own list from the server\n  recordings: WritableSignal<RecordingInfo[]> = signal([ // (3)!\n    {\n      id: 'recording1',\n      roomName: this.roomName,\n      roomId: 'roomId1',\n      outputMode: RecordingOutputMode.COMPOSED,\n      status: RecordingStatus.READY,\n      filename: 'sampleRecording.mp4',\n      startedAt: new Date().getTime(),\n      endedAt: new Date().getTime(),\n      duration: 0,\n      size: 100,\n      location: 'http://localhost:8080/recordings/recording1',\n    }\n  ]);\n\n  constructor() {}\n\n  onLoginRequested(credentials: { username: string; password: string }) { // (4)!\n    console.log(`Login button clicked ${credentials}`);\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    this.logged = true;\n  }\n\n  onLogoutRequested() { // (5)!\n    console.log('Logout button clicked');\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    this.logged = false;\n  }\n\n  onRefreshRecordingsRequested() { // (6)!\n    console.log('Refresh recording clicked');\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    // Getting the recordings from the server\n    this.recordings.update(() => [\n      {\n        id: 'recording1',\n        roomName: this.title,\n        roomId: 'roomId1',\n        outputMode: RecordingOutputMode.COMPOSED,\n        status: RecordingStatus.READY,\n        filename: 'sampleRecording1.mp4',\n        startedAt: new Date().getTime(),\n        endedAt: new Date().getTime(),\n        duration: 0,\n        size: 100,\n        location: 'http://localhost:8080/recordings/recording1',\n      },\n    ]);\n  }\n\n  onLoadMoreRecordingsRequested() { // (7)!\n    console.log('Load more recordings clicked');\n  }\n\n  onRecordingDeleteRequested(recording: RecordingDeleteRequestedEvent) { // (8)!\n    console.log(`Delete recording clicked ${recording.recordingId}`);\n    /**\n     * WARNING! This code is developed for didactic purposes only.\n     * The authentication process should be done in the server side.\n     **/\n    // Deleting the recording from the server\n    this.recordings.update((recordings) =>\n      recordings.filter((rec) => rec.id !== recording.recordingId)\n    );\n\n    console.log(this.recordings());\n  }\n}\n
                                                                                                                                                                                                    1. roomName: OpenVidu Room name.
                                                                                                                                                                                                    2. logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    3. recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    4. onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    5. onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    6. onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    7. onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    8. onRecordingDeleteRequested method that fires when the delete recording button is clicked.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • roomName: OpenVidu Room name.
                                                                                                                                                                                                    • logged: Boolean that indicates if the user is logged in.
                                                                                                                                                                                                    • recordings: Dummy list of recordings to show in the dashboard. You should replace it with your own list from the server from the server.
                                                                                                                                                                                                    • onLoginRequested method that fires when the login button is clicked.
                                                                                                                                                                                                    • onLogoutRequested method that fires when the logout button is clicked.
                                                                                                                                                                                                    • onRefreshRecordingsRequested method that fires when the refresh recordings button is clicked.
                                                                                                                                                                                                    • onLoadMoreRecordingsRequested method that fires when the load more recordings button is clicked.
                                                                                                                                                                                                    • onRecordingDeleteRequested method that fires when the delete recording button is clicked.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/","title":"Custom activities panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-activities-panel tutorial demonstrates how to customize the activities panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default activities panel is made simple with the ActivitiesPanelDirective, which offers a straightforward way to replace and adapt the ActivitiesPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Activities Panel"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#4-run-the-openvidu-custom-activities-panel-tutorial","title":"4. Run the openvidu-custom-activities-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-activities-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n        <!-- Custom activities panel -->\n        <div *ovActivitiesPanel id=\"my-panel\">\n            <h3>ACTIVITIES</h3>\n            <div>CUSTOM ACTIVITIES</div>\n        </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-activities-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-activities-panel/#customizing-chat-panel","title":"Customizing chat panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovActivitiesPanel directive with the aim of replacing the default activities panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom activities panel -->\n            <div *ovActivitiesPanel id=\"my-panel\">\n                <h3>ACTIVITIES</h3>\n                <div>CUSTOM ACTIVITIES</div>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/","title":"Custom chat panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-chat-panel tutorial demonstrates how to customize the chat panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default chat panel is made simple with the ChatPanelDirective, which offers a straightforward way to replace and adapt the ChatPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Chat Panel"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#4-run-the-openvidu-custom-chat-panel-tutorial","title":"4. Run the openvidu-custom-chat-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-chat-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  DataPacket_Kind,\n  DataPublishOptions,\n  DataTopic,\n  ParticipantService,\n  RemoteParticipant,\n  Room,\n  RoomEvent,\n  OpenViduComponentsModule,\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      [toolbarDisplayRoomName]=\"false\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n      (onRoomCreated)=\"onRoomCreated($event)\"\n    >\n      <!-- Chat Panel -->\n      <div *ovChatPanel id=\"my-panel\">\n        <h3>Chat</h3>\n        <div>\n          <ul>\n            @for (msg of messages; track msg) {\n            <li>{{ msg }}</li>\n            }\n          </ul>\n        </div>\n        <input value=\"Hello\" #input />\n        <button (click)=\"send(input.value)\">Send</button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-chat-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  messages: string[] = []; // (5)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (6)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  /**\n   * Handles the creation of a new room and sets up an event listener for receiving data.\n   *\n   * @param room - The Room object that was created.\n   */\n  onRoomCreated(room: Room) { // (7)!\n    // Set up an event listener for the RoomEvent.DataReceived event.\n    room.on(RoomEvent.DataReceived, ( // (8)!\n      payload: Uint8Array,\n      participant?: RemoteParticipant,\n      _?: DataPacket_Kind,\n      topic?: string\n    ) => {\n      // Check if the received data topic is related to chat messages.\n      if (topic === DataTopic.CHAT) {\n        // Decode the payload from Uint8Array to a string and parse it as JSON.\n        const { message } = JSON.parse(new TextDecoder().decode(payload));\n\n        // Get the participant's name or default to 'Unknown' if not available.\n        const participantName = participant?.name || 'Unknown';\n\n        // Add the received message to the messages array.\n        this.messages.push(message);\n\n        // Log the received message and the participant's name to the console.\n        console.log(`Message received from ${participantName}:`, message);\n      }\n    });\n  }\n\n  // Function to send a chat message\n  async send(message: string): Promise<void> { // (9)!\n    const strData = JSON.stringify({ message });\n    const data: Uint8Array = new TextEncoder().encode(strData);\n    const options: DataPublishOptions = { topic: DataTopic.CHAT };\n    await this.participantService.publishData(data, options);\n    this.messages.push(message);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (10)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. messages array that stores the chat messages.
                                                                                                                                                                                                    6. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    7. onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    8. Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    9. send method that sends a chat message.
                                                                                                                                                                                                    10. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • messages array that stores the chat messages.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onRoomCreated method that handles the creation of a new room and sets up an event listener for receiving data.
                                                                                                                                                                                                    • Event listener for the RoomEvent.DataReceived event that listens to chat messages.
                                                                                                                                                                                                    • send method that sends a chat message.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-chat-panel/#customizing-chat-panel","title":"Customizing chat panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovChatPanel directive with the aim of replacing the default chat panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n            (onRoomCreated)=\"onRoomCreated($event)\"\n        >\n            <!-- Chat Panel -->\n            <div *ovChatPanel id=\"my-panel\">\n                <h3>Chat</h3>\n                <div>\n                    <ul>\n                        @for (msg of messages; track msg) {\n                        <li>{{ msg }}</li>\n                        }\n                    </ul>\n                </div>\n                <input value=\"Hello\" #input />\n                <button (click)=\"send(input.value)\">Send</button>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/","title":"Custom layout using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-layout tutorial demonstrates how to replace the default layout of the OpenVidu Components Angular library with a custom layout.

                                                                                                                                                                                                    Replacing the default layout is made simple with the LayoutDirective, which offers a straightforward way to customize the LayoutComponent.

                                                                                                                                                                                                    OpenVidu Components - Custom Layout"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#4-run-the-openvidu-custom-layout-tutorial","title":"4. Run the openvidu-custom-layout tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-layout\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantModel, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Custom Layout for Video Streams -->\n        <div *ovLayout>\n          <div class=\"container\">\n            <!-- Local Participant's Tracks -->\n            @for (track of localParticipant.tracks; track track) {\n            <div\n              class=\"item\"\n              [ngClass]=\"{\n                hidden:\n                  track.isAudioTrack && !track.participant.onlyHasAudioTracks\n              }\"\n            >\n              <ov-stream [track]=\"track\"></ov-stream>\n            </div>\n            }\n\n            <!-- Remote Participants' Tracks -->\n            @for (track of remoteParticipants | tracks; track track) {\n            <div\n              class=\"item\"\n              [ngClass]=\"{\n                hidden:\n                  track.isAudioTrack && !track.participant.onlyHasAudioTracks\n              }\"\n            >\n              <ov-stream [track]=\"track\"></ov-stream>\n            </div>\n            }\n          </div>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: `\n    /* css styles */\n  `,\n  standalone: true,\n    imports: [OpenViduComponentsModule, NgClass],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-layout';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Participant-related properties\n  localParticipant!: ParticipantModel; // (5)!\n  remoteParticipants!: ParticipantModel[]; // (6)!\n  localParticipantSubs!: Subscription; // (7)!\n  remoteParticipantsSubs!: Subscription; // (8)!\n\n  constructor(private httpClient: HttpClient,   private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    // Subscribe to participants' updates\n    this.subscribeToParticipants();\n  }\n\n  ngOnDestroy() {\n    // Unsubscribe from participant updates to prevent memory leaks\n    this.localParticipantSubs?.unsubscribe();\n    this.remoteParticipantsSubs?.unsubscribe();\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (9)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to updates for local and remote participants\n  private subscribeToParticipants() { // (10)!\n    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {\n      if (p) this.localParticipant = p;\n    });\n\n    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {\n      this.remoteParticipants = participants;\n    });\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. localParticipant: Local participant model.
                                                                                                                                                                                                    6. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    7. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    8. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-layout/#adding-custom-buttons-to-the-toolbar","title":"Adding custom buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovLayout that allows you to customize the default layout of the videoconference. In this tutorial, we are creating a very basic layout just for demonstration purposes.

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom Layout for Video Streams -->\n            <div *ovLayout>\n                <div class=\"container\">\n                    <!-- Local Participant's Tracks -->\n                    @for (track of localParticipant.tracks; track track) {\n                    <div\n                        class=\"item\"\n                        [ngClass]=\"{\n                            hidden:\n                                track.isAudioTrack && !track.participant.onlyHasAudioTracks\n                        }\"\n                    >\n                        <ov-stream [track]=\"track\"></ov-stream>\n                    </div>\n                    }\n\n                    <!-- Remote Participants' Tracks -->\n                    @for (track of remoteParticipants | tracks; track track) {\n                    <div\n                        class=\"item\"\n                        [ngClass]=\"{\n                            hidden:\n                                track.isAudioTrack && !track.participant.onlyHasAudioTracks\n                        }\"\n                    >\n                        <ov-stream [track]=\"track\"></ov-stream>\n                    </div>\n                    }\n                </div>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovLayout directive is used to customize the layout of the videoconference. The layout is divided into two sections: one for the local participant's tracks and another for the remote participants' tracks.

                                                                                                                                                                                                    The repeater directive @for is used to iterate over the tracks of the local participant and the remote participants and display them in the layout using the ov-stream component.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/","title":"Custom panels using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-panels tutorial demonstrates how to replace the default panels with a custom ones, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the videoconference panels is made simple with the PanelDirective, which offers a straightforward way to replace and adapt the PanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Panels"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#4-run-the-openvidu-custom-panels-tutorial","title":"4. Run the openvidu-custom-panels tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-panels\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Custom Panels -->\n        <ov-panel *ovPanel>\n          <!-- Custom Chat Panel -->\n          <div *ovChatPanel id=\"my-chat-panel\">This is my custom chat panel</div>\n\n          <!-- Custom Participants Panel -->\n          <div *ovParticipantsPanel id=\"my-participants-panel\">\n            This is my custom participants panel\n          </div>\n\n          <!-- Custom Activities Panel -->\n          <div *ovActivitiesPanel id=\"my-activities-panel\">\n            This is my custom activities panel\n          </div>\n        </ov-panel>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-panels';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-panels/#customizing-the-panels","title":"Customizing the panels","text":"

                                                                                                                                                                                                    The *ovPanel directive is used to replace the default videoconference panels with a custom ones. In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Custom Panels -->\n            <ov-panel *ovPanel>\n                <!-- Custom Chat Panel -->\n                <div *ovChatPanel id=\"my-chat-panel\">This is my custom chat panel</div>\n\n                <!-- Custom Participants Panel -->\n                <div *ovParticipantsPanel id=\"my-participants-panel\">\n                    This is my custom participants panel\n                </div>\n\n                <!-- Custom Activities Panel -->\n                <div *ovActivitiesPanel id=\"my-activities-panel\">\n                    This is my custom activities panel\n                </div>\n            </ov-panel>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovPanel directive is used to replace the default videoconference panels with custom ones. The *ovChatPanel, *ovParticipantsPanel, and *ovActivitiesPanel directives are used to replace the default chat, participants, and activities panels with custom ones.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/","title":"Custom participants panel item element using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item-element tutorial demonstrates how to replace the default participant item element inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participant item element is made simple with the ParticipantsPanelItemElementsDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item Element"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#4-run-the-openvidu-custom-participant-panel-item-element-tutorial","title":"4. Run the openvidu-custom-participant-panel-item-element tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item-element\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Participant Panel Item Elements -->\n      <div *ovParticipantPanelItemElements=\"let participant\">\n        <!-- Leave Button for Local Participant -->\n        @if (participant.isLocal) {\n        <button (click)=\"leaveSession()\">Leave</button>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participant-panel-item-element';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Function to leave the session\n  async leaveSession() { // (6)!\n    await this.openviduService.disconnectRoom();\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (7)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    7. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • leaveSession method that disconnects the client from the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/#customizing-participant-item-element","title":"Customizing participant item element","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Participant Panel Item Elements -->\n            <div *ovParticipantPanelItemElements=\"let participant\">\n                <!-- Leave Button for Local Participant -->\n                @if (participant.isLocal) {\n                <button (click)=\"leaveSession()\">Leave</button>\n                }\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItemElements directive is used to replace the default participant item element, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    The *ovParticipantPanelItemElements directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/","title":"Custom participants panel item using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participant-panel-item tutorial demonstrates how to replace the default participant item inside of the participants panel with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participant item is made simple with the ParticipantsPanelItemDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelItemComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel Item"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#4-run-the-openvidu-custom-participant-panel-item-tutorial","title":"4. Run the openvidu-custom-participant-panel-item tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participant-panel-item\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n        <!-- Participant Panel Items -->\n        <div *ovParticipantPanelItem=\"let participant\" style=\"display: flex\">\n            <p>{{ participant.name }}</p>\n\n            <!-- More Options Menu -->\n            <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n                <mat-icon>more_vert</mat-icon>\n            </button>\n\n            <!-- Menu Content -->\n            <mat-menu #menu=\"matMenu\">\n                <button mat-menu-item>Button 1</button>\n                <button mat-menu-item>Button 2</button>\n            </mat-menu>\n        </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [\n    OpenViduComponentsModule,\n    MatIconButton,\n    MatMenuTrigger,\n    MatIcon,\n    MatMenu,\n    MatMenuItem,\n  ],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participant-panel-item';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/#customizing-participant-item","title":"Customizing participant item","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantPanelItem directive with the aim of replacing the default participant item, inside of the participants panel, with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Participant Panel Items -->\n            <div *ovParticipantPanelItem=\"let participant\" style=\"display: flex\">\n                <p>{{ participant.name }}</p>\n\n                <!-- More Options Menu -->\n                <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n                    <mat-icon>more_vert</mat-icon>\n                </button>\n\n                <!-- Menu Content -->\n                <mat-menu #menu=\"matMenu\">\n                    <button mat-menu-item>Button 1</button>\n                    <button mat-menu-item>Button 2</button>\n                </mat-menu>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [\n        OpenViduComponentsModule,\n        MatIconButton,\n        MatMenuTrigger,\n        MatIcon,\n        MatMenu,\n        MatMenuItem,\n    ],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovParticipantPanelItem directive is used to replace the default participant item inside of the participants panel with a custom one. The *ovParticipantPanelItem directive provides a way to access the participant object and customize the participant item component to your needs.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/","title":"Custom participants panel using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-participants-panel tutorial demonstrates how to customize the participants panel, providing a more tailored user experience.

                                                                                                                                                                                                    Replacing the default participants panel is made simple with the ParticipantsPanelDirective, which offers a straightforward way to replace and adapt the ParticipantsPanelComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Participants Panel"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#4-run-the-openvidu-custom-participants-panel-tutorial","title":"4. Run the openvidu-custom-participants-panel tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-participants-panel\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n    ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Custom Participants Panel -->\n      <div *ovParticipantsPanel id=\"my-panel\">\n        <ul id=\"local\">\n          <li>{{ localParticipant.name }}</li>\n        </ul>\n        <ul id=\"remote\">\n          @for (p of remoteParticipants; track p) {\n          <li>{{ p.name }}</li>\n          }\n        </ul>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent implements OnInit, OnDestroy {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-participants-panel';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Participant-related properties\n  localParticipant!: ParticipantModel; // (5)!\n  remoteParticipants!: ParticipantModel[]; // (6)!\n  localParticipantSubs!: Subscription; // (7)!\n  remoteParticipantsSubs!: Subscription; // (8)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  ngOnInit() {\n    // Subscribe to participants' updates\n    this.subscribeToParticipants();\n  }\n\n  ngOnDestroy() {\n    // Unsubscribe from participant updates to prevent memory leaks\n    this.localParticipantSubs?.unsubscribe();\n    this.remoteParticipantsSubs?.unsubscribe();\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (9)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Subscribe to updates for local and remote participants\n  private subscribeToParticipants() { // (10)!\n    this.localParticipantSubs = this.participantService.localParticipant$.subscribe((p) => {\n      if (p) this.localParticipant = p;\n    });\n\n    this.remoteParticipantsSubs = this.participantService.remoteParticipants$.subscribe((participants) => {\n      this.remoteParticipants = participants;\n    });\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (11)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. localParticipant: Local participant model.
                                                                                                                                                                                                    6. remoteParticipants: Remote participants model.
                                                                                                                                                                                                    7. localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    8. remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    9. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    10. subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    11. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • localParticipant: Local participant model.
                                                                                                                                                                                                    • remoteParticipants: Remote participants model.
                                                                                                                                                                                                    • localParticipantSubs: Subscription to the local participant updates.
                                                                                                                                                                                                    • remoteParticipantsSubs: Subscription to the remote participants updates.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • subscribeToParticipants method that subscribes to updates for local and remote participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-participants-panel/#customizing-participants-panel","title":"Customizing participants panel","text":"

                                                                                                                                                                                                    This tutorial uses the *ovParticipantsPanel directive with the aim of replacing the default participant panel with a custom one.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <!-- Custom Participants Panel -->\n      <div *ovParticipantsPanel id=\"my-panel\">\n        <ul id=\"local\">\n          <li>{{ localParticipant.name }}</li>\n        </ul>\n        <ul id=\"remote\">\n          @for (p of remoteParticipants; track p) {\n          <li>{{ p.name }}</li>\n          }\n        </ul>\n      </div>\n    </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent implements OnInit, OnDestroy{\n    // ...\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/","title":"Custom stream using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-stream tutorial demonstrates how to replace the default video stream with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the video stream component is made simple with the StreamDirective, which offers a straightforward way to replace and adapt the StreamComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Stream"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#4-run-the-openvidu-custom-stream-tutorial","title":"4. Run the openvidu-custom-stream tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-stream\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n        <!-- OpenVidu Video Conference Component -->\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <!-- Display Video Streams -->\n        <div *ovStream=\"let track\">\n          <!-- Video Stream Component -->\n          <ov-stream [track]=\"track\" [displayParticipantName]=\"false\"></ov-stream>\n\n          <!-- Display Participant's Name -->\n          <p>{{ track.participant.name }}</p>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-stream';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-stream/#customizing-the-video-stream","title":"Customizing the video stream","text":"

                                                                                                                                                                                                    The *ovStream directive is used to replace the default video stream with a custom one and allows you to customize the video stream component to your needs. It provides a way to access the video stream track and the participant name.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <!-- OpenVidu Video Conference Component -->\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <!-- Display Video Streams -->\n            <div *ovStream=\"let track\">\n                <!-- Video Stream Component -->\n                <ov-stream [track]=\"track\" [displayParticipantName]=\"false\"></ov-stream>\n\n                <!-- Display Participant's Name -->\n                <p>{{ track.participant.name }}</p>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovStream directive provides access to the ParticipantTrackPublication object, which contains the video stream track and the participant name.

                                                                                                                                                                                                    The track object is passed to the ov-stream component to display the video stream. The track.participant.name object is used to display the participant's name.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/","title":"Custom toolbar using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-custom-toolbar tutorial demonstrates how to replace the default toolbar with a custom one, providing a more tailored user experience.

                                                                                                                                                                                                    Customizing the toolbar is made simple with the ToolbarDirective, which offers a straightforward way to replace and adapt the ToolbarComponent to your needs.

                                                                                                                                                                                                    OpenVidu Components - Custom Toolbar"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#4-run-the-openvidu-custom-toolbar-tutorial","title":"4. Run the openvidu-custom-toolbar tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-toolbar\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbar style=\"text-align: center;\">\n        <button (click)=\"toggleVideo()\">Toggle Video</button>\n        <button (click)=\"toggleAudio()\">Toggle Audio</button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-toolbar';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Toggles the camera on and off.\n  async toggleVideo() { // (6)!\n    const isCameraEnabled = this.participantService.isMyCameraEnabled();\n    await this.participantService.setCameraEnabled(!isCameraEnabled);\n  }\n\n  // Toggles the microphone on and off.\n  async toggleAudio() { // (7)!\n    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (8)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    7. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    8. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-toolbar/#customizing-the-toolbar","title":"Customizing the toolbar","text":"

                                                                                                                                                                                                    The *ov-toolbar directive allows you to replace the default toolbar with a custom one. This directive is applied to a div element that contains the custom toolbar elements.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbar style=\"text-align: center;\">\n        <button (click)=\"toggleVideo()\">Toggle Video</button>\n        <button (click)=\"toggleAudio()\">Toggle Audio</button>\n      </div>\n\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ov-toolbar directive is applied to a div element that contains two buttons. These buttons are used to toggle the camera and microphone on and off.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/","title":"Custom UI using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    Creating a unique and intuitive user interface (UI) is essential for ensuring a great user experience. OpenVidu Components Angular allows for flexibility in UI customization to fit your application's design requirements.

                                                                                                                                                                                                    OpenVidu Components - Custom UI"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#4-run-the-openvidu-custom-ui-tutorial","title":"4. Run the openvidu-custom-ui tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-custom-ui\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-custom-ui';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (6)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#customizing-the-ui","title":"Customizing the UI","text":"

                                                                                                                                                                                                    To customize the appearance of OpenVidu Components, simply redefine the necessary CSS variables in your styles.scss file. For instance, to change the primary color used throughout your application, you would update the --ov-primary-color variable as shown below:

                                                                                                                                                                                                    :root {\n  --ov-primary-color: #yourNewColor; /* Replace #yourNewColor with your chosen hex color code */\n\n  /* Others variables ... */\n}\n
                                                                                                                                                                                                    Once you redefine a variable, the new style will automatically apply to all components in the OpenVidu UI that use that variable.

                                                                                                                                                                                                    The library also allows you to customize shape of buttons, panels and videos customization, the background color personalization of panels, buttons and videoconference and also you can change the text color.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-custom-ui/#replacing-the-branding-logo","title":"Replacing the branding logo","text":"

                                                                                                                                                                                                    You can replace the branding logo with your own. Just modify the src/assets/images/logo.png file with your own logo.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/","title":"Add toggle hand feature using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toggle-hand tutorial demonstrates how to add a toggle hand feature to the OpenVidu Components Angular library.

                                                                                                                                                                                                    The toggle hand feature allows participants to raise and lower their hand during a videoconference. This feature is useful for participants to signal that they want to speak or ask a question.

                                                                                                                                                                                                    This tutorial combines the use of the ToolbarAdditionalButtonsDirective, the StreamDirective and the ParticipantsPanelItemElementsDirective to create a custom toolbar button, a custom stream component element and a custom participant panel item element. Check the openvidu-toolbar-buttons and the openvidu-custom-stream tutorials documentation for learning more about these directives.

                                                                                                                                                                                                    OpenVidu Components - Toggle Hand"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#4-run-the-openvidu-toggle-hand-tutorial","title":"4. Run the openvidu-toggle-hand tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toggle-hand\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toggle-hand/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    • app/models/participant-app.model.ts: Contains the ParticipantAppModel class that extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsmodels/participant-app.model.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import {\n  ParticipantModel,\n  ParticipantService,\n  OpenViduComponentsModule\n} from 'openvidu-components-angular';\n\nenum DataTopicApp {\n  HAND_TOGGLE = 'handToggle'\n}\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <!-- OpenVidu Video Conference Component -->\n    <ov-videoconference\n      [prejoin]=\"true\"\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n      (onRoomCreated)=\"handleRemoteHand($event)\"\n    >\n      <div *ovToolbarAdditionalButtons>\n        <button toolbar-btn mat-icon-button (click)=\"handleLocalHand()\" [class.active-btn]=\"hasHandRaised\">\n          <mat-icon matTooltip=\"Toggle hand\">front_hand</mat-icon>\n        </button>\n      </div>\n\n      <div *ovStream=\"let track\" style=\"height: 100%\">\n        <ov-stream [track]=\"track\"></ov-stream>\n        @if (track.participant.hasHandRaised) {\n        <mat-icon @inOutHandAnimation id=\"hand-notification\">front_hand</mat-icon>\n        }\n      </div>\n\n      <div *ovParticipantPanelItemElements=\"let participant\">\n        @if (participant.hasHandRaised) {\n        <mat-icon>front_hand</mat-icon>\n        }\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon]\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toggle-hand';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  // Whether the local participant has raised their hand.\n  hasHandRaised: boolean = false; // (5)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (6)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Handles the reception of a remote hand-raising event.\n  handleRemoteHand(room: Room) { // (7)!\n    // Subscribe to hand toggling events from other participants\n    room.on(RoomEvent.DataReceived, (payload: Uint8Array, participant?: RemoteParticipant, _?: DataPacket_Kind, topic?: string) => { // (8)!\n      if (topic === DataTopicApp.HAND_TOGGLE) {\n        const p = this.participantService.getRemoteParticipantBySid(participant.sid); // (9)!\n        if (p) {\n          (<ParticipantAppModel>p).toggleHandRaised(); // (10)!\n        }\n        this.participantService.updateRemoteParticipants(); // (11)!\n      }\n    });\n  }\n\n  // Handles the local hand-raising event.\n  async handleLocalHand() {  // (12)!\n    // Get local participant with ParticipantService\n    const participant = <ParticipantAppModel>this.participantService.getLocalParticipant(); // (13)!\n\n    // Toggle the participant hand with the method we wil add in our ParticipantAppModel\n    participant.toggleHandRaised(); // (14)!\n\n    // Refresh the local participant object for others component and services\n    this.participantService.updateLocalParticipant(); // (15)!\n\n    // Send a signal with the new value to others participant using the openvidu-browser signal\n    const strData = JSON.stringify({});\n    const data: Uint8Array = new TextEncoder().encode(strData);\n    const options: DataPublishOptions = { topic: DataTopicApp.HAND_TOGGLE };\n\n    await this.participantService.publishData(data, options); // (16)!\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (17)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    6. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    7. handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    8. on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    9. getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    10. toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    11. updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    12. handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    13. getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    14. toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    15. updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    16. publishData method that sends a signal to other participants.
                                                                                                                                                                                                    17. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • hasHandRaised: Boolean that indicates if the local participant has raised their hand.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • handleRemoteHand method that handles the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • on method that subscribes to the DataReceived event to handle the reception of a remote HAND_TOGGLE event.
                                                                                                                                                                                                    • getRemoteParticipantBySid method that retrieves a remote participant by its unique ID.
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of a remote participant.
                                                                                                                                                                                                    • updateRemoteParticipants method that updates the list of remote participants.
                                                                                                                                                                                                    • handleLocalHand method that handles the local HAND_TOGGLE event.
                                                                                                                                                                                                    • getLocalParticipant method that retrieves the local participant.
                                                                                                                                                                                                    • toggleHandRaised method that toggles the hand raising status of the local participant.
                                                                                                                                                                                                    • updateLocalParticipant method that updates the local participant.
                                                                                                                                                                                                    • publishData method that sends a signal to other participants.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The ParticipantAppModel class extends the ParticipantModel class to add the ability to raise and lower the hand.

                                                                                                                                                                                                      import { ParticipantModel, ParticipantProperties } from 'openvidu-components-angular';\n\n  // Represents a participant in the application, with the ability to raise their hand.\n  export class ParticipantAppModel extends ParticipantModel {\n\n    // Indicates whether the participant has raised their hand.\n    hasHandRaised: boolean;\n\n    //  Creates a new instance of ParticipantAppModel.\n    constructor(props: ParticipantProperties) {\n      super(props);\n      this.hasHandRaised = false;\n    }\n\n    // Toggles the participant's hand raised status.\n    toggleHandRaised() {\n      this.hasHandRaised = !this.hasHandRaised;\n    }\n  }\n

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/","title":"Add toolbar buttons using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toolbar-buttons tutorial demonstrates how to add custom buttons to the central part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    OpenVidu Components - Toolbar Buttons"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#4-run-the-openvidu-toolbar-buttons-tutorial","title":"4. Run the openvidu-toolbar-buttons tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-buttons\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { OpenViduComponentsModule, ParticipantService } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbarAdditionalButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleVideo()\">\n          <mat-icon>videocam</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleAudio()\">\n          <mat-icon>mic</mat-icon>\n        </button>\n      </div>\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toolbar-buttons';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient, private participantService: ParticipantService) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Toggles the camera on and off.\n  async toggleVideo() { // (6)!\n    const isCameraEnabled = this.participantService.isMyCameraEnabled();\n    await this.participantService.setCameraEnabled(!isCameraEnabled);\n  }\n\n  // Toggles the microphone on and off.\n  async toggleAudio() { // (7)!\n    const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n    await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (8)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    7. toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    8. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • toggleVideo method that toggles the camera on and off.
                                                                                                                                                                                                    • toggleAudio method that toggles the microphone on and off.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-buttons/#adding-additional-buttons-to-the-toolbar","title":"Adding additional buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalButtons that allows you to add custom buttons to the toolbar.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n  selector: 'app-root',\n  template:`\n    <ov-videoconference\n      [token]=\"token\"\n      [livekitUrl]=\"LIVEKIT_URL\"\n      (onTokenRequested)=\"onTokenRequested($event)\"\n    >\n      <div *ovToolbarAdditionalButtons style=\"text-align: center;\">\n        <button mat-icon-button (click)=\"toggleVideo()\">\n          <mat-icon>videocam</mat-icon>\n        </button>\n        <button mat-icon-button (click)=\"toggleAudio()\">\n          <mat-icon>mic</mat-icon>\n        </button>\n      </div>\n\n    </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n  imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalButtons directive is used to add two buttons to the toolbar. The mat-icon-button component from Angular Material is used to create the buttons. The toggleVideo and toggleAudio methods are called when the buttons are clicked.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/","title":"Add toolbar panel buttons using Angular Components","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    The openvidu-toolbar-panel-buttons tutorial demonstrates how to add custom buttons to the right part of the default toolbar in the OpenVidu Components Angular library.

                                                                                                                                                                                                    Adding toolbar buttons is made simple with the ToolbarAdditionalPanelButtonsDirective, which offers a straightforward way to add custom buttons to the ToolbarComponent.

                                                                                                                                                                                                    OpenVidu Components - Toolbar Panel Buttons"},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\ngit clone https://github.com/OpenVidu/openvidu-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#4-run-the-openvidu-toolbar-panel-buttons-tutorial","title":"4. Run the openvidu-toolbar-panel-buttons tutorial","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                        cd openvidu-tutorials/openvidu-components/openvidu-toolbar-panel-buttons\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                        npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                        npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080.

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This tutorial is an Angular project generated with Angular CLI tool. Therefore, you will see many configuration files and other components that are not the primary focus of this tutorial. We will concentrate on the following files in the src directory:

                                                                                                                                                                                                    • main.ts: This file defines the root application component. It imports the OpenViduComponentsModule, where we configure the OpenVidu Components Angular library.
                                                                                                                                                                                                    • app/app.component.ts: This file defines the AppComponent, the primary and sole component of the application. It is responsible for requesting the OpenVidu token and passing it to the videoconference component, facilitating the connection to the OpenVidu Room.
                                                                                                                                                                                                    • styles.scss: This file defines the global styles of the application. Here, you can customize the UI of the OpenVidu Components Angular library.

                                                                                                                                                                                                    To use OpenVidu Components Angular in your application, you need to install the library and import the OpenViduComponentsModule in your Angular module. Let's see how to do this:

                                                                                                                                                                                                    1. Create an Angular Project (version 17 or higher)

                                                                                                                                                                                                      To begin, you will need to create a new Angular project if you haven't already. Ensure you have Node.js and the Angular CLI installed. Then, run the following command to create a new Angular project:

                                                                                                                                                                                                      ng new your-project-name\n

                                                                                                                                                                                                      Replace your-project-name with the desired name for your project.

                                                                                                                                                                                                    2. Add Angular Material to your project

                                                                                                                                                                                                      OpenVidu Components Angular needs Angular Material, which provides a range of UI components. To add Angular Material to your project, navigate to your project directory and run:

                                                                                                                                                                                                      ng add @angular/material\n
                                                                                                                                                                                                    3. Install OpenVidu Components Angular

                                                                                                                                                                                                      With your Angular project set up, it's time to add videoconferencing capabilities with OpenVidu Components Angular. Install the library using npm:

                                                                                                                                                                                                      npm install openvidu-components-angular\n
                                                                                                                                                                                                    4. Import and use OpenVidu Components Angular

                                                                                                                                                                                                      To use OpenVidu Components Angular in your application, you need to:

                                                                                                                                                                                                      1. Import the OpenViduComponentsModule in your Angular application.
                                                                                                                                                                                                      2. Configure the module with the OpenViduComponentsConfig object.
                                                                                                                                                                                                      3. Add the component to your template file.
                                                                                                                                                                                                      4. Assign the OpenVidu token and LiveKit URL to the component.
                                                                                                                                                                                                      5. Customize the appearance of the components using CSS variables.
                                                                                                                                                                                                    main.tsapp.component.tsstyles.scss

                                                                                                                                                                                                    In your main.ts application file, import the it and configure it as follows:

                                                                                                                                                                                                    // Other imports ...\n\nimport { OpenViduComponentsModule, OpenViduComponentsConfig } from 'openvidu-components-angular';\n\nconst config: OpenViduComponentsConfig = {\n    production: true,\n};\n\nbootstrapApplication(AppComponent, {\n    providers: [\n        importProvidersFrom(\n            OpenViduComponentsModule.forRoot(config)\n            // Other imports ...\n        ),\n        provideAnimations(),\n    ],\n}).catch((err) => console.error(err));\n

                                                                                                                                                                                                    Use the ov-videoconference component to create a videoconference. This component requires a token to connect to the OpenVidu Room. The AppComponent class is responsible for requesting the token and passing it to the ov-videoconference component.

                                                                                                                                                                                                    import { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { OpenViduComponentsModule } from 'openvidu-components-angular';\n\n@Component({\n  selector: 'app-root',\n  template:`\n      <ov-videoconference\n        [token]=\"token\"\n        [livekitUrl]=\"LIVEKIT_URL\"\n        [toolbarDisplayRoomName]=\"false\"\n        (onTokenRequested)=\"onTokenRequested($event)\"\n      >\n        <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n          <button mat-icon-button (click)=\"onButtonClicked()\">\n            <mat-icon>star</mat-icon>\n          </button>\n        </div>\n      </ov-videoconference>\n  `,\n  styles: [''],\n  standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n  // For local development, leave these variables empty\n  // For production, configure them with correct URLs depending on your deployment\n\n  APPLICATION_SERVER_URL = '';  // (1)!\n  LIVEKIT_URL = ''; // (2)!\n\n  // The name of the room to join.\n  roomName = 'openvidu-toolbar-panel-buttons';  // (3)!\n\n  // The token used to join the room.\n  token!: string; // (4)!\n\n  constructor(private httpClient: HttpClient) {\n    this.configureUrls();\n  }\n\n  private configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from local development\n    if (!this.APPLICATION_SERVER_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n      } else {\n        this.APPLICATION_SERVER_URL =\n          'https://' + window.location.hostname + ':6443/';\n      }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from local development\n    if (!this.LIVEKIT_URL) {\n      if (window.location.hostname === 'localhost') {\n        this.LIVEKIT_URL = 'ws://localhost:7880/';\n      } else {\n        this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n      }\n    }\n  }\n\n  // Requests a token to join the room with the given participant name.\n  async onTokenRequested(participantName: string) { // (5)!\n    const { token } = await this.getToken(this.roomName, participantName);\n    this.token = token;\n  }\n\n  // Method to handle button click\n  onButtonClicked() { // (6)!\n    alert('button clicked');\n  }\n\n  // Retrieves a token to join the room with the given name and participant name.\n  getToken(roomName: string, participantName: string): Promise<any> { // (7)!\n    // Requesting token to the server application\n  }\n}\n
                                                                                                                                                                                                    1. APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    2. LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    3. roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    4. token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    5. onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    6. onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    7. getToken method that requests a token to the server application.

                                                                                                                                                                                                    The app.component.ts file declares the following properties and methods:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: URL to communicate the client application with the server application to request OpenVidu tokens.
                                                                                                                                                                                                    • LIVEKIT_URL: URL to communicate the client application with the LiveKit server.
                                                                                                                                                                                                    • roomName: OpenVidu Room identifier. This is the room where the VideoconferenceComponent will connect.
                                                                                                                                                                                                    • token: OpenVidu Token used to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onTokenRequested method that fires when the VideoconferenceComponent requests a token to connect to the OpenVidu Room.
                                                                                                                                                                                                    • onButtonClicked method that fires when the custom button is clicked.
                                                                                                                                                                                                    • getToken method that requests a token to the server application.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    The OpenVidu Components Angular library provides a set of CSS variables that you can use to customize the appearance of the components. You can define these variables in your application's global styles file (e.g. styles.scss).

                                                                                                                                                                                                    :root {\n    /* Basic colors */\n    --ov-background-color: #303030; // Background color\n    --ov-surface-color: #ffffff; // Surfaces colors (panels, dialogs)\n\n    /* Text colors */\n    --ov-text-primary-color: #ffffff; // Text color over primary background\n    --ov-text-surface-color: #1d1d1d; // Text color over surface background\n\n    /* Action colors */\n    --ov-primary-action-color: #273235; // Primary color for buttons, etc.\n    --ov-secondary-action-color: #f1f1f1; // Secondary color for buttons, etc.\n    --ov-accent-action-color: #0089ab; // Color for highlighted elements\n\n    /* Status colors */\n    --ov-error-color: #eb5144; // Error color\n    --ov-warn-color: #ffba53; // Warning color\n\n    /* Radius */\n    --ov-toolbar-buttons-radius: 50%; // Radius for toolbar buttons\n    --ov-leave-button-radius: 10px; // Radius for leave button\n    --ov-video-radius: 5px; // Radius for videos\n    --ov-surface-radius: 5px; // Radius for surfaces\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/#adding-custom-buttons-to-the-toolbar","title":"Adding custom buttons to the toolbar","text":"

                                                                                                                                                                                                    OpenVidu Components Angular provides a directive called *ovToolbarAdditionalPanelButtons that allows you to add custom buttons to the toolbar. This directive can be used to add buttons to the right part of the toolbar.

                                                                                                                                                                                                    In the app.component.ts file, you can see the following code snippet:

                                                                                                                                                                                                    @Component({\n    selector: 'app-root',\n    template: `\n        <ov-videoconference\n            [token]=\"token\"\n            [livekitUrl]=\"LIVEKIT_URL\"\n            [toolbarDisplayRoomName]=\"false\"\n            (onTokenRequested)=\"onTokenRequested($event)\"\n        >\n            <div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n                <button mat-icon-button (click)=\"onButtonClicked()\">\n                    <mat-icon>star</mat-icon>\n                </button>\n            </div>\n        </ov-videoconference>\n    `,\n    styles: [''],\n    standalone: true,\n    imports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n})\nexport class AppComponent {\n    // ...\n}\n

                                                                                                                                                                                                    In this code snippet, the *ovToolbarAdditionalPanelButtons directive is used to add a custom button to the right part of the toolbar and is displayed as a star icon, and the onButtonClicked method is called when the button is clicked.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/","title":"Application Client Tutorials","text":"

                                                                                                                                                                                                    Every application client below shares the same core functionality:

                                                                                                                                                                                                    • Users request a LiveKit token to any application server to connect to a room.
                                                                                                                                                                                                    • Users may publish their camera, microphone and screen-share.
                                                                                                                                                                                                    • Users automatically subscribe to all media published by other users.
                                                                                                                                                                                                    • Users may leave the room at any time.

                                                                                                                                                                                                    Every application client below is interchangeable with the others, because:

                                                                                                                                                                                                    • All of them are compatible with each other, meaning that participants are able to join the same LiveKit room from any of the client applications.
                                                                                                                                                                                                    • All of them are compatible with any application server, meaning that they can request a LiveKit token from any of the server applications.

                                                                                                                                                                                                    JavaScript

                                                                                                                                                                                                    React

                                                                                                                                                                                                    Angular

                                                                                                                                                                                                    Vue

                                                                                                                                                                                                    Electron

                                                                                                                                                                                                    Ionic

                                                                                                                                                                                                    Android

                                                                                                                                                                                                    iOS

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/","title":"Android Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built for Android, using Kotlin, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit Android Kotlin SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Android project has been generated with Android Studio. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the app/src/main/java directory:

                                                                                                                                                                                                    • MainActivity.kt: This file defines the main activity of the application, which allows the user to join a video call room by providing a room name and a user name.
                                                                                                                                                                                                    • RoomLayoutActivity.kt: Activity responsible for managing the video call room, including publishing and subscribing to video and audio tracks.
                                                                                                                                                                                                    • PaticipantAdapter.kt and ParticipantViewHolder.kt: These files define the Adapter and ViewHolder for the RecyclerView that displays the participants video tracks in the video call room.
                                                                                                                                                                                                    • Urls.kt: Object that contains the URLs of the application server and the LiveKit server.
                                                                                                                                                                                                    • ConfigureUrlsActivity.kt: Activity that allows the user to configure the URLs of the application server and the LiveKit server.

                                                                                                                                                                                                    The activity layout files are located in the app/src/main/res/layout directory.

                                                                                                                                                                                                    To use LiveKit in an Android application, you need to add the LiveKit Android Kotlin SDK as a dependency in the build.gradle.kts file. This dependecy provides the necessary classes and methods to interact with the LiveKit server:

                                                                                                                                                                                                    build.gradle.kts
                                                                                                                                                                                                    dependencies {\n    implementation 'io.livekit:livekit-android:2.5.0'\n}\n

                                                                                                                                                                                                    You will also need JitPack as a repository in the settings.gradle.kts file:

                                                                                                                                                                                                    settings.gradle.kts
                                                                                                                                                                                                    dependencyResolutionManagement {\n    //...\n    repositories {\n        google()\n        mavenCentral()\n        maven(\"https://jitpack.io\")\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#android-specific-requirements","title":"Android specific requirements","text":"

                                                                                                                                                                                                    In order to be able to test the application on an Android device, the application must ask for the necessary permissions to access the device's camera and microphone.

                                                                                                                                                                                                    First, you need to add the following permissions to the AndroidManifest.xml file located in the app/src/main directory:

                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                    <uses-permission android:name=\"android.permission.INTERNET\" />\n<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n

                                                                                                                                                                                                    Then, the app need to request these permissions when the user joins the video call room. This is done in the RoomLayoutActivity.kt file by calling the requestNeededPermissions method in the onCreate method:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun requestNeededPermissions(onHasPermissions: () -> Unit) {\n    val requestPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grants ->\n            var hasDenied = false\n\n            // Check if any permissions weren't granted\n            for (grant in grants.entries) {\n                if (!grant.value) {\n                    Toast.makeText(this, \"Missing permission: ${grant.key}\", Toast.LENGTH_SHORT)\n                        .show()\n\n                    hasDenied = true\n                }\n            }\n\n            if (!hasDenied) {\n                onHasPermissions()\n            }\n        }\n\n    // Assemble the needed permissions to request\n    val neededPermissions =\n        listOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA).filter {\n            ContextCompat.checkSelfPermission(\n                this, it\n            ) == PackageManager.PERMISSION_DENIED\n        }.toTypedArray()\n\n    if (neededPermissions.isNotEmpty()) {\n        requestPermissionLauncher.launch(neededPermissions)\n    } else {\n        onHasPermissions()\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    The Urls.kt file defines an object that contains the following URLs required for the application:

                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. In case you are running OpenVidu locally, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter the URLs when the application starts. This configuration is managed in the ConfigureUrlsActivity.kt file:

                                                                                                                                                                                                    When the user clicks the Save button, the onSaveUrls() method is called, which saves the URLs in the Urls object and finishes the activity, returning to the MainActivity:

                                                                                                                                                                                                    ConfigureUrlsActivity.kt
                                                                                                                                                                                                    private fun onSaveUrls() {\n    val serverUrl = binding.serverUrl.text.toString()\n    val livekitUrl = binding.livekitUrl.text.toString()\n\n    if (serverUrl.isNotEmpty() && livekitUrl.isNotEmpty()) {\n        Urls.livekitUrl = binding.livekitUrl.text.toString()\n        Urls.applicationServerUrl = binding.serverUrl.text.toString()\n        finish()\n    } else {\n        Toast.makeText(this, \"Please fill in all fields\", Toast.LENGTH_SHORT).show()\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#joining-a-room","title":"Joining a room","text":"

                                                                                                                                                                                                    Before joining a room, the user must provide a room name and a user name. After the user specifies them, when they click the Join button, the navigateToRoomLayoutActivity() method of the MainActivity.kt file is called, which simply set the values of the participant name and room name in the intent and starts the RoomLayoutActivity:

                                                                                                                                                                                                    MainActivity.kt
                                                                                                                                                                                                    private fun navigateToRoomLayoutActivity() {\n    binding.joinButton.isEnabled = false\n\n    val participantName = binding.participantName.text.toString()\n    val roomName = binding.roomName.text.toString()\n\n    if (participantName.isNotEmpty() && roomName.isNotEmpty()) {\n        val intent = Intent(this, RoomLayoutActivity::class.java)\n        intent.putExtra(\"participantName\", participantName)\n        intent.putExtra(\"roomName\", roomName)\n        startActivity(intent)\n    } else {\n        Toast.makeText(this, \"Please fill in all fields\", Toast.LENGTH_SHORT).show()\n    }\n\n    binding.joinButton.isEnabled = true\n}\n

                                                                                                                                                                                                    Now let's see the code of the RoomLayoutActivity.kt file:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    data class TrackInfo( // (1)!\n    val track: VideoTrack,\n    val participantIdentity: String,\n    val isLocal: Boolean = false\n)\n\nclass RoomLayoutActivity : AppCompatActivity() {\n    private lateinit var binding: ActivityRoomLayoutBinding // (2)!\n    private lateinit var participantAdapter: ParticipantAdapter // (3)!\n\n    private lateinit var room: Room // (4)!\n    private val participantTracks: MutableList<TrackInfo> = mutableListOf() // (5)!\n\n    private val client = HttpClient(CIO) { // (6)!\n        expectSuccess = true\n        install(ContentNegotiation) {\n            json()\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo data class, which groups a video track with the participant's identity.
                                                                                                                                                                                                    2. The binding object for the activity layout.
                                                                                                                                                                                                    3. The adapter for the RecyclerView that displays the participants' video tracks.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. A list of TrackInfo objects, which represent the video tracks of the participants in the room.
                                                                                                                                                                                                    6. The HTTP client used to make requests to the application server.

                                                                                                                                                                                                    The RoomLayoutActivity.kt file defines the following variables:

                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • participantTracks: A list of TrackInfo objects, which represent the video tracks of the participants in the room.

                                                                                                                                                                                                    When the activity is created, the onCreate method is called. This method initializes the activity layout, create a Room object, initializes the RecyclerView and request needed permissions:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityRoomLayoutBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.loader.visibility = View.VISIBLE\n    binding.leaveButton.setOnClickListener {\n        leaveRoom()\n    }\n\n    // Create Room object\n    room = LiveKit.create(applicationContext)\n\n    initRecyclerView()\n\n    // Check for audio and camera permissions before connecting to the room\n    requestNeededPermissions { connectToRoom() }\n}\n

                                                                                                                                                                                                    After the application check if the user has granted permissions, the connectToRoom() method is called:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun connectToRoom() {\n    // Get the room name and participant name from the intent\n    val participantName = intent.getStringExtra(\"participantName\") ?: \"Participant1\" // (1)!\n    val roomName = intent.getStringExtra(\"roomName\") ?: \"Test Room\"\n\n    binding.roomName.text = roomName // (2)!\n\n    lifecycleScope.launch {\n        // Specify the actions when events take place in the room\n        launch {\n            room.events.collect { event ->\n                when (event) {\n                    // On every new Track received...\n                    is RoomEvent.TrackSubscribed -> onTrackSubscribed(event) // (3)!\n                    // On every new Track destroyed...\n                    is RoomEvent.TrackUnsubscribed -> onTrackUnsubscribed(event) // (4)!\n                    else -> {}\n                }\n            }\n        }\n\n        try {\n            // Get token from your application server with the room name and participant name\n            val token = getToken(roomName, participantName) // (5)!\n\n            // Connect to the room with the LiveKit URL and the token\n            room.connect(Urls.livekitUrl, token) // (6)!\n\n            // Publish your camera and microphone\n            val localParticipant = room.localParticipant\n            localParticipant.setMicrophoneEnabled(true) // (7)!\n            localParticipant.setCameraEnabled(true)\n\n            // Add local video track to the participantTracks list\n            launch {\n                localParticipant::videoTrackPublications.flow\n                    .collect { publications ->\n                        val videoTrack = publications.firstOrNull()?.second as? VideoTrack\n\n                        if (videoTrack != null) {\n                            participantTracks.add( // (8)!\n                                0,\n                                TrackInfo(videoTrack, participantName, true)\n                            )\n                            participantAdapter.notifyItemInserted(0)\n                        }\n                    }\n            }\n\n            binding.loader.visibility = View.GONE\n        } catch (e: Exception) {\n            println(\"There was an error connecting to the room: ${e.message}\")\n            Toast.makeText(this@RoomLayoutActivity, \"Failed to join room\", Toast.LENGTH_SHORT)\n                .show()\n            leaveRoom()\n        }\n    }\n}\n
                                                                                                                                                                                                    1. Get the room name and participant name from the intent.
                                                                                                                                                                                                    2. Set the room title in the layout.
                                                                                                                                                                                                    3. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    4. Event handling for when a track is destroyed.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.
                                                                                                                                                                                                    8. Add local video track to the participantTracks list

                                                                                                                                                                                                    The connectToRoom() method performs the following actions:

                                                                                                                                                                                                    1. It retrieves the room name and participant name from the intent.
                                                                                                                                                                                                    2. Set the room title in the layout.
                                                                                                                                                                                                    3. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the participantTracks list if it is a video track and notify the Adapter that a new item has been inserted.
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackSubscribed(event: RoomEvent.TrackSubscribed) {\n    val track = event.track\n\n    // If the track is a video track, add it to the participantTracks list\n    if (track is VideoTrack) {\n        participantTracks.add(TrackInfo(track, event.participant.identity!!.value))\n        participantAdapter.notifyItemInserted(participantTracks.size - 1)\n    }\n}\n
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the video track from the participantTracks list and notify the Adapter that an item has been removed.
                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      private fun onTrackUnsubscribed(event: RoomEvent.TrackUnsubscribed) {\n    val track = event.track\n\n    // If the track is a video track, remove it from the participantTracks list\n    if (track is VideoTrack) {\n        val index = participantTracks.indexOfFirst { it.track.sid == track.sid }\n\n        if (index != -1) {\n            participantTracks.removeAt(index)\n            participantAdapter.notifyItemRemoved(index)\n        }\n    }\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      RoomLayoutActivity.kt
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nprivate suspend fun getToken(roomName: String, participantName: String): String {\n    val response = client.post(Urls.applicationServerUrl + \"token\") {\n        contentType(ContentType.Application.Json)\n        setBody(TokenRequest(participantName, roomName))\n    }\n    return response.body<TokenResponse>().token\n}\n

                                                                                                                                                                                                      This method sends a POST request using Ktor Client to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using setMicrophoneEnabled() and setCameraEnabled() methods from room.localParticipant.
                                                                                                                                                                                                    7. It adds the local video track to the participantTracks list.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#displaying-video-tracks","title":"Displaying Video Tracks","text":"

                                                                                                                                                                                                    In order to display the video tracks of the participants in the room, the RoomLayoutActivity uses a RecyclerView with a custom Adapter and ViewHolder. This allows the application to load and display the video tracks dynamically as they are received.

                                                                                                                                                                                                    Whenever a new video track is added to the participantTracks list, the ParticipantAdapter is notified that a new item has been inserted. The ParticipantAdapter then updates the RecyclerView to display the new video track by calling the render method of the ParticipantViewHolder:

                                                                                                                                                                                                    ParticipantViewHolder.kt
                                                                                                                                                                                                    fun render(trackInfo: TrackInfo, room: Room) {\n    val participantIdentity = if (trackInfo.isLocal) {\n        trackInfo.participantIdentity + \" (You)\"\n    } else {\n        trackInfo.participantIdentity\n    }\n\n    binding.identity.text = participantIdentity // (1)!\n\n    // Only initialize the renderer once\n    if (!used) {\n        room.initVideoRenderer(binding.renderer) // (2)!\n        used = true\n    }\n\n    trackInfo.track.addRenderer(binding.renderer) // (3)!\n}\n
                                                                                                                                                                                                    1. Set the participant identity in the layout.
                                                                                                                                                                                                    2. Initialize the video renderer for the participant.
                                                                                                                                                                                                    3. Add the video track to the renderer.

                                                                                                                                                                                                    The render method performs the following actions:

                                                                                                                                                                                                    • It sets the participant identity in the layout.
                                                                                                                                                                                                    • It initializes the video renderer for the participant. This is done only once for each participant.
                                                                                                                                                                                                    • It adds the video track to the renderer.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/android/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    RoomLayoutActivity.kt
                                                                                                                                                                                                    private fun leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    room.disconnect() // (1)!\n\n    client.close() // (2)!\n\n    // Go back to the previous activity.\n    finish() // (3)!\n}\n\noverride fun onDestroy() { // (4)!\n    super.onDestroy()\n    leaveRoom()\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Close the HTTP client.
                                                                                                                                                                                                    3. Finish the activity and go back to the previous activity.
                                                                                                                                                                                                    4. Call the leaveRoom() method when the activity is destroyed.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It closes the HTTP client.
                                                                                                                                                                                                    • It finishes the activity and goes back to the previous activity.

                                                                                                                                                                                                    The onDestroy() lifecycle method is used to ensure that the user leaves the room when the activity is destroyed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/","title":"Angular Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Angular that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Angular project has been created using the Angular CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • app.component.css: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Angular application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nvar APPLICATION_SERVER_URL = ''; // (2)!\nvar LIVEKIT_URL = ''; // (3)!\n\n@Component({ // (4)!\n    selector: 'app-root',\n    standalone: true,\n    imports: [ReactiveFormsModule, AudioComponent, VideoComponent],\n    templateUrl: './app.component.html',\n    styleUrl: './app.component.css',\n})\nexport class AppComponent implements OnDestroy {\n    roomForm = new FormGroup({ // (5)!\n        roomName: new FormControl('Test Room', Validators.required),\n        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),\n    });\n\n    room = signal<Room | undefined>(undefined); // (6)!\n    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (7)!\n    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (8)!\n\n    constructor(private httpClient: HttpClient) {\n        this.configureUrls();\n    }\n\n    configureUrls() {\n        // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n        if (!APPLICATION_SERVER_URL) {\n            if (window.location.hostname === 'localhost') {\n                APPLICATION_SERVER_URL = 'http://localhost:6080/';\n            } else {\n                APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';\n            }\n        }\n\n        // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n        if (!LIVEKIT_URL) {\n            if (window.location.hostname === 'localhost') {\n                LIVEKIT_URL = 'ws://localhost:7880/';\n            } else {\n                LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n            }\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    5. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    6. The room object, which represents the video call room.
                                                                                                                                                                                                    7. The local video track, which represents the user's camera.
                                                                                                                                                                                                    8. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {\n    // Initialize a new Room object\n    const room = new Room();\n    this.room.set(room); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    this.room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!\n            this.remoteTracksMap.update((map) => {\n                map.set(publication.trackSid, {\n                    trackPublication: publication,\n                    participantIdentity: participant.identity,\n                });\n                return map;\n            });\n        }\n    );\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!\n        this.remoteTracksMap.update((map) => {\n            map.delete(publication.trackSid);\n            return map;\n        });\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = this.roomForm.value.roomName!; // (4)!\n        const participantName = this.roomForm.value.participantName!;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await this.getToken(roomName, participantName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (7)!\n        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error: any) {\n        console.log(\n            'There was an error connecting to the room:',\n            error?.error?.errorMessage || error?.message || error\n        );\n        await this.leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync getToken(roomName: string, participantName: string): Promise<string> {\n    const response = await lastValueFrom(\n        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })\n    );\n    return response.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    <div id=\"layout-container\">\n    @if (localTrack()) {\n    <video-component\n        [track]=\"localTrack()!\"\n        [participantIdentity]=\"roomForm.value.participantName!\"\n        [local]=\"true\"\n    ></video-component>\n    }\n    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {\n        @if (remoteTrack.trackPublication.kind === 'video') {\n        <video-component\n            [track]=\"remoteTrack.trackPublication.videoTrack!\"\n            [participantIdentity]=\"remoteTrack.participantIdentity\"\n        ></video-component>\n        } @else {\n        <audio-component [track]=\"remoteTrack.trackPublication.audioTrack!\" hidden></audio-component>\n        }\n    }\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: 'video-component',\n    standalone: true,\n    imports: [],\n    templateUrl: './video.component.html',\n    styleUrl: './video.component.css',\n})\nexport class VideoComponent implements AfterViewInit, OnDestroy {\n    videoElement = viewChild<ElementRef<HTMLVideoElement>>('videoElement'); // (2)!\n\n    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!\n    participantIdentity = input.required<string>(); // (4)!\n    local = input(false); // (5)!\n\n    ngAfterViewInit() {\n        if (this.videoElement()) {\n            this.track().attach(this.videoElement()!.nativeElement); // (6)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (7)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the video element in the HTML template.
                                                                                                                                                                                                    3. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    4. The participant identity associated with the video track.
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    7. Detach the video track when the component is destroyed.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: 'audio-component',\n    standalone: true,\n    imports: [],\n    templateUrl: './audio.component.html',\n    styleUrl: './audio.component.css',\n})\nexport class AudioComponent implements AfterViewInit, OnDestroy {\n    audioElement = viewChild<ElementRef<HTMLAudioElement>>('audioElement'); // (2)!\n\n    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!\n\n    ngAfterViewInit() {\n        if (this.audioElement()) {\n            this.track().attach(this.audioElement()!.nativeElement); // (4)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (5)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    4. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    5. Detach the audio track when the component is destroyed.

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/angular/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await this.room()?.disconnect(); // (1)!\n\n    // Reset all variables\n    this.room.set(undefined); // (2)!\n    this.localTrack.set(undefined);\n    this.remoteTracksMap.set(new Map());\n}\n\n@HostListener('window:beforeunload') // (3)!\nasync ngOnDestroy() {\n    // On window closed or component destroyed, leave the room\n    await this.leaveRoom();\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables.
                                                                                                                                                                                                    3. Call the leaveRoom() method when the user closes the browser window or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It resets all variables.

                                                                                                                                                                                                    The window.onbeforeunload event and the ngOnDestroy() lifecycle hook are used to ensure that the user leaves the room when the browser window is closed or the component is destroyed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/","title":"Electron Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Electron that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Electron project has been created using electron-forge. As an Electron application, the code is divided into two main parts, the main process and the renderer process. The most important files are located within the src/ directory:

                                                                                                                                                                                                    • index.js: This file is the entry point (main process) for the Electron application. It creates the main window and loads the index.html file.
                                                                                                                                                                                                    • app.js: This file constitutes the renderer process code, responsible for the application UI and logic. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Electron application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    const { Room, RoomEvent } = require(\"livekit-client\"); // (1)!\n\n// Configure these constants with correct URLs depending on your deployment\nconst APPLICATION_SERVER_URL = \"http://localhost:6080/\"; // (2)!\nconst LIVEKIT_URL = \"ws://localhost:7880/\"; // (3)!\n\nvar room; // (4)!\n
                                                                                                                                                                                                    1. Import the Room and RoomEvent classes from the livekit-client package.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    You should configure APPLICATION_SERVER_URL and LIVEKIT_URL constants with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        // (2)!\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        // (3)!\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value; // (4)!\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName; // (7)!\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (8)!\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Hide the \"Join room\" page and show the \"Room\" page.
                                                                                                                                                                                                    8. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.
                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {\n    const element = track.attach(); // (1)!\n    element.id = track.sid;\n\n    /* If the track is a video track, we create a container and append the video element to it\n    with the participant's identity */\n    if (track.kind === \"video\") {\n        const videoContainer = createVideoContainer(participantIdentity, local);\n        videoContainer.append(element);\n        appendParticipantData(videoContainer, participantIdentity + (local ? \" (You)\" : \"\"));\n    } else {\n        document.getElementById(\"layout-container\").append(element);\n    }\n}\n
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {\n    const videoContainer = document.createElement(\"div\");\n    videoContainer.id = `camera-${participantIdentity}`;\n    videoContainer.className = \"video-container\";\n    const layoutContainer = document.getElementById(\"layout-container\");\n\n    if (local) {\n        layoutContainer.prepend(videoContainer);\n    } else {\n        layoutContainer.append(videoContainer);\n    }\n\n    return videoContainer;\n}\n\nfunction appendParticipantData(videoContainer, participantIdentity) {\n    const dataElement = document.createElement(\"div\");\n    dataElement.className = \"participant-data\";\n    dataElement.innerHTML = `<p>${participantIdentity}</p>`;\n    videoContainer.prepend(dataElement);\n}\n
                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {\n    const videoContainer = document.getElementById(`camera-${participantIdentity}`);\n    videoContainer?.remove();\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName, participantName) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const token = await response.json();\n    return token.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It updates the UI to hide the \"Join room\" page and show the \"Room\" layout.
                                                                                                                                                                                                    7. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/electron/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.disconnect(); // (1)!\n\n    // Remove all HTML elements inside the layout container\n    removeAllLayoutElements(); // (2)!\n\n    // Back to 'Join room' page\n    document.getElementById(\"join\").hidden = false; // (3)!\n    document.getElementById(\"room\").hidden = true;\n\n    // Enable 'Join' button\n    document.getElementById(\"join-button\").disabled = false;\n    document.getElementById(\"join-button\").innerText = \"Join!\";\n}\n\n// (4)!\nwindow.onbeforeunload = () => {\n    room?.disconnect();\n};\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    3. Show the \"Join room\" page and hide the \"Room\" layout.
                                                                                                                                                                                                    4. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • It shows the \"Join room\" page and hides the \"Room\" layout.

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/","title":"Ionic Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Ionic, using Angular and Capacitor, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Ionic project has been created using the Ionic CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/app/ directory:

                                                                                                                                                                                                    • app.component.ts: This file defines the AppComponent, which serves as the main component of the application. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • app.component.html: This HTML file is associated with the AppComponent, and it dictates the structure and layout of the main application component.
                                                                                                                                                                                                    • app.component.scss: The CSS file linked to AppComponent, which controls the styling and appearance of the application's main component.
                                                                                                                                                                                                    • VideoComponent: Component responsible for displaying video tracks along with participant's data. It is defined in the video.component.ts file within the video directory, along with its associated HTML and CSS files.
                                                                                                                                                                                                    • AudioComponent: Component responsible for displaying audio tracks. It is defined in the audio.component.ts file within the audio directory, along with its associated HTML and CSS files.

                                                                                                                                                                                                    To use the LiveKit JS SDK in an Ionic application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the app.component.ts file:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally and launching app in web browser, leave these variables empty\n// For other deployment type or when launching app in a mobile device, configure them with correct URLs\n// If you leave them empty when launching app in a mobile device, the user will be prompted to enter the URLs\nvar APPLICATION_SERVER_URL = ''; // (2)!\nvar LIVEKIT_URL = ''; // (3)!\n\n@Component({ // (4)!\n    selector: 'app-root',\n    templateUrl: 'app.component.html',\n    styleUrl: 'app.component.scss',\n    standalone: true,\n    imports: [\n        IonApp,\n        VideoComponent,\n        AudioComponent,\n        ReactiveFormsModule,\n        IonHeader,\n        IonToolbar,\n        IonTitle,\n        IonButtons,\n        IonButton,\n        IonIcon,\n        IonContent,\n        IonList,\n        IonItem,\n        IonInput,\n        IonFooter,\n    ],\n})\nexport class AppComponent implements OnDestroy {\n    roomForm = new FormGroup({ // (5)!\n        roomName: new FormControl('Test Room', Validators.required),\n        participantName: new FormControl('Participant' + Math.floor(Math.random() * 100), Validators.required),\n    });\n\n    urlsForm = new FormGroup({ // (6)!\n        serverUrl: new FormControl(APPLICATION_SERVER_URL, Validators.required),\n        livekitUrl: new FormControl(LIVEKIT_URL, Validators.required),\n    });\n\n    room = signal<Room | undefined>(undefined); // (7)!\n    localTrack = signal<LocalVideoTrack | undefined>(undefined); // (8)!\n    remoteTracksMap = signal<Map<string, TrackInfo>>(new Map()); // (9)!\n\n    settingUrls = signal(false); // (10)!\n\n    constructor(private httpClient: HttpClient, private platform: Platform) {\n        this.configureUrls();\n        addIcons({\n            logoGithub,\n            book,\n            settings,\n        });\n    }\n\n    configureUrls() {\n        const mobileMode = this.platform.is('hybrid');\n\n        // If URLs are not configured and app is launched in a mobile device,\n        // prompt the user to configure them\n        if (mobileMode) {\n            if (!APPLICATION_SERVER_URL || !LIVEKIT_URL) {\n                this.settingUrls.set(true);\n            }\n        } else {\n            // If APPLICATION_SERVER_URL is not configured and app is not launched in a mobile device,\n            // use default value from OpenVidu Local deployment\n            if (!APPLICATION_SERVER_URL) {\n                if (window.location.hostname === 'localhost') {\n                    APPLICATION_SERVER_URL = 'http://localhost:6080/';\n                } else {\n                    APPLICATION_SERVER_URL = 'https://' + window.location.hostname + ':6443/';\n                }\n            }\n\n            // If LIVEKIT_URL is not configured and app is not launched in a mobile device,\n            // use default value from OpenVidu Local deployment\n            if (!LIVEKIT_URL) {\n                if (window.location.hostname === 'localhost') {\n                    LIVEKIT_URL = 'ws://localhost:7880/';\n                } else {\n                    LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n                }\n            }\n        }\n    }\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. Angular component decorator that defines the AppComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    5. The roomForm object, which is a form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    6. The urlsForm object, which is a form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    7. The room object, which represents the video call room.
                                                                                                                                                                                                    8. The local video track, which represents the user's camera.
                                                                                                                                                                                                    9. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    10. A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.

                                                                                                                                                                                                    The app.component.ts file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • roomForm: A form group that contains the roomName and participantName fields. These fields are used to join a video call room.
                                                                                                                                                                                                    • urlsForm: A form group that contains the serverUrl and livekitUrl fields. These fields are used to configure the application server and LiveKit URLs.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • settingUrls: A boolean flag that indicates whether the user is configuring the application server and LiveKit URLs.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    When running OpenVidu locally and launching the app in a web browser, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type or when launching the app in a mobile device, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    In case you are running OpenVidu locally and launching the app in a mobile device, you can set the applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and the livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www part of the domain is the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If you leave them empty and app is launched in a mobile device, the user will be prompted to enter the URLs when the application starts:

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() method is called:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async joinRoom() {\n    // Initialize a new Room object\n    const room = new Room();\n    this.room.set(room); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    this.room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => { // (2)!\n            this.remoteTracksMap.update((map) => {\n                map.set(publication.trackSid, {\n                    trackPublication: publication,\n                    participantIdentity: participant.identity,\n                });\n                return map;\n            });\n        }\n    );\n\n    // On every new Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => { // (3)!\n        this.remoteTracksMap.update((map) => {\n            map.delete(publication.trackSid);\n            return map;\n        });\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = this.roomForm.value.roomName!; // (4)!\n        const participantName = this.roomForm.value.participantName!;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await this.getToken(roomName, participantName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (7)!\n        this.localTrack.set(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error: any) {\n        console.log(\n            'There was an error connecting to the room:',\n            error?.error?.errorMessage || error?.message || error\n        );\n        await this.leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() method performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() method:

                                                                                                                                                                                                      app.component.ts
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync getToken(roomName: string, participantName: string): Promise<string> {\n    const response = await lastValueFrom(\n        this.httpClient.post<{ token: string }>(APPLICATION_SERVER_URL + 'token', { roomName, participantName })\n    );\n    return response.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using HttpClient to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the app.component.html file integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    app.component.html
                                                                                                                                                                                                    <div id=\"layout-container\">\n    @if (localTrack()) {\n    <video-component\n        [track]=\"localTrack()!\"\n        [participantIdentity]=\"roomForm.value.participantName!\"\n        [local]=\"true\"\n    ></video-component>\n    }\n    @for (remoteTrack of remoteTracksMap().values(); track remoteTrack.trackPublication.trackSid) {\n        @if (remoteTrack.trackPublication.kind === 'video') {\n        <video-component\n            [track]=\"remoteTrack.trackPublication.videoTrack!\"\n            [participantIdentity]=\"remoteTrack.participantIdentity\"\n        ></video-component>\n        } @else {\n        <audio-component [track]=\"remoteTrack.trackPublication.audioTrack!\" hidden></audio-component>\n        }\n    }\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the Angular @if block to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the Angular @for block to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the video.component.ts file:

                                                                                                                                                                                                    video.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: \"video-component\",\n    standalone: true,\n    imports: [],\n    templateUrl: \"./video.component.html\",\n    styleUrl: \"./video.component.css\"\n})\nexport class VideoComponent implements AfterViewInit, OnDestroy {\n    videoElement = viewChild<ElementRef<HTMLVideoElement>>(\"videoElement\"); // (2)!\n\n    track = input.required<LocalVideoTrack | RemoteVideoTrack>(); // (3)!\n    participantIdentity = input.required<string>(); // (4)!\n    local = input(false); // (5)!\n\n    ngAfterViewInit() {\n        if (this.videoElement()) {\n            this.track().attach(this.videoElement()!.nativeElement); // (6)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (7)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the VideoComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the video element in the HTML template.
                                                                                                                                                                                                    3. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    4. The participant identity associated with the video track.
                                                                                                                                                                                                    5. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    6. Attach the video track to the video element when the track is set.
                                                                                                                                                                                                    7. Detach the video track when the component is destroyed.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as inputs of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the view is initialized.
                                                                                                                                                                                                    • It detaches the video track when the component is destroyed.

                                                                                                                                                                                                    Finally, let's see the code of the audio.component.ts file:

                                                                                                                                                                                                    audio.component.ts
                                                                                                                                                                                                    // (1)!\n@Component({\n    selector: \"audio-component\",\n    standalone: true,\n    imports: [],\n    templateUrl: \"./audio.component.html\",\n    styleUrl: \"./audio.component.css\"\n})\nexport class AudioComponent implements AfterViewInit, OnDestroy {\n    audioElement = viewChild<ElementRef<HTMLAudioElement>>(\"audioElement\"); // (2)!\n\n    track = input.required<LocalAudioTrack | RemoteAudioTrack>(); // (3)!\n\n    ngAfterViewInit() {\n        if (this.audioElement()) {\n            this.track().attach(this.audioElement()!.nativeElement); // (4)!\n        }\n    }\n\n    ngOnDestroy() {\n        this.track().detach(); // (5)!\n    }\n}\n
                                                                                                                                                                                                    1. Angular component decorator that defines the AudioComponent class and associates the HTML and CSS files with it.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. The audio track object, which can be a RemoteAudioTrack or a LocalAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    4. Attach the audio track to the audio element when view is initialized.
                                                                                                                                                                                                    5. Detach the audio track when the component is destroyed.

                                                                                                                                                                                                    The AudioComponent class is similar to the VideoComponent class, but it is used to display audio tracks. It attaches the audio track to the audio element when view is initialized and detaches the audio track when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() method:

                                                                                                                                                                                                    app.component.ts
                                                                                                                                                                                                    async leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await this.room()?.disconnect(); // (1)!\n\n    // Reset all variables\n    this.room.set(undefined); // (2)!\n    this.localTrack.set(undefined);\n    this.remoteTracksMap.set(new Map());\n}\n\nasync ngOnDestroy() { // (3)!\n    // On window closed or component destroyed, leave the room\n    await this.leaveRoom();\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables.
                                                                                                                                                                                                    3. Call the leaveRoom() method when the component is destroyed.

                                                                                                                                                                                                    The leaveRoom() method performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It resets all variables.

                                                                                                                                                                                                    The ngOnDestroy() lifecycle hook is used to ensure that the user leaves the room when the component is destroyed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ionic/#specific-mobile-requirements","title":"Specific mobile requirements","text":"

                                                                                                                                                                                                    In order to be able to test the application on an Android or iOS device, the application must ask for the necessary permissions to access the device's camera and microphone. These permissions are requested when the user joins the video call room.

                                                                                                                                                                                                    Android iOS

                                                                                                                                                                                                    The application must include the following permissions in the AndroidManifest.xml file located in the android/app/src/main directory:

                                                                                                                                                                                                    AndroidManifest.xml
                                                                                                                                                                                                    <uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n

                                                                                                                                                                                                    The application must include the following permissions in the Info.plist file located in the ios/App/App directory:

                                                                                                                                                                                                    Info.plist
                                                                                                                                                                                                    <key>NSCameraUsageDescription</key>\n<string>This Application uses your camera to make video calls.</string>\n<key>NSMicrophoneUsageDescription</key>\n<string>This Application uses your microphone to make calls.</string>\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/","title":"iOS Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built for iOS, using Swift, that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit Swift SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#understanding-the-code","title":"Understanding the Code","text":"

                                                                                                                                                                                                    This iOS project, created with Xcode and written in Swift, includes various files and directories. For this tutorial, focus on the following key components within the openvidu-ios/Shared directory:

                                                                                                                                                                                                    • OpenViduApp.swift: Initializes the application and sets up the main view.
                                                                                                                                                                                                    • Support: Contains files for secure storage, token management, and other support functions.
                                                                                                                                                                                                    • Utils: Includes utility files like HttpClient.swift for HTTP networking.
                                                                                                                                                                                                    • Views: Houses the user interface components of the application.
                                                                                                                                                                                                    • Contexts: Manages application state and room contexts for LiveKit interaction.
                                                                                                                                                                                                    • Assets.xcassets: Stores images and color assets used in the app.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#integrating-livekit","title":"Integrating LiveKit","text":"

                                                                                                                                                                                                    To use LiveKit in your iOS app, you need to add the LiveKit Swift SDK as a Swift Package. You can do this using either Package.swift or Xcode.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#adding-livekit-via-packageswift","title":"Adding LiveKit via Package.swift","text":"
                                                                                                                                                                                                    1. Open your Package.swift file.
                                                                                                                                                                                                    2. Add LiveKit to the dependencies array.
                                                                                                                                                                                                    3. Include LiveKit in the targets array.

                                                                                                                                                                                                    Example Package.swift:

                                                                                                                                                                                                    // swift-tools-version:5.3\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyApp\",\n    platforms: [.iOS(.v14)],\n    dependencies: [\n        .package(name: \"LiveKit\", url: \"https://github.com/livekit/client-sdk-swift.git\", .upToNextMajor(from: \"2.0.12\"))\n    ],\n    targets: [\n        .target(\n            name: \"MyApp\",\n            dependencies: [\"LiveKit\"]\n        )\n    ]\n)\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#adding-livekit-via-xcode","title":"Adding LiveKit via Xcode","text":"
                                                                                                                                                                                                    1. Open your Xcode project.
                                                                                                                                                                                                    2. Go to Project Settings.
                                                                                                                                                                                                    3. Select the Swift Packages tab.
                                                                                                                                                                                                    4. Click the + button to add a new package.
                                                                                                                                                                                                    5. Enter the URL: https://github.com/livekit/client-sdk-swift.
                                                                                                                                                                                                    6. Choose the version you want, such as \"Up to Next Major Version\" with 2.0.12.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#ios-specific-requirements","title":"iOS Specific Requirements","text":"

                                                                                                                                                                                                    To test the application on an iOS device, you need to ensure it has permission to access the camera and microphone. These configurations are already included in this project. However, if you're starting a new project, follow these steps:

                                                                                                                                                                                                    1. Add Permissions to Info.plist

                                                                                                                                                                                                      Include the following keys in your Info.plist file to request access to the camera and microphone:

                                                                                                                                                                                                      <key>NSCameraUsageDescription</key>\n<string>$(PRODUCT_NAME) needs camera access to capture and transmit video</string>\n<key>NSMicrophoneUsageDescription</key>\n<string>$(PRODUCT_NAME) needs microphone access to capture and transmit audio</string>\n
                                                                                                                                                                                                    2. Automatic Permission Requests

                                                                                                                                                                                                      The app will automatically request these permissions when it runs.

                                                                                                                                                                                                    3. Check Permissions

                                                                                                                                                                                                      To verify if the permissions were granted, use the AVCaptureDevice.requestAccess(for: .video) method:

                                                                                                                                                                                                      AVCaptureDevice.requestAccess(for: .video) { granted in\n    if granted {\n        print(\"Camera access granted\")\n    } else {\n        print(\"Camera access denied\")\n    }\n}\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#configuring-urls","title":"Configuring URLs","text":"

                                                                                                                                                                                                    The ConfigureUrlsView.swift file defines a SwiftUI view for configuring the URLs required for the application:

                                                                                                                                                                                                    • applicationServerUrl: The URL of the application server used to obtain tokens for joining the video call room.
                                                                                                                                                                                                    • livekitUrl: The URL of the LiveKit server used to connect to the video call room and handle video communication.

                                                                                                                                                                                                    You should configure these URLs according to your deployment settings. If you are running OpenVidu locally, you can set applicationServerUrl to https://xxx-yyy-zzz-www.openvidu-local.dev:6443 and livekitUrl to wss://xxx-yyy-zzz-www.openvidu-local.dev:7443, where xxx-yyy-zzz-www represents the LAN private IP address of the machine running OpenVidu, with dashes (-) instead of dots (.).

                                                                                                                                                                                                    If these URLs are left empty, the user will be prompted to enter them when the application starts. This configuration is managed in the ConfigureUrlsView.swift file:

                                                                                                                                                                                                    When the user clicks the Save button, the LKButton action triggers the validation and saves the URLs into the AppContext and RoomContext. The ConfigureUrlsView handles this logic:

                                                                                                                                                                                                    ConfigureUrlsView.swift
                                                                                                                                                                                                    LKButton(title: \"Save\") {\n    Task.detached { @MainActor in\n        let isApplicationServerValid = isValidURL(self.applicationServerUrl)\n        let isLivekitUrlValid = isValidURL(self.livekitUrl)\n\n        if !isApplicationServerValid || !isLivekitUrlValid {\n            print(\"Invalid URLs\")\n            errorMessage = \"There was an error with the URL values\"\n            return\n        }\n        appCtx.applicationServerUrl = self.applicationServerUrl\n        roomCtx.livekitUrl = self.livekitUrl\n        errorMessage = \"\"\n    }\n}\n

                                                                                                                                                                                                    In this code snippet, the isValidURL function checks the validity of the URLs. If both URLs are valid, they are saved into the appCtx and roomCtx contexts. If any URL is invalid, an error message is displayed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#joining-a-room","title":"Joining a room","text":"

                                                                                                                                                                                                    Before joining a room, the ConnectView.swift defines the view for the connection screen. It includes a logo, text fields for participant name and room name, and buttons for joining the room and resetting URLs.

                                                                                                                                                                                                    After define the participant and room name, the user can click the Join button to connect to the room. This action triggers the connectToRoom method asynchronously:

                                                                                                                                                                                                    ConnectView.swift
                                                                                                                                                                                                    func connectToRoom() async {\n    let livekitUrl = roomCtx.livekitUrl\n    let roomName = roomCtx.name\n    let participantName = roomCtx.localParticipantName\n    let applicationServerUrl = appCtx.applicationServerUrl\n\n    guard !livekitUrl.isEmpty, !roomName.isEmpty else {\n        print(\"LiveKit URL or room name is empty\")\n        return\n    }\n\n    do {\n        let token = try await httpService.getToken(\n            applicationServerUrl: applicationServerUrl, roomName: roomName,\n            participantName: participantName)// (1)!\n\n        if token.isEmpty {\n            print(\"Received empty token\")\n            return\n        }\n\n        roomCtx.token = token\n        print(\"Connecting to room...\")\n        try await roomCtx.connect() // (2)!\n        print(\"Room connected\")\n        await enableCameraAndMicrophone() // (3)!\n\n    } catch {\n        print(\"Failed to get token: \\(error.localizedDescription)\")\n    }\n}\n\nfunc enableCameraAndMicrophone() async {\n    do {\n        try await room.localParticipant.setCamera(enabled: true) // (4)!\n        try await room.localParticipant.setMicrophone(enabled: true) // (5)!\n    } catch {\n        print(\"Error enabling camera and microphone: \\(error.localizedDescription)\")\n    }\n}\n
                                                                                                                                                                                                    1. The getToken method is called to request a token from the application server.
                                                                                                                                                                                                    2. The connect method is called to connect to the room using the LiveKit URL and the token.
                                                                                                                                                                                                    3. The enableCameraAndMicrophone method is called to enable the camera and microphone for the local participant.
                                                                                                                                                                                                    4. The setCamera method is called to enable the camera for the local participant.
                                                                                                                                                                                                    5. The setMicrophone method is called to enable the microphone for the local participant.

                                                                                                                                                                                                    The OpenViduApp.swift handle the navigation page. When room status is connected, the user is redirected to the RoomView:

                                                                                                                                                                                                    OpenViduApp.swift
                                                                                                                                                                                                    struct RoomSwitchView: View {\n    @EnvironmentObject var appCtx: AppContext\n    @EnvironmentObject var roomCtx: RoomContext\n    @EnvironmentObject var room: Room\n\n    var shouldShowRoomView: Bool {\n        room.connectionState == .connected || room.connectionState == .reconnecting\n    }\n\n    var shouldShowConfigureUrlsView: Bool {\n        appCtx.applicationServerUrl.isEmpty || roomCtx.livekitUrl.isEmpty\n\n    }\n\n    var body: some View {\n        ZStack {\n            Color.black\n                .ignoresSafeArea()\n\n            // Navigation logic\n            if shouldShowRoomView {\n                RoomView() // (1)!\n            } else {\n                if shouldShowConfigureUrlsView {\n                    ConfigureUrlsView() // (2)!\n                } else {\n                    ConnectView() // (3)!\n                }\n            }\n        }\n        .navigationTitle(computeTitle())\n    }\n}\n
                                                                                                                                                                                                    1. If the room is connected, the user is redirected to the RoomView.
                                                                                                                                                                                                    2. If the URLs are not configured, the user is redirected to the ConfigureUrlsView.
                                                                                                                                                                                                    3. If the room is not connected and the URLs are configured, the user is redirected to the ConnectView.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#displaying-video-tracks","title":"Displaying Video Tracks","text":"

                                                                                                                                                                                                    To display the video tracks of participants in the room, the RoomView.swift uses various SwiftUI views and custom components. This approach allows the application to dynamically load and display the video tracks as they are received.

                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    struct RoomView: View {\n    @EnvironmentObject var appCtx: AppContext\n    @EnvironmentObject var roomCtx: RoomContext\n    @EnvironmentObject var room: Room\n\n    @State var isCameraPublishingBusy = false\n    @State var isMicrophonePublishingBusy = false\n\n    // ...\n\n    func content(geometry: GeometryProxy) -> some View {\n        VStack {\n            // ...\n\n            // Display Participant layout\n            HorVStack(axis: geometry.isTall ? .vertical : .horizontal, spacing: 5) {\n                Group {\n                    ParticipantLayout(sortedParticipants(), spacing: 5) { participant in // (1)!\n                        ParticipantView(participant: participant, videoViewMode: .fill) // (2)!\n                    }\n                }\n                .frame(\n                    minWidth: 0,\n                    maxWidth: .infinity,\n                    minHeight: 0,\n                    maxHeight: .infinity\n                )\n            }\n            .padding(5)\n        }\n    }\n}\n
                                                                                                                                                                                                    1. The ParticipantLayout component is used to display the video tracks of all participants in the room. It receives the sorted list of participants and a closure that returns a ParticipantView for each participant.
                                                                                                                                                                                                    2. The ParticipantView component is used to display the video track of a participant.

                                                                                                                                                                                                    The ParticipantView component is responsible for rendering the video track of a participant. It uses the SwiftUIVideoView component to display the video track and the VideoView.LayoutMode enum to define the layout mode.

                                                                                                                                                                                                    The LiveKit Swift SDK includes a VideoView class, based on UIKit, specifically designed for rendering video tracks. Additionally, subscribed audio tracks are automatically played by default.

                                                                                                                                                                                                    ParticipantView.swift
                                                                                                                                                                                                    struct ParticipantView: View {\n    @ObservedObject var participant: Participant\n    @EnvironmentObject var appCtx: AppContext\n\n    var videoViewMode: VideoView.LayoutMode = .fill\n\n\n    // ...\n\n     var body: some View {\n        GeometryReader { geometry in\n            ZStack(alignment: .bottom) {\n\n                // ...\n\n                // VideoView for the Participant\n                if let publication = participant.mainVideoPublication,\n                    !publication.isMuted,\n                    let track = publication.track as? VideoTrack\n                {\n                    ZStack(alignment: .topLeading) {\n                        SwiftUIVideoView(track, // (1)!\n                                            layoutMode: videoViewMode,\n                                            isRendering: $isRendering)\n                    }\n                }\n            }\n        }\n     }\n\n}\n
                                                                                                                                                                                                    1. The SwiftUIVideoView component renders the participant's video track.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/ios/#leaving-the-room","title":"Leaving the room","text":"

                                                                                                                                                                                                    To leave the room, the user can click the Leave button in the RoomView. This action triggers the leaveRoom method asynchronously:

                                                                                                                                                                                                    RoomView.swift
                                                                                                                                                                                                    func content(geometry: GeometryProxy) -> some View {\n\n    // ...\n\n    Button(action: {\n        Task {\n            await roomCtx.disconnect()\n        }\n    }, label: {\n        HStack {\n            Image(systemSymbol: .xmarkCircleFill)\n                .renderingMode(.original)\n            Text(\"Leave Room\")\n                .font(.headline)\n                .fontWeight(.semibold)\n        }\n        .padding(8)\n        .background(Color.red.opacity(0.8)) // Background color for the button\n        .foregroundColor(.white) // Text color\n        .cornerRadius(8)\n    })\n}\n

                                                                                                                                                                                                    After rome is disconnected, the room status is updated to disconnected and the OpenViduApp.swift handle this update to redirect the user to the ConnectView.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/","title":"JavaScript Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with plain JavaScript, HTML and CSS that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This application is designed to be beginner-friendly and consists of only three essential files that are located in the src directory:

                                                                                                                                                                                                    • app.js: This is the main JavaScript file for the sample application. It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • index.html: This HTML file is responsible for creating the user interface. It contains the form to connect to a video call and the video call layout.
                                                                                                                                                                                                    • styles.css: This file contains CSS classes that are used to style the index.html page.

                                                                                                                                                                                                    To use the LiveKit JS SDK in your application, you need to include the library in your HTML file. You can do this by adding the following script tag to the <head> section of your HTML file:

                                                                                                                                                                                                    index.html
                                                                                                                                                                                                    <script src=\"https://cdn.jsdelivr.net/npm/livekit-client@2.1.5/dist/livekit-client.umd.js\"></script>\n

                                                                                                                                                                                                    Then, you can use the LivekitClient object in your JavaScript code by referencing it from the window object under LivekitClient. When accessing symbols from the class, you will need to prefix them with LivekitClient.. For example, Room becomes LivekitClient.Room.

                                                                                                                                                                                                    Now let's see the code of the app.js file:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    // When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nvar APPLICATION_SERVER_URL = \"\"; // (1)!\nvar LIVEKIT_URL = \"\"; // (2)!\nconfigureUrls();\n\nconst LivekitClient = window.LivekitClient; // (3)!\nvar room; // (4)!\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n
                                                                                                                                                                                                    1. The URL of the application server.
                                                                                                                                                                                                    2. The URL of the LiveKit server.
                                                                                                                                                                                                    3. The LivekitClient object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    4. The room object, which represents the video call room.

                                                                                                                                                                                                    The app.js file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • LivekitClient: The LiveKit JS SDK object, which is the entry point to the LiveKit JS SDK.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function joinRoom() {\n    // Disable 'Join' button\n    document.getElementById(\"join-button\").disabled = true;\n    document.getElementById(\"join-button\").innerText = \"Joining...\";\n\n    // Initialize a new Room object\n    room = new LivekitClient.Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(LivekitClient.RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n        // (2)!\n        addTrack(track, participant.identity);\n    });\n\n    // On every new Track destroyed...\n    room.on(LivekitClient.RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n        // (3)!\n        track.detach();\n        document.getElementById(track.sid)?.remove();\n\n        if (track.kind === \"video\") {\n            removeVideoContainer(participant.identity);\n        }\n    });\n\n    try {\n        // Get the room name and participant name from the form\n        const roomName = document.getElementById(\"room-name\").value; // (4)!\n        const userName = document.getElementById(\"participant-name\").value;\n\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, userName); // (5)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (6)!\n\n        // Hide the 'Join room' page and show the 'Room' page\n        document.getElementById(\"room-title\").innerText = roomName; // (7)!\n        document.getElementById(\"join\").hidden = true;\n        document.getElementById(\"room\").hidden = false;\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (8)!\n        const localVideoTrack = this.room.localParticipant.videoTrackPublications.values().next().value.track;\n        addTrack(localVideoTrack, userName, true);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get the room name and participant name from the form.
                                                                                                                                                                                                    5. Get a token from the application server with the room name and participant name.
                                                                                                                                                                                                    6. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    7. Hide the \"Join room\" page and show the \"Room\" page.
                                                                                                                                                                                                    8. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object using LivekitClient.Room(). This object represents the video call room.
                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It handles the attachment of the track to the HTML page, assigning an ID, and appending it to the layout-container element. If the track is of kind video, a video-container is created and participant data is appended as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function addTrack(track, participantIdentity, local = false) {\n    const element = track.attach(); // (1)!\n    element.id = track.sid;\n\n    /* If the track is a video track, we create a container and append the video element to it\n    with the participant's identity */\n    if (track.kind === \"video\") {\n        const videoContainer = createVideoContainer(participantIdentity, local);\n        videoContainer.append(element);\n        appendParticipantData(videoContainer, participantIdentity + (local ? \" (You)\" : \"\"));\n    } else {\n        document.getElementById(\"layout-container\").append(element);\n    }\n}\n
                                                                                                                                                                                                      1. Attach the track to an HTML element.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function createVideoContainer(participantIdentity, local = false) {\n    const videoContainer = document.createElement(\"div\");\n    videoContainer.id = `camera-${participantIdentity}`;\n    videoContainer.className = \"video-container\";\n    const layoutContainer = document.getElementById(\"layout-container\");\n\n    if (local) {\n        layoutContainer.prepend(videoContainer);\n    } else {\n        layoutContainer.append(videoContainer);\n    }\n\n    return videoContainer;\n}\n\nfunction appendParticipantData(videoContainer, participantIdentity) {\n    const dataElement = document.createElement(\"div\");\n    dataElement.className = \"participant-data\";\n    dataElement.innerHTML = `<p>${participantIdentity}</p>`;\n    videoContainer.prepend(dataElement);\n}\n
                                                                                                                                                                                                      • LivekitClient.RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of detaching the track from the HTML page and removing it from the DOM. If the track is a video track, video-container with the participant's identity is removed as well.
                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      function removeVideoContainer(participantIdentity) {\n    const videoContainer = document.getElementById(`camera-${participantIdentity}`);\n    videoContainer?.remove();\n}\n

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It retrieves the room name and participant name from the form.

                                                                                                                                                                                                    4. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      app.js
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName, participantName) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const token = await response.json();\n    return token.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    5. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    6. It updates the UI to hide the \"Join room\" page and show the \"Room\" layout.
                                                                                                                                                                                                    7. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then added to the layout.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/javascript/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    app.js
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.disconnect(); // (1)!\n\n    // Remove all HTML elements inside the layout container\n    removeAllLayoutElements(); // (2)!\n\n    // Back to 'Join room' page\n    document.getElementById(\"join\").hidden = false; // (3)!\n    document.getElementById(\"room\").hidden = true;\n\n    // Enable 'Join' button\n    document.getElementById(\"join-button\").disabled = false;\n    document.getElementById(\"join-button\").innerText = \"Join!\";\n}\n\n// (4)!\nwindow.onbeforeunload = () => {\n    room?.disconnect();\n};\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Remove all HTML elements inside the layout container.
                                                                                                                                                                                                    3. Show the \"Join room\" page and hide the \"Room\" layout.
                                                                                                                                                                                                    4. Call the disconnect() method on the room object when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the room object.
                                                                                                                                                                                                    • It removes all HTML elements inside the layout container by calling the removeAllLayoutElements() function.
                                                                                                                                                                                                    • It shows the \"Join room\" page and hides the \"Room\" layout.

                                                                                                                                                                                                    The window.onbeforeunload event is used to ensure that the user is disconnected from the room before the page is unloaded. This event is triggered when the user closes the tab or navigates to another page.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/","title":"React Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with React that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This React project has been generated using the Vite. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    • App.tsx: This file defines the main application component. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.
                                                                                                                                                                                                    • App.css: This file contains the styles for the main application component.
                                                                                                                                                                                                    • VideoComponent.tsx: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data. Its associated styles are in VideoComponent.css.
                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the App.tsx file:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    type TrackInfo = { // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nlet APPLICATION_SERVER_URL = \"\"; // (2)!\nlet LIVEKIT_URL = \"\"; // (3)!\nconfigureUrls();\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n\nfunction App() {\n    const [room, setRoom] = useState<Room | undefined>(undefined); // (4)!\n    const [localTrack, setLocalTrack] = useState<LocalVideoTrack | undefined>(undefined); // (5)!\n    const [remoteTracks, setRemoteTracks] = useState<TrackInfo[]>([]); // (6)!\n\n    const [participantName, setParticipantName] = useState(\"Participant\" + Math.floor(Math.random() * 100)); // (7)!\n    const [roomName, setRoomName] = useState(\"Test Room\"); // (8)!\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. The local video track, which represents the user's camera.
                                                                                                                                                                                                    6. The remote tracks array.
                                                                                                                                                                                                    7. The participant's name.
                                                                                                                                                                                                    8. The room name.

                                                                                                                                                                                                    The App.tsx file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracks: An array of TrackInfo objects, which group a track publication with the participant's identity.
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • roomName: The room name.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    async function joinRoom() {\n    // Initialize a new Room object\n    const room = new Room(); // (1)!\n    setRoom(room);\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n            // (2)!\n            setRemoteTracks((prev) => [\n                ...prev,\n                { trackPublication: publication, participantIdentity: participant.identity }\n            ]);\n        }\n    );\n\n    // On every Track destroyed...\n    room.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {\n        // (3)!\n        setRemoteTracks((prev) => prev.filter((track) => track.trackPublication.trackSid !== publication.trackSid));\n    });\n\n    try {\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName, participantName); // (4)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.connect(LIVEKIT_URL, token); // (5)!\n\n        // Publish your camera and microphone\n        await room.localParticipant.enableCameraAndMicrophone(); // (6)!\n        setLocalTrack(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);\n    } catch (error) {\n        console.log(\"There was an error connecting to the room:\", (error as Error).message);\n        await leaveRoom();\n    }\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    5. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    6. Publish your camera and microphone.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracks array as a TrackInfo object containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracks array.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      App.tsx
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName: string, participantName: string) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName: roomName,\n            participantName: participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const data = await response.json();\n    return data.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    4. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    5. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    <div id=\"layout-container\">\n    {localTrack && (\n        <VideoComponent track={localTrack} participantIdentity={participantName} local={true} />\n    )}\n    {remoteTracks.map((remoteTrack) =>\n        remoteTrack.trackPublication.kind === \"video\" ? (\n            <VideoComponent\n                key={remoteTrack.trackPublication.trackSid}\n                track={remoteTrack.trackPublication.videoTrack!}\n                participantIdentity={remoteTrack.participantIdentity}\n            />\n        ) : (\n            <AudioComponent\n                key={remoteTrack.trackPublication.trackSid}\n                track={remoteTrack.trackPublication.audioTrack!}\n            />\n        )\n    )}\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • If the property localTrack is defined, we display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we iterate over the remoteTracks array and, for each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track.

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.txs file:

                                                                                                                                                                                                    VideoComponent.tsx
                                                                                                                                                                                                    interface VideoComponentProps {\n    track: LocalVideoTrack | RemoteVideoTrack; // (1)!\n    participantIdentity: string; // (2)!\n    local?: boolean; // (3)!\n}\n\nfunction VideoComponent({ track, participantIdentity, local = false }: VideoComponentProps) {\n    const videoElement = useRef<HTMLVideoElement | null>(null); // (4)!\n\n    useEffect(() => {\n        if (videoElement.current) {\n            track.attach(videoElement.current); // (5)!\n        }\n\n        return () => {\n            track.detach(); // (6)!\n        };\n    }, [track]);\n\n    return (\n        <div id={\"camera-\" + participantIdentity} className=\"video-container\">\n            <div className=\"participant-data\">\n                <p>{participantIdentity + (local ? \" (You)\" : \"\")}</p>\n            </div>\n            <video ref={videoElement} id={track.sid}></video>\n        </div>\n    );\n}\n
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. The participant identity associated with the video track.
                                                                                                                                                                                                    3. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    4. The reference to the video element in the HTML template.
                                                                                                                                                                                                    5. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    6. Detach the video track when the component is unmounted.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local as props of the component:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.tsx file:

                                                                                                                                                                                                    AudioComponent.tsx
                                                                                                                                                                                                    interface AudioComponentProps {\n    track: LocalAudioTrack | RemoteAudioTrack; // (1)!\n}\n\nfunction AudioComponent({ track }: AudioComponentProps) {\n    const audioElement = useRef<HTMLAudioElement | null>(null); // (2)!\n\n    useEffect(() => {\n        if (audioElement.current) {\n            track.attach(audioElement.current); // (3)!\n        }\n\n        return () => {\n            track.detach(); // (4)!\n        };\n    }, [track]);\n\n    return <audio ref={audioElement} id={track.sid} />;\n}\n
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    4. Detach the audio track when the component is unmounted.

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property as a prop for the component and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/react/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    App.tsx
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room?.disconnect(); // (1)!\n\n    // Reset the state\n    setRoom(undefined); // (2)!\n    setLocalTrack(undefined);\n    setRemoteTracks([]);\n}\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables to their initial state.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/","title":"Vue Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This tutorial is a simple video-call application built with Vue that allows:

                                                                                                                                                                                                    • Joining a video call room by requesting a token from any application server.
                                                                                                                                                                                                    • Publishing your camera and microphone.
                                                                                                                                                                                                    • Subscribing to all other participants' video and audio tracks automatically.
                                                                                                                                                                                                    • Leaving the video call room at any time.

                                                                                                                                                                                                    It uses the LiveKit JS SDK to connect to the LiveKit server and interact with the video call room.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#3-run-a-server-application","title":"3. Run a server application","text":"Node Go Ruby Java Python Rust PHP .NET

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    For more information, check the Node.js tutorial.

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n

                                                                                                                                                                                                    For more information, check the Go tutorial.

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n

                                                                                                                                                                                                    For more information, check the Ruby tutorial.

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n

                                                                                                                                                                                                    For more information, check the Java tutorial.

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n

                                                                                                                                                                                                    For more information, check the Python tutorial.

                                                                                                                                                                                                    To run this server application, you need Rust installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/rust\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      cargo run\n

                                                                                                                                                                                                    For more information, check the Rust tutorial.

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    For more information, check the PHP tutorial.

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    For more information, check the .NET tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#4-run-the-client-application","title":"4. Run the client application","text":"

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    This Vue project has been generated using the Vue CLI tool. You may come across various configuration files and other items that are not essential for this tutorial. Our focus will be on the key files located within the src/ directory:

                                                                                                                                                                                                    • App.vue: This file defines the main application component along with its HTML template and styles. It is responsible for handling tasks such as joining a video call and managing the video calls themselves.

                                                                                                                                                                                                    • VideoComponent.vue: This file defines the VideoComponent. This component is responsible for displaying video tracks along with participant's data.

                                                                                                                                                                                                    • AudioComponent.vue: This file defines the AudioComponent. This component is responsible for displaying audio tracks.

                                                                                                                                                                                                    To use the LiveKit JS SDK in a Vue application, you need to install the livekit-client package. This package provides the necessary classes and methods to interact with the LiveKit server. You can install it using the following command:

                                                                                                                                                                                                    npm install livekit-client\n

                                                                                                                                                                                                    Now let's see the code of the App.vue file:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    type TrackInfo = {\n    // (1)!\n    trackPublication: RemoteTrackPublication;\n    participantIdentity: string;\n};\n\n// When running OpenVidu locally, leave these variables empty\n// For other deployment type, configure them with correct URLs depending on your deployment\nlet APPLICATION_SERVER_URL = \"\"; // (2)!\nlet LIVEKIT_URL = \"\"; // (3)!\nconfigureUrls();\n\nfunction configureUrls() {\n    // If APPLICATION_SERVER_URL is not configured, use default value from OpenVidu Local deployment\n    if (!APPLICATION_SERVER_URL) {\n        if (window.location.hostname === \"localhost\") {\n            APPLICATION_SERVER_URL = \"http://localhost:6080/\";\n        } else {\n            APPLICATION_SERVER_URL = \"https://\" + window.location.hostname + \":6443/\";\n        }\n    }\n\n    // If LIVEKIT_URL is not configured, use default value from OpenVidu Local deployment\n    if (!LIVEKIT_URL) {\n        if (window.location.hostname === \"localhost\") {\n            LIVEKIT_URL = \"ws://localhost:7880/\";\n        } else {\n            LIVEKIT_URL = \"wss://\" + window.location.hostname + \":7443/\";\n        }\n    }\n}\n\nconst room = ref<Room>(); // (4)!\nconst localTrack = ref<LocalVideoTrack>(); // (5)!\nconst remoteTracksMap: Ref<Map<string, TrackInfo>> = ref(new Map()); // (6)!\n\nlet participantName = ref(\"Participant\" + Math.floor(Math.random() * 100)); // (7)!\nlet roomName = ref(\"Test Room\"); // (8)!\n
                                                                                                                                                                                                    1. TrackInfo type, which groups a track publication with the participant's identity.
                                                                                                                                                                                                    2. The URL of the application server.
                                                                                                                                                                                                    3. The URL of the LiveKit server.
                                                                                                                                                                                                    4. The room object, which represents the video call room.
                                                                                                                                                                                                    5. The local video track, which represents the user's camera.
                                                                                                                                                                                                    6. Map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    7. The participant's name.
                                                                                                                                                                                                    8. The room name.

                                                                                                                                                                                                    The App.vue file defines the following variables:

                                                                                                                                                                                                    • APPLICATION_SERVER_URL: The URL of the application server. This variable is used to make requests to the server to obtain a token for joining the video call room.
                                                                                                                                                                                                    • LIVEKIT_URL: The URL of the LiveKit server. This variable is used to connect to the LiveKit server and interact with the video call room.
                                                                                                                                                                                                    • room: The room object, which represents the video call room.
                                                                                                                                                                                                    • localTrack: The local video track, which represents the user's camera.
                                                                                                                                                                                                    • remoteTracksMap: A map that links track SIDs with TrackInfo objects. This map is used to store remote tracks and their associated participant identities.
                                                                                                                                                                                                    • participantName: The participant's name.
                                                                                                                                                                                                    • roomName: The room name.

                                                                                                                                                                                                    Configure the URLs

                                                                                                                                                                                                    When running OpenVidu locally, leave APPLICATION_SERVER_URL and LIVEKIT_URL variables empty. The function configureUrls() will automatically configure them with default values. However, for other deployment type, you should configure these variables with the correct URLs depending on your deployment.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#joining-a-room","title":"Joining a Room","text":"

                                                                                                                                                                                                    After the user specifies their participant name and the name of the room they want to join, when they click the Join button, the joinRoom() function is called:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    async function joinRoom() {\n    // Initialize a new Room object\n    room.value = new Room(); // (1)!\n\n    // Specify the actions when events take place in the room\n    // On every new Track received...\n    room.value.on(\n        RoomEvent.TrackSubscribed,\n        (_track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n            // (2)!\n            remoteTracksMap.value.set(publication.trackSid, {\n                trackPublication: publication,\n                participantIdentity: participant.identity\n            });\n        }\n    );\n\n    // On every Track destroyed...\n    room.value.on(RoomEvent.TrackUnsubscribed, (_track: RemoteTrack, publication: RemoteTrackPublication) => {\n        // (3)!\n        remoteTracksMap.value.delete(publication.trackSid);\n    });\n\n    try {\n        // Get a token from your application server with the room name and participant name\n        const token = await getToken(roomName.value, participantName.value); // (4)!\n\n        // Connect to the room with the LiveKit URL and the token\n        await room.value.connect(LIVEKIT_URL, token); // (5)!\n\n        // Publish your camera and microphone\n        await room.value.localParticipant.enableCameraAndMicrophone(); // (6)!\n        localTrack.value = room.value.localParticipant.videoTrackPublications.values().next().value.videoTrack;\n    } catch (error: any) {\n        console.log(\"There was an error connecting to the room:\", error.message);\n        await leaveRoom();\n    }\n\n    // Add listener for beforeunload event to leave the room when the user closes the tab\n    window.addEventListener(\"beforeunload\", leaveRoom); // (7)!\n}\n
                                                                                                                                                                                                    1. Initialize a new Room object.
                                                                                                                                                                                                    2. Event handling for when a new track is received in the room.
                                                                                                                                                                                                    3. Event handling for when a track is destroyed.
                                                                                                                                                                                                    4. Get a token from the application server with the room name and participant name from the form.
                                                                                                                                                                                                    5. Connect to the room with the LiveKit URL and the token.
                                                                                                                                                                                                    6. Publish your camera and microphone.
                                                                                                                                                                                                    7. Add a listener for the beforeunload event to leave the room when the user closes the tab.

                                                                                                                                                                                                    The joinRoom() function performs the following actions:

                                                                                                                                                                                                    1. It creates a new Room object. This object represents the video call room.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      When the room object is defined, the HTML template is automatically updated hiding the \"Join room\" page and showing the \"Room\" layout.

                                                                                                                                                                                                    2. Event handling is configured for different scenarios within the room. These events are fired when new tracks are subscribed to and when existing tracks are unsubscribed.

                                                                                                                                                                                                      • RoomEvent.TrackSubscribed: This event is triggered when a new track is received in the room. It manages the storage of the new track in the remoteTracksMap, which links track SIDs with TrackInfo objects containing the track publication and the participant's identity.

                                                                                                                                                                                                      • RoomEvent.TrackUnsubscribed: This event occurs when a track is destroyed, and it takes care of removing the track from the remoteTracksMap.

                                                                                                                                                                                                      These event handlers are essential for managing the behavior of tracks within the video call. You can further extend the event handling as needed for your application.

                                                                                                                                                                                                      Take a look at all events

                                                                                                                                                                                                      You can take a look at all the events in the Livekit Documentation

                                                                                                                                                                                                    3. It requests a token from the application server using the room name and participant name. This is done by calling the getToken() function:

                                                                                                                                                                                                      App.vue
                                                                                                                                                                                                      /**\n * --------------------------------------------\n * GETTING A TOKEN FROM YOUR APPLICATION SERVER\n * --------------------------------------------\n * The method below request the creation of a token to\n * your application server. This prevents the need to expose\n * your LiveKit API key and secret to the client side.\n *\n * In this sample code, there is no user control at all. Anybody could\n * access your application server endpoints. In a real production\n * environment, your application server must identify the user to allow\n * access to the endpoints.\n */\nasync function getToken(roomName: string, participantName: string) {\n    const response = await fetch(APPLICATION_SERVER_URL + \"token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\"\n        },\n        body: JSON.stringify({\n            roomName,\n            participantName\n        })\n    });\n\n    if (!response.ok) {\n        const error = await response.json();\n        throw new Error(`Failed to get token: ${error.errorMessage}`);\n    }\n\n    const data = await response.json();\n    return data.token;\n}\n

                                                                                                                                                                                                      This function sends a POST request using fetch() to the application server's /token endpoint. The request body contains the room name and participant name. The server responds with a token that is used to connect to the room.

                                                                                                                                                                                                    4. It connects to the room using the LiveKit URL and the token.

                                                                                                                                                                                                    5. It publishes the camera and microphone tracks to the room using room.localParticipant.enableCameraAndMicrophone(), which asks the user for permission to access their camera and microphone at the same time. The local video track is then stored in the localTrack variable.
                                                                                                                                                                                                    6. It adds a listener for the beforeunload event to leave the room when the user closes the tab.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#displaying-video-and-audio-tracks","title":"Displaying Video and Audio Tracks","text":"

                                                                                                                                                                                                    In order to display participants' video and audio tracks, the main component integrates the VideoComponent and AudioComponent.

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    <div id=\"layout-container\">\n    <VideoComponent v-if=\"localTrack\" :track=\"localTrack\" :participantIdentity=\"participantName\" :local=\"true\" />\n    <template v-for=\"remoteTrack of remoteTracksMap.values()\" :key=\"remoteTrack.trackPublication.trackSid\">\n        <VideoComponent\n            v-if=\"remoteTrack.trackPublication.kind === 'video'\"\n            :track=\"remoteTrack.trackPublication.videoTrack!\"\n            :participantIdentity=\"remoteTrack.participantIdentity\"\n        />\n        <AudioComponent v-else :track=\"remoteTrack.trackPublication.audioTrack!\" hidden />\n    </template>\n</div>\n

                                                                                                                                                                                                    This code snippet does the following:

                                                                                                                                                                                                    • We use the v-if directive to conditionally display the local video track using the VideoComponent. The local property is set to true to indicate that the video track belongs to the local participant.

                                                                                                                                                                                                      Info

                                                                                                                                                                                                      The audio track is not displayed for the local participant because there is no need to hear one's own audio.

                                                                                                                                                                                                    • Then, we use the v-for directive to iterate over the remoteTracksMap. For each remote track, we create a VideoComponent or an AudioComponent depending on the track's kind (video or audio). The participantIdentity property is set to the participant's identity, and the track property is set to the video or audio track. The hidden attribute is added to the AudioComponent to hide the audio tracks from the layout.

                                                                                                                                                                                                    Let's see now the code of the VideoComponent.vue file:

                                                                                                                                                                                                    VideoComponent.vue
                                                                                                                                                                                                    const props = withDefaults(\n    defineProps<{\n        track: LocalVideoTrack | RemoteVideoTrack; // (1)!\n        participantIdentity: string; // (2)!\n        local?: boolean; // (3)!\n    }>(),\n    {\n        local: false\n    }\n);\n\nconst videoElement = ref<HTMLMediaElement | null>(null); // (4)!\n\nonMounted(() => {\n    if (videoElement.value) {\n        props.track.attach(videoElement.value); // (5)!\n    }\n});\n\nonUnmounted(() => {\n    props.track.detach(); // (6)!\n});\n
                                                                                                                                                                                                    1. The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                    2. The participant identity associated with the video track.
                                                                                                                                                                                                    3. A boolean flag that indicates whether the video track belongs to the local participant.
                                                                                                                                                                                                    4. The reference to the video element in the HTML template.
                                                                                                                                                                                                    5. Attach the video track to the video element when the component is mounted.
                                                                                                                                                                                                    6. Detach the video track when the component is unmounted.

                                                                                                                                                                                                    The VideoComponent does the following:

                                                                                                                                                                                                    • It defines the properties track, participantIdentity, and local using the defineProps() function:

                                                                                                                                                                                                      • track: The video track object, which can be a LocalVideoTrack or a RemoteVideoTrack.
                                                                                                                                                                                                      • participantIdentity: The participant identity associated with the video track.
                                                                                                                                                                                                      • local: A boolean flag that indicates whether the video track belongs to the local participant. This flag is set to false by default.
                                                                                                                                                                                                    • It creates a reference to the video element in the HTML template.

                                                                                                                                                                                                    • It attaches the video track to the video element when the component is mounted.
                                                                                                                                                                                                    • It detaches the video track when the component is unmounted.

                                                                                                                                                                                                    Finally, let's see the code of the AudioComponent.vue file:

                                                                                                                                                                                                    AudioComponent.vue
                                                                                                                                                                                                    const props = defineProps<{\n    track: LocalAudioTrack | RemoteAudioTrack; // (1)!\n}>();\nconst audioElement = ref<HTMLMediaElement | null>(null); // (2)!\n\nonMounted(() => {\n    if (audioElement.value) {\n        props.track.attach(audioElement.value); // (3)!\n    }\n});\n\nonUnmounted(() => {\n    props.track.detach(); // (4)!\n});\n
                                                                                                                                                                                                    1. The audio track object, which can be a LocalAudioTrack or a RemoteAudioTrack, although in this case, it will always be a RemoteAudioTrack.
                                                                                                                                                                                                    2. The reference to the audio element in the HTML template.
                                                                                                                                                                                                    3. Attach the audio track to the audio element when the component is mounted.
                                                                                                                                                                                                    4. Detach the audio track when the component is unmounted.

                                                                                                                                                                                                    The AudioComponent is similar to the VideoComponent but is used to display audio tracks. It defines the track property using the defineProps() function and creates a reference to the audio element in the HTML template. The audio track is attached to the audio element when the component is mounted and detached when the component is unmounted.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-client/vue/#leaving-the-room","title":"Leaving the Room","text":"

                                                                                                                                                                                                    When the user wants to leave the room, they can click the Leave Room button. This action calls the leaveRoom() function:

                                                                                                                                                                                                    App.vue
                                                                                                                                                                                                    async function leaveRoom() {\n    // Leave the room by calling 'disconnect' method over the Room object\n    await room.value?.disconnect(); // (1)!\n\n    // Empty all variables\n    room.value = undefined; // (2)!\n    localTrack.value = undefined;\n    remoteTracksMap.value.clear();\n\n    window.removeEventListener(\"beforeunload\", leaveRoom); // (3)!\n}\n\nonUnmounted(() => {\n    // (4)!\n    // On component unmount, leave the room\n    leaveRoom();\n});\n
                                                                                                                                                                                                    1. Disconnect the user from the room.
                                                                                                                                                                                                    2. Reset all variables to their initial state.
                                                                                                                                                                                                    3. Remove the beforeunload event listener.
                                                                                                                                                                                                    4. Call the leaveRoom() function when the component is unmounted.

                                                                                                                                                                                                    The leaveRoom() function performs the following actions:

                                                                                                                                                                                                    • It disconnects the user from the room by calling the disconnect() method on the Room object.
                                                                                                                                                                                                    • It resets all variables to their initial state.
                                                                                                                                                                                                    • It removes the beforeunload event listener.

                                                                                                                                                                                                    The leaveRoom() function is also called when the component is unmounted using the onUnmounted() lifecycle hook. This ensures that the user leaves the room when the component is no longer needed.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/","title":"Application Server Tutorials","text":"

                                                                                                                                                                                                    Every application server below has two specific purposes:

                                                                                                                                                                                                    • Generate LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receive LiveKit webhook events.

                                                                                                                                                                                                    To do so they all define two REST endpoints:

                                                                                                                                                                                                    • /token: takes a room and participant name and returns a token.
                                                                                                                                                                                                    • /webhook: for receiving webhook events from LiveKit Server.

                                                                                                                                                                                                    They use the proper LiveKit Server SDK for their language, if available.

                                                                                                                                                                                                    NodeJS

                                                                                                                                                                                                    Go

                                                                                                                                                                                                    Ruby

                                                                                                                                                                                                    Java

                                                                                                                                                                                                    Python

                                                                                                                                                                                                    Rust

                                                                                                                                                                                                    PHP

                                                                                                                                                                                                    .NET

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/","title":".NET Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for .NET with ASP.NET Core Minimal APIs that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit available, so the application has to manually build LiveKit compatible JWT tokens using the .NET library System.IdentityModel.Tokens.Jwt, and check the validity of webhook events on its own. It is a fairly easy process.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need .NET installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/dotnet\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      dotnet run\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    This .NET server application needs the LIVEKIT_API_SECRET env variable to be at least 32 characters long. Make sure to update it here and in your OpenVidu Server.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple ASP.NET Core Minimal APIs app with a single file Program.cs that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code Program.cs file:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    var builder = WebApplication.CreateBuilder(args); // (1)!\nvar MyAllowSpecificOrigins = \"_myAllowSpecificOrigins\"; // (2)!\n\nIConfiguration config = new ConfigurationBuilder() // (3)!\n                .SetBasePath(Directory.GetCurrentDirectory())\n                .AddJsonFile(\"appsettings.json\")\n                .AddEnvironmentVariables().Build();\n\n// Load env variables\nvar SERVER_PORT = config.GetValue<int>(\"SERVER_PORT\"); // (4)!\nvar LIVEKIT_API_KEY = config.GetValue<string>(\"LIVEKIT_API_KEY\"); // (5)!\nvar LIVEKIT_API_SECRET = config.GetValue<string>(\"LIVEKIT_API_SECRET\"); // (6)!\n\n// Enable CORS support\nbuilder.Services.AddCors(options => // (7)!\n{\n    options.AddPolicy(name: MyAllowSpecificOrigins,\n                      builder =>\n                      {\n                          builder.WithOrigins(\"*\").AllowAnyHeader();\n                      });\n});\n\nbuilder.WebHost.UseKestrel(serverOptions => // (8)!\n{\n    serverOptions.ListenAnyIP(SERVER_PORT);\n});\n\nvar app = builder.Build(); // (9)!\napp.UseCors(MyAllowSpecificOrigins);\n
                                                                                                                                                                                                    1. A WebApplicationBuilder instance to build the application.
                                                                                                                                                                                                    2. The name of the CORS policy to be used in the application.
                                                                                                                                                                                                    3. A IConfiguration instance to load the configuration from the appsettings.json file, including the required environment variables.
                                                                                                                                                                                                    4. The port where the application will be listening.
                                                                                                                                                                                                    5. The API key of LiveKit Server.
                                                                                                                                                                                                    6. The API secret of LiveKit Server.
                                                                                                                                                                                                    7. Configure CORS support.
                                                                                                                                                                                                    8. Configure the port.
                                                                                                                                                                                                    9. Build the application and enable CORS support.

                                                                                                                                                                                                    The Program.cs file imports the required dependencies and loads the necessary environment variables (defined in appsettings.json file):

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the application enables CORS support and the port where the application will be listening.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    app.MapPost(\"/token\", async (HttpRequest request) =>\n{\n    var body = new StreamReader(request.Body); // (1)!\n    string postData = await body.ReadToEndAsync();\n    Dictionary<string, dynamic> bodyParams = JsonSerializer.Deserialize<Dictionary<string, dynamic>>(postData) ?? new Dictionary<string, dynamic>();\n\n    if (bodyParams.TryGetValue(\"roomName\", out var roomName) && bodyParams.TryGetValue(\"participantName\", out var participantName))\n    {\n        var token = CreateLiveKitJWT(roomName.ToString(), participantName.ToString()); // (2)!\n        return Results.Json(new { token }); // (3)!\n    }\n    else\n    {\n        return Results.BadRequest(new { errorMessage = \"roomName and participantName are required\" }); // (4)!\n    }\n});\n
                                                                                                                                                                                                    1. The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available.
                                                                                                                                                                                                    2. Create a new JWT token with the room and participant name.
                                                                                                                                                                                                    3. Return the token to the client.
                                                                                                                                                                                                    4. Return a 400 error if required fields are not available.

                                                                                                                                                                                                    The endpoint obtains a Dictionary from the body request, and check if fields roomName and participantName are available. If not, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. Unfortunately there is no .NET SDK for LiveKit, so we need to create the JWT token manually. The CreateLiveKitJWT method is responsible for creating the LiveKit compatible JWT token:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    string CreateLiveKitJWT(string roomName, string participantName)\n{\n    JwtHeader headers = new(new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(LIVEKIT_API_SECRET)), \"HS256\")); // (1)!\n\n    var videoGrants = new Dictionary<string, object>() // (2)!\n    {\n        { \"room\", roomName },\n        { \"roomJoin\", true }\n    };\n    JwtPayload payload = new()\n    {\n        { \"exp\", new DateTimeOffset(DateTime.UtcNow.AddHours(6)).ToUnixTimeSeconds() }, // (3)!\n        { \"iss\", LIVEKIT_API_KEY }, // (4)!\n        { \"nbf\", 0 }, // (5)!\n        { \"sub\", participantName }, // (6)!\n        { \"name\", participantName },\n        { \"video\", videoGrants }\n    };\n    JwtSecurityToken token = new(headers, payload);\n    return new JwtSecurityTokenHandler().WriteToken(token); // (7)!\n}\n
                                                                                                                                                                                                    1. Create a new JwtHeader with LIVEKIT_API_SECRET as the secret key and HS256 as the encryption algorithm.
                                                                                                                                                                                                    2. Create a new Dictionary with the video grants for the participant. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. Set the expiration time of the token. LiveKit default's is 6 hours.
                                                                                                                                                                                                    4. Set the API key of LiveKit Server as the issuer (iss) of the token.
                                                                                                                                                                                                    5. The Not before field (nbf) sets when the token becomes valid (0 for immediately valid).
                                                                                                                                                                                                    6. Set the participant's name in the claims sub and name.
                                                                                                                                                                                                    7. Finally, the returned token is sent back to the client.

                                                                                                                                                                                                    This method uses the native System.IdentityModel.Tokens.Jwt library to create a JWT token valid for LiveKit. The most important field in the JwtPayload is video, which will determine the VideoGrant permissions of the participant in the Room. You can also customize the expiration time of the token by changing the exp field, and add a metadata field for the participant. Check out all the available claims.

                                                                                                                                                                                                    Finally, the returned token is sent back to the client.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/dotnet/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    app.MapPost(\"/livekit/webhook\", async (HttpRequest request) =>\n{\n    var body = new StreamReader(request.Body);\n    string postData = await body.ReadToEndAsync(); // (1)!\n\n    var authHeader = request.Headers[\"Authorization\"]; // (2)!\n    if (authHeader.Count == 0)\n    {\n        return Results.BadRequest(\"Authorization header is required\");\n    }\n    try\n    {\n        VerifyWebhookEvent(authHeader.First(), postData); // (3)!\n    }\n    catch (Exception e)\n    {\n        Console.Error.WriteLine(\"Error validating webhook event: \" + e.Message);\n        return Results.Unauthorized();\n    }\n\n    Console.Out.WriteLine(postData); // (4)!\n    return Results.Ok(); // (5)!\n});\n
                                                                                                                                                                                                    1. The raw string body of the request contains the webhook event.
                                                                                                                                                                                                    2. The Authorization header is required to validate the webhook event.
                                                                                                                                                                                                    3. Verify the webhook event.
                                                                                                                                                                                                    4. Consume the event as you whish.
                                                                                                                                                                                                    5. Return a response to LiveKit Server to let it know that the webhook was received correctly.

                                                                                                                                                                                                    The endpoint receives the incoming webhook event and validates it to ensure it is coming from our LiveKit Server. For that we need the raw string body and the Authorization header of the request. After validating it, we can consume the event (in this case, we just log it), and we must also return a 200 OK response to LiveKit Server to let it know that the webhook was received correctly.

                                                                                                                                                                                                    Unfortunately there is no .NET SDK for LiveKit, so we need to manually validate the webhook event. The VerifyWebhookEvent method does that:

                                                                                                                                                                                                    Program.cs
                                                                                                                                                                                                    void VerifyWebhookEvent(string authHeader, string body)\n{\n    var utf8Encoding = new UTF8Encoding();\n    var tokenValidationParameters = new TokenValidationParameters()\n    {\n        ValidateIssuerSigningKey = true,\n        IssuerSigningKey = new SymmetricSecurityKey(utf8Encoding.GetBytes(LIVEKIT_API_SECRET)), // (1)!\n        ValidateIssuer = true,\n        ValidIssuer = LIVEKIT_API_KEY, // (2)!\n        ValidateAudience = false\n    };\n\n    var jwtValidator = new JwtSecurityTokenHandler();\n    var claimsPrincipal = jwtValidator.ValidateToken(authHeader, tokenValidationParameters, out SecurityToken validatedToken); // (3)!\n\n    var sha256 = SHA256.Create();\n    var hashBytes = sha256.ComputeHash(utf8Encoding.GetBytes(body));\n    var hash = Convert.ToBase64String(hashBytes); // (4)!\n\n    if (claimsPrincipal.HasClaim(c => c.Type == \"sha256\") && claimsPrincipal.FindFirstValue(\"sha256\") != hash)\n    {\n        throw new ArgumentException(\"sha256 checksum of body does not match!\");\n    }\n}\n
                                                                                                                                                                                                    1. Use the LIVEKIT_API_SECRET as the secret key to validate the token.
                                                                                                                                                                                                    2. Set the LIVEKIT_API_KEY as the issuer of the token.
                                                                                                                                                                                                    3. Validate the Authorization header with the recently created TokenValidationParameters. If the LIVEKIT_API_SECRET or LIVEKIT_API_KEY of the LiveKit Server that sent the event do not match the ones in the application, this will throw an exception.
                                                                                                                                                                                                    4. Calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can trust it.

                                                                                                                                                                                                    We need a TokenValidationParameters object from the Microsoft.IdentityModel.Tokens namespace. We use the LIVEKIT_API_SECRET as the symmetric key, and the LIVEKIT_API_KEY as the issuer of the token.

                                                                                                                                                                                                    If method JwtSecurityTokenHandler#ValidateToken does rise an exception when validating the Authorization header, it means the webhook event was sent by a LiveKit Server with different credentials.

                                                                                                                                                                                                    Finally, we calculate the SHA256 hash of the body and compare it with the sha256 claim in the token. If they match, it means the webhook event was not tampered and we can definitely trust it.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/","title":"Go Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Go with Gin that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses the LiveKit Go SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Go installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/go\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      go run main.go\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Go app with a single file main.go that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the main.go file:

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    var SERVER_PORT string // (1)!\nvar LIVEKIT_API_KEY string // (2)!\nvar LIVEKIT_API_SECRET string // (3)!\n
                                                                                                                                                                                                    1. The port where the application will be listening
                                                                                                                                                                                                    2. The API key of LiveKit Server
                                                                                                                                                                                                    3. The API secret of LiveKit Server

                                                                                                                                                                                                    The main.go file first declares the necessary global variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    The server launch takes place in the main function at the end of the file, where we first load the environment variables, then set the REST endpoints and finally start the server on SERVER_PORT:

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func main() {\n    loadEnv() // (1)!\n    router := gin.Default() // (2)!\n    router.Use(cors.Default()) // (3)!\n    router.POST(\"/token\", createToken) // (4)!\n    router.POST(\"/livekit/webhook\", receiveWebhook) // (5)!\n    router.Run(\":\" + SERVER_PORT) // (6)!\n}\n
                                                                                                                                                                                                    1. Load environment variables
                                                                                                                                                                                                    2. Create a new Gin router
                                                                                                                                                                                                    3. Enable CORS support
                                                                                                                                                                                                    4. Create the /token endpoint
                                                                                                                                                                                                    5. Create the /livekit/webhook endpoint
                                                                                                                                                                                                    6. Start the server on the SERVER_PORT
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func createToken(context *gin.Context) {\n    var body struct {\n        RoomName        string `json:\"roomName\"`\n        ParticipantName string `json:\"participantName\"`\n    }\n\n    if err := context.BindJSON(&body); err != nil {\n        context.JSON(http.StatusBadRequest, err.Error())\n        return\n    }\n\n    if body.RoomName == \"\" || body.ParticipantName == \"\" {\n        context.JSON(http.StatusBadRequest, gin.H{\"errorMessage\": \"roomName and participantName are required\"})\n        return\n    }\n\n    at := auth.NewAccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) // (1)!\n    grant := &auth.VideoGrant{\n        RoomJoin: true,\n        Room:     body.RoomName,\n    }\n    at.SetVideoGrant(grant).SetIdentity(body.ParticipantName) // (2)!\n\n    token, err := at.ToJWT() // (3)!\n    if err != nil {\n        context.JSON(http.StatusInternalServerError, err.Error())\n        return\n    }\n\n    context.JSON(http.StatusOK, gin.H{\"token\": token}) // (4)!\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    We first load the request body into a struct with roomName and participantName string fields. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Go SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set the video grants and identity of the participant in the AccessToken. RoomJoin allows the user to join a room and Room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token and return it to the client.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/go/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    main.go
                                                                                                                                                                                                    func receiveWebhook(context *gin.Context) {\n    authProvider := auth.NewSimpleKeyProvider( // (1)!\n        LIVEKIT_API_KEY, LIVEKIT_API_SECRET,\n    )\n    event, err := webhook.ReceiveWebhookEvent(context.Request, authProvider) // (2)!\n    if err != nil {\n        fmt.Fprintf(os.Stderr, \"error validating webhook event: %v\", err)\n        return\n    }\n    fmt.Println(\"LiveKit Webhook\", event) // (3)!\n}\n
                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    3. Consume the event as you whish.

                                                                                                                                                                                                    1. Create a SimpleKeyProvider with the LIVEKIT_API_KEY and LIVEKIT_API.
                                                                                                                                                                                                    2. Receive the webhook event providing the http.Request in the Gin context and the SimpleKeyProvider we just created. This will validate and decode the incoming webhook event.
                                                                                                                                                                                                    3. Consume the event as you whish.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/","title":"Java Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Java with Spring Boot that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Kotlin SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Java and Maven installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/java\n
                                                                                                                                                                                                    2. Run the application
                                                                                                                                                                                                      mvn spring-boot:run\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Spring Boot app with a single controller Controller.java that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the Controller.java file:

                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @CrossOrigin(origins = \"*\") // (1)!\n@RestController // (2)!\npublic class Controller {\n\n    @Value(\"${livekit.api.key}\")\n    private String LIVEKIT_API_KEY; // (3)!\n\n    @Value(\"${livekit.api.secret}\")\n    private String LIVEKIT_API_SECRET; // (4)!\n\n    ...\n}\n
                                                                                                                                                                                                    1. Allows the application to be accessed from any domain
                                                                                                                                                                                                    2. Marks the class as a controller where every method returns a domain object instead of a view
                                                                                                                                                                                                    3. The API key of LiveKit Server
                                                                                                                                                                                                    4. The API secret of LiveKit Server

                                                                                                                                                                                                    Starting by the top, the Controller class has the following annotations:

                                                                                                                                                                                                    • @CrossOrigin(origins = \"*\"): allows the application to be accessed from any domain.
                                                                                                                                                                                                    • @RestController: marks the class as a controller where every method returns a domain object instead of a view.

                                                                                                                                                                                                    Going deeper, the Controller class has the following fields:

                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server. It is injected from the property livekit.api.key defined in application.properties using the @Value(\"${livekit.api.key}\") annotation.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server. It is injected from the the property livekit.api.secret defined in application.properties using the @Value(\"${livekit.api.secret}\") annotation.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @PostMapping(value = \"/token\")\npublic ResponseEntity<Map<String, String>> createToken(@RequestBody Map<String, String> params) {\n    String roomName = params.get(\"roomName\");\n    String participantName = params.get(\"participantName\");\n\n    if (roomName == null || participantName == null) {\n        return ResponseEntity.badRequest().body(Map.of(\"errorMessage\", \"roomName and participantName are required\"));\n    }\n\n    AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (1)!\n    token.setName(participantName); // (2)!\n    token.setIdentity(participantName);\n    token.addGrants(new RoomJoin(true), new RoomName(roomName)); // (3)!\n\n    return ResponseEntity.ok(Map.of(\"token\", token.toJwt())); // (4)!\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Kotlin SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. RoomJoin allows the user to join a room and RoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/java/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    Controller.java
                                                                                                                                                                                                    @PostMapping(value = \"/livekit/webhook\", consumes = \"application/webhook+json\")\npublic ResponseEntity<String> receiveWebhook(@RequestHeader(\"Authorization\") String authHeader, @RequestBody String body) { // (1)!\n    WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); // (2)!\n    try {\n        WebhookEvent event = webhookReceiver.receive(body, authHeader); // (3)!\n        System.out.println(\"LiveKit Webhook: \" + event.toString()); // (4)!\n    } catch (Exception e) {\n        System.err.println(\"Error validating webhook event: \" + e.getMessage());\n    }\n    return ResponseEntity.ok(\"ok\");\n}\n
                                                                                                                                                                                                    1. We need the 'Authorization' header and the raw body of the HTTP request.
                                                                                                                                                                                                    2. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    3. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    4. Consume the event as you whish.

                                                                                                                                                                                                    We declare the 'Authorization' header and the raw body of the HTTP request as parameters of the our method. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    Then we initialize a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    Finally we obtain a WebhookEvent object calling method WebhookReceiver#receive. It takes the raw body as a String and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/","title":"Node.js Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Node with Express that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit JS SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Node installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/node\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      npm start\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Express app with a single file index.js that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the index.js file:

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    import \"dotenv/config\";\nimport express from \"express\";\nimport cors from \"cors\";\nimport { AccessToken, WebhookReceiver } from \"livekit-server-sdk\"; // (1)!\n\nconst SERVER_PORT = process.env.SERVER_PORT || 6080; // (2)!\nconst LIVEKIT_API_KEY = process.env.LIVEKIT_API_KEY || \"devkey\"; // (3)!\nconst LIVEKIT_API_SECRET = process.env.LIVEKIT_API_SECRET || \"secret\"; // (4)!\n\nconst app = express(); // (5)!\n\napp.use(cors()); // (6)!\napp.use(express.json()); // (7)!\napp.use(express.raw({ type: \"application/webhook+json\" })); // (8)!\n
                                                                                                                                                                                                    1. Import AccessToken from livekit-server-sdk.
                                                                                                                                                                                                    2. The port where the application will be listening.
                                                                                                                                                                                                    3. The API key of LiveKit Server.
                                                                                                                                                                                                    4. The API secret of LiveKit Server.
                                                                                                                                                                                                    5. Initialize the Express application.
                                                                                                                                                                                                    6. Enable CORS support.
                                                                                                                                                                                                    7. Enable JSON body parsing for the /token endpoint.
                                                                                                                                                                                                    8. Enable raw body parsing for the /livekit/webhook endpoint.

                                                                                                                                                                                                    The index.js file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    It also initializes the WebhookReceiver object that will help validating and decoding incoming webhook events.

                                                                                                                                                                                                    Finally the express application is initialized. CORS is allowed, JSON body parsing is enabled for the /token endpoint and raw body parsing is enabled for the /livekit/webhook endpoint.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    app.post(\"/token\", async (req, res) => {\n  const roomName = req.body.roomName;\n  const participantName = req.body.participantName;\n\n  if (!roomName || !participantName) {\n    res.status(400).json({ errorMessage: \"roomName and participantName are required\" });\n    return;\n  }\n\n  const at = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET, { // (1)!\n    identity: participantName,\n  });\n  at.addGrant({ roomJoin: true, room: roomName }); // (2)!\n  const token = await at.toJwt(); // (3)!\n  res.json({ token }); // (4)!\n});\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit JS SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY, LIVEKIT_API_SECRET and setting the participant's identity.
                                                                                                                                                                                                    2. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/node/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    index.js
                                                                                                                                                                                                    const webhookReceiver = new WebhookReceiver( // (1)!\n  LIVEKIT_API_KEY,\n  LIVEKIT_API_SECRET\n);\n\napp.post(\"/livekit/webhook\", async (req, res) => {\n  try {\n    const event = await webhookReceiver.receive(\n      req.body, // (2)!\n      req.get(\"Authorization\") // (3)!\n    );\n    console.log(event); // (4)!\n  } catch (error) {\n    console.error(\"Error validating webhook event\", error);\n  }\n  res.status(200).send();\n});\n
                                                                                                                                                                                                    1. Initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. The body of the HTTP request.
                                                                                                                                                                                                    3. The Authorization header of the HTTP request.
                                                                                                                                                                                                    4. Consume the event as you whish.

                                                                                                                                                                                                    First of all we initialize the WebhookReceiver using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This object will validate and decode the incoming webhook events.

                                                                                                                                                                                                    The endpoint receives the incoming webhook with the async method WebhookReceiver#receive. It takes the body and the Authorization header of the request. If everything is correct, you can do whatever you want with the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/","title":"PHP Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for PHP that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit PHP SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need PHP and Composer installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/php\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      composer install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      composer start\n

                                                                                                                                                                                                    Warning

                                                                                                                                                                                                    LiveKit PHP SDK requires library BCMath. This is available out-of-the-box in PHP for Windows, but a manual installation might be necessary in other OS. Run sudo apt install php-bcmath or sudo yum install php-bcmath

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple PHP app with a single file index.php that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the index.php file:

                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\nrequire __DIR__ . \"/vendor/autoload.php\";\n\nuse Agence104\\LiveKit\\AccessToken; // (1)!\nuse Agence104\\LiveKit\\AccessTokenOptions;\nuse Agence104\\LiveKit\\VideoGrant;\nuse Agence104\\LiveKit\\WebhookReceiver;\nuse Dotenv\\Dotenv;\n\nDotenv::createImmutable(__DIR__)->safeLoad();\n\nheader(\"Access-Control-Allow-Origin: *\"); // (2)!\nheader(\"Access-Control-Allow-Headers: Content-Type, Authorization\");\nheader(\"Content-type: application/json\");\n\n$LIVEKIT_API_KEY = $_ENV[\"LIVEKIT_API_KEY\"] ?? \"devkey\"; // (3)!\n$LIVEKIT_API_SECRET = $_ENV[\"LIVEKIT_API_SECRET\"] ?? \"secret\"; // (4)!\n
                                                                                                                                                                                                    1. Import all necessary dependencies from the PHP LiveKit library.
                                                                                                                                                                                                    2. Configure HTTP headers for the web server: enable CORS support, allow the Content-Type and Authorization headers and set the response content type to application/json.
                                                                                                                                                                                                    3. The API key of LiveKit Server.
                                                                                                                                                                                                    4. The API secret of LiveKit Server.

                                                                                                                                                                                                    The index.php file imports the required dependencies, sets the HTTP headers for the web server and loads the necessary environment variables:

                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\nif (isset($_SERVER[\"REQUEST_METHOD\"]) && $_SERVER[\"REQUEST_METHOD\"] === \"POST\" && $_SERVER[\"PATH_INFO\"] === \"/token\") {\n    $data = json_decode(file_get_contents(\"php://input\"), true);\n\n    $roomName = $data[\"roomName\"] ?? null;\n    $participantName = $data[\"participantName\"] ?? null;\n\n    if (!$roomName || !$participantName) {\n        http_response_code(400);\n        echo json_encode([\"errorMessage\" => \"roomName and participantName are required\"]);\n        exit();\n    }\n\n    $tokenOptions = (new AccessTokenOptions()) // (1)!\n        ->setIdentity($participantName);\n    $videoGrant = (new VideoGrant()) // (2)!\n        ->setRoomJoin()\n        ->setRoomName($roomName);\n    $token = (new AccessToken($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)) // (3)!\n        ->init($tokenOptions)\n        ->setGrant($videoGrant)\n        ->toJwt();\n\n    echo json_encode([\"token\" => $token]); // (4)!\n    exit();\n}\n
                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit PHP SDK:

                                                                                                                                                                                                    1. Create an AccessTokenOptions object with the participant's identity.
                                                                                                                                                                                                    2. Create a VideoGrant object setting the necessary video grants options. setRoomJoin allows the user to join a room and setRoomName determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    3. We create the AccessToken providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET, initialize it with the token options, set the video grants and generate the JWT token.
                                                                                                                                                                                                    4. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/php/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    index.php
                                                                                                                                                                                                    <?php\n$webhookReceiver = (new WebhookReceiver($LIVEKIT_API_KEY, $LIVEKIT_API_SECRET)); // (1)!\n\nif (isset($_SERVER[\"REQUEST_METHOD\"]) && $_SERVER[\"REQUEST_METHOD\"] === \"POST\" && $_SERVER[\"PATH_INFO\"] === \"/livekit/webhook\") {\n    $headers = getallheaders();\n    $authHeader = $headers[\"Authorization\"]; // (2)!\n    $body = file_get_contents(\"php://input\"); // (3)!\n    try {\n        $event = $webhookReceiver->receive($body, $authHeader); // (4)!\n        error_log(\"LiveKit Webhook:\");\n        error_log(print_r($event->getEvent(), true)); // (5)!\n        exit();\n    } catch (Exception $e) {\n        http_response_code(401);\n        echo \"Error validating webhook event\";\n        echo json_encode($e->getMessage());\n        exit();\n    }\n}\n
                                                                                                                                                                                                    1. Create a new WebhookReceiver object providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    2. The Authorization header of the HTTP request.
                                                                                                                                                                                                    3. The raw body of the HTTP request as a string.
                                                                                                                                                                                                    4. Obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request.
                                                                                                                                                                                                    5. Consume the event as you wish.

                                                                                                                                                                                                    We first create a WebhookReceiver object using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. Then we must retrieve the Authorization header and the raw body of the HTTP request. We need both of them to validate and decode the incoming webhook event.

                                                                                                                                                                                                    Finally, we obtain the WebhookEvent object using the WebhookReceiver#receive method. It takes the raw body as a String and the Authorization header of the request. We can consume the event as we wish (in this case, we just log it using the error output).

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/","title":"Python Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Python with Flask that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Python SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Python 3 installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/python\n
                                                                                                                                                                                                    2. Create a python virtual environment

                                                                                                                                                                                                      python -m venv venv\n
                                                                                                                                                                                                    3. Activate the virtual environment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      .\\venv\\Scripts\\activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                      . ./venv/bin/activate\n
                                                                                                                                                                                                    4. Install dependencies

                                                                                                                                                                                                      pip install -r requirements.txt\n
                                                                                                                                                                                                    5. Run the application

                                                                                                                                                                                                      python app.py\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Flask app with a single file app.py that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the app.py file:

                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    import os\nfrom flask import Flask, request\nfrom flask_cors import CORS\nfrom dotenv import load_dotenv\nfrom livekit.api import AccessToken, VideoGrants, TokenVerifier, WebhookReceiver # (1)!\n\nload_dotenv() # (2)!\n\nSERVER_PORT = os.environ.get(\"SERVER_PORT\", 6080) # (3)!\nLIVEKIT_API_KEY = os.environ.get(\"LIVEKIT_API_KEY\", \"devkey\") # (4)!\nLIVEKIT_API_SECRET = os.environ.get(\"LIVEKIT_API_SECRET\", \"secret\") # (5)!\n\napp = Flask(__name__) # (6)!\n\nCORS(app) # (7)!\n
                                                                                                                                                                                                    1. Import all necessary dependencies from livekit library
                                                                                                                                                                                                    2. Load environment variables from .env file
                                                                                                                                                                                                    3. The port where the application will be listening
                                                                                                                                                                                                    4. The API key of LiveKit Server
                                                                                                                                                                                                    5. The API secret of LiveKit Server
                                                                                                                                                                                                    6. Initialize the Flask application
                                                                                                                                                                                                    7. Enable CORS support

                                                                                                                                                                                                    The app.py file imports the required dependencies and loads the necessary environment variables from .env file using dotenv library:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the Flask application is initialized and CORS support is enabled.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#create-token","title":"Create token","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    @app.post(\"/token\")\ndef create_token():\n    room_name = request.json.get(\"roomName\")\n    participant_name = request.json.get(\"participantName\")\n\n    if not room_name or not participant_name:\n        return {\"errorMessage\": \"roomName and participantName are required\"}, 400\n\n    token = (\n        AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!\n        .with_identity(participant_name) # (2)!\n        .with_grants(api.VideoGrants(room_join=True, room=room_name)) # (3)!\n    )\n    return {\"token\": token.to_jwt()} # (4)!\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Python SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/python/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    app.py
                                                                                                                                                                                                    token_verifier = TokenVerifier(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) # (1)!\nwebhook_receiver = WebhookReceiver(token_verifier) # (2)!\n\n\n@app.post(\"/livekit/webhook\")\ndef receive_webhook():\n    auth_token = request.headers.get(\"Authorization\") # (3)!\n\n    if not auth_token:\n        return \"Authorization header is required\", 401\n\n    try:\n        event = webhook_receiver.receive(request.data.decode(\"utf-8\"), auth_token) # (4)!\n        print(\"LiveKit Webhook:\", event) # (5)!\n        return \"ok\"\n    except:\n        print(\"Authorization header is not valid\")\n        return \"Authorization header is not valid\", 401\n
                                                                                                                                                                                                    1. Initialize a TokenVerifier using the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. Initialize a WebhookReceiver using the TokenVerifier. It will help validating and decoding incoming webhook events.
                                                                                                                                                                                                    3. Get the 'Authorization' header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the 'Authorization' header.
                                                                                                                                                                                                    5. Consume the event as you whish.

                                                                                                                                                                                                    First of all, we need a WebhookReceiver for validating and decoding incoming webhook events. We initialize it with a TokenVerifier built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    Inside the receive_webhook handler we:

                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw body of the request and the Authorization header. In this way, we can validate the event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    3. If everything is ok, you can consume the event as you whish (in this case, we just log it).

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/","title":"Ruby Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Ruby with Sinatra that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses LiveKit Ruby SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Ruby app using the popular Sinatra web library. It has a single file app.rb that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the app.rb file:

                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    require 'sinatra'\nrequire 'sinatra/cors'\nrequire 'sinatra/json'\nrequire 'livekit' # (1)!\nrequire './env.rb'\n\nSERVER_PORT = ENV['SERVER_PORT'] || 6080 # (2)!\nLIVEKIT_API_KEY = ENV['LIVEKIT_API_KEY'] || 'devkey' # (3)!\nLIVEKIT_API_SECRET = ENV['LIVEKIT_API_SECRET'] || 'secret' # (4)!\n\nset :port, SERVER_PORT # (5)!\n\nregister Sinatra::Cors # (6)!\nset :allow_origin, '*' # (7)!\nset :allow_methods, 'POST,OPTIONS'\nset :allow_headers, 'content-type'\nset :bind, '0.0.0.0' # (8)!\n
                                                                                                                                                                                                    1. Import livekit library
                                                                                                                                                                                                    2. The port where the application will be listening
                                                                                                                                                                                                    3. The API key of LiveKit Server
                                                                                                                                                                                                    4. The API secret of LiveKit Server
                                                                                                                                                                                                    5. Configure the port
                                                                                                                                                                                                    6. Enable CORS support
                                                                                                                                                                                                    7. Set allowed origin (any), methods and headers
                                                                                                                                                                                                    8. Listen in any available network interface of the host

                                                                                                                                                                                                    The app.rb file imports the required dependencies and loads the necessary environment variables (defined in env.rb file):

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Finally the application configures the port, sets the CORS configuration for Sinatra and binds the application to all available network interfaces (0.0.0.0).

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#create-token-endpoint","title":"Create token endpoint","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    post '/token' do\n  body = JSON.parse(request.body.read)\n  room_name = body['roomName']\n  participant_name = body['participantName']\n\n  if room_name.nil? || participant_name.nil?\n    status 400\n    return json({errorMessage: 'roomName and participantName are required'})\n  end\n\n  token = LiveKit::AccessToken.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (1)!\n  token.identity = participant_name # (2)!\n  token.add_grant(roomJoin: true, room: room_name) # (3)!\n\n  return json({token: token.to_jwt}) # (4)!\nend\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Ruby SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. roomJoin allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. Finally, we convert the AccessToken to a JWT token and send it back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/ruby/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    app.rb
                                                                                                                                                                                                    post '/livekit/webhook' do\n  auth_header = request.env['HTTP_AUTHORIZATION'] # (1)!\n  token_verifier = LiveKit::TokenVerifier.new(api_key: LIVEKIT_API_KEY, api_secret: LIVEKIT_API_SECRET) # (2)!\n  begin\n    token_verifier.verify(auth_header) # (3)!\n    body = JSON.parse(request.body.read) # (4)!\n    puts \"LiveKit Webhook: #{body}\" # (5)!\n    return\n  rescue => e\n    puts \"Authorization header is not valid: #{e}\"\n  end\nend\n
                                                                                                                                                                                                    1. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    2. Create a new TokenVerifier instance providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    3. Verify the Authorization header with the TokenVerifier.
                                                                                                                                                                                                    4. Now that we are sure the event is valid, we can parse the request JSON body to get the actual webhook event.
                                                                                                                                                                                                    5. Consume the event as you whish.

                                                                                                                                                                                                    We need to verify that the event is coming from our LiveKit Server. For that we need the Authorization header from the HTTP request and a TokenVerifier instance built with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.

                                                                                                                                                                                                    If the verification is successful, we can parse the request JSON body and consume the event (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/","title":"Rust Server Tutorial","text":"

                                                                                                                                                                                                    Source code

                                                                                                                                                                                                    This is a minimal server application built for Rust with Axum that allows:

                                                                                                                                                                                                    • Generating LiveKit tokens on demand for any application client.
                                                                                                                                                                                                    • Receiving LiveKit webhook events.

                                                                                                                                                                                                    It internally uses the LiveKit Rust SDK.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#running-this-tutorial","title":"Running this tutorial","text":""},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#1-run-openvidu-server","title":"1. Run OpenVidu Server","text":"Run OpenVidu locallyDeploy OpenVidu
                                                                                                                                                                                                    1. Download OpenVidu

                                                                                                                                                                                                      git clone https://github.com/OpenVidu/openvidu-local-deployment -b 3.0.0-beta3\n
                                                                                                                                                                                                    2. Configure the local deployment

                                                                                                                                                                                                      Windows macOS Linux
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n.\\configure_lan_private_ip_windows.bat\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_macos.sh\n
                                                                                                                                                                                                      cd openvidu-local-deployment/community\n./configure_lan_private_ip_linux.sh\n
                                                                                                                                                                                                    3. Run OpenVidu

                                                                                                                                                                                                      docker compose up\n

                                                                                                                                                                                                    To use a production-ready OpenVidu deployment, visit the official deployment guide.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    All application servers have an endpoint to receive webhooks from OpenVidu. For this reason, when using a production deployment you need to configure webhooks to point to your local application server in order to make it work. Check the Send Webhooks to a Local Application Server section for more information.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#2-download-the-tutorial-code","title":"2. Download the tutorial code","text":"
                                                                                                                                                                                                    git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git -b 3.0.0-beta3\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#3-run-the-server-application","title":"3. Run the server application","text":"

                                                                                                                                                                                                    To run this server application, you need Ruby installed on your device.

                                                                                                                                                                                                    1. Navigate into the server directory
                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-server/ruby\n
                                                                                                                                                                                                    2. Install dependencies
                                                                                                                                                                                                      bundle install\n
                                                                                                                                                                                                    3. Run the application
                                                                                                                                                                                                      ruby app.rb\n
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#4-run-a-client-application-to-test-against-this-server","title":"4. Run a client application to test against this server","text":"JavaScript React Angular Vue Electron Ionic Android iOS

                                                                                                                                                                                                    To run the client application tutorial, you need an HTTP web server installed on your development computer. A great option is http-server. You can install it via NPM:

                                                                                                                                                                                                    npm install -g http-server\n
                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-js\n
                                                                                                                                                                                                    2. Serve the application:

                                                                                                                                                                                                      http-server -p 5080 ./src\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the JavaScript tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-react\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the React tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-angular\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Angular tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-vue\n
                                                                                                                                                                                                    2. Install dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                    Accessing your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                    Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Vue tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-electron\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Run the application:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                    The application will seamlessly initiate as a native desktop program, adapting itself to the specific operating system you are using. Once the application is open, you should see a screen like this:

                                                                                                                                                                                                    Running your application client from other devices in your local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    For more information, check the Electron tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Node installed on your development computer.

                                                                                                                                                                                                    1. Navigate into the application client directory:

                                                                                                                                                                                                      cd openvidu-livekit-tutorials/application-client/openvidu-ionic\n
                                                                                                                                                                                                    2. Install the required dependencies:

                                                                                                                                                                                                      npm install\n
                                                                                                                                                                                                    3. Serve the application:

                                                                                                                                                                                                      You have two options for running the client application: browser-based or mobile device-based:

                                                                                                                                                                                                      Browser Mobile

                                                                                                                                                                                                      To run the application in a browser, you will need to start the Ionic server. To do so, run the following command:

                                                                                                                                                                                                      npm start\n

                                                                                                                                                                                                      Once the server is up and running, you can test the application by visiting http://localhost:5080. You should see a screen like this:

                                                                                                                                                                                                      Mobile appearance

                                                                                                                                                                                                      To show the app with a mobile device appearance, open the dev tools in your browser and find the button to adapt the viewport to a mobile device aspect ratio. You may also choose predefined types of devices to see the behavior of your app in different resolutions.

                                                                                                                                                                                                      Accessing your application client from other devices in your local network

                                                                                                                                                                                                      One advantage of running OpenVidu locally is that you can test your application client with other devices in your local network very easily without worrying about SSL certificates.

                                                                                                                                                                                                      Access your application client through https://xxx-yyy-zzz-www.openvidu-local.dev:5443, where xxx-yyy-zzz-www part of the domain is your LAN private IP address with dashes (-) instead of dots (.). For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Running the tutorial on a mobile device presents additional challenges compared to running it in a browser, mainly due to the application being launched on a different device, such as an Android smartphone or iPhone, rather than our computer. To overcome these challenges, the following steps need to be taken:

                                                                                                                                                                                                      1. Localhost limitations:

                                                                                                                                                                                                        The usage of localhost in our Ionic app is restricted, preventing seamless communication between the application client and the server.

                                                                                                                                                                                                      2. Serve over local network:

                                                                                                                                                                                                        The application must be served over our local network to enable communication between the device and the server.

                                                                                                                                                                                                      3. Secure connection requirement for WebRTC API:

                                                                                                                                                                                                        The WebRTC API demands a secure connection for functionality outside of localhost, necessitating the serving of the application over HTTPS.

                                                                                                                                                                                                      If you run OpenVidu locally you don't need to worry about this. OpenVidu will handle all of the above requirements for you. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                      Now, let's explore how to run the application on a mobile device:

                                                                                                                                                                                                      Requirements

                                                                                                                                                                                                      Before running the application on a mobile device, make sure that the device is connected to the same network as your PC and the mobile is connected to the PC via USB or Wi-Fi.

                                                                                                                                                                                                      Android device iOS device
                                                                                                                                                                                                      npm run android\n

                                                                                                                                                                                                      You will need Ruby and Cocoapods installed in your computer.

                                                                                                                                                                                                      The app must be signed with a development team. To do so, open the project in Xcode and select a development team in the Signing & Capabilities editor.

                                                                                                                                                                                                      npm run ios\n

                                                                                                                                                                                                      The script will ask you for the device you want to run the application on. You should select the real device you have connected to your computer.

                                                                                                                                                                                                      Once the mobile device has been selected, the script will launch the application on the device and you will see a screen like this:

                                                                                                                                                                                                      This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                      Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Ionic tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Android Studio installed on your development computer.

                                                                                                                                                                                                    1. Open Android Studio and import the project located at openvidu-livekit-tutorials/application-client/openvidu-android.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking the \"Run\" button in Android Studio. Check out the official documentation for further information.

                                                                                                                                                                                                    The application will initiate as a native Android program. Once the application is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real Android device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real Android device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the Android tutorial.

                                                                                                                                                                                                    To run the client application tutorial, you need Xcode installed on your MacOS.

                                                                                                                                                                                                    1. Launch Xcode and open the OpenViduIOS.xcodeproj that you can find under openvidu-livekit-tutorials/application-client/openvidu-ios.

                                                                                                                                                                                                    2. Run the application in an emulator or a physical device by clicking on the menu Product > Run or by \u2318R.

                                                                                                                                                                                                    Emulator limitations

                                                                                                                                                                                                    Publishing the camera track is not supported by iOS Simulator.

                                                                                                                                                                                                    If you encounter code signing issues, make sure you change the Team and bundle id from the previous step.

                                                                                                                                                                                                    The application will initiate as a native iOS application. Once the app is opened, you should see a screen like this:

                                                                                                                                                                                                    This screen allows you to configure the URLs of the application server and the LiveKit server. You need to set them up for requesting tokens to your application server and connecting to the LiveKit server.

                                                                                                                                                                                                    Connecting real iOS device to application server running in you local network

                                                                                                                                                                                                    One advantage of running OpenVidu locally is that you can test your application client in a real iOS device and be able to reach the application server very easily without worrying about SSL certificates if they are both running in the same local network. For more information, see section Accessing your local deployment from other devices on your network.

                                                                                                                                                                                                    Once you have configured the URLs, you can join a video call room by providing a room name and a user name. After joining the room, you will be able to see your own video and audio tracks, as well as the video and audio tracks of the other participants in the room.

                                                                                                                                                                                                    For more information, check the iOS tutorial.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#understanding-the-code","title":"Understanding the code","text":"

                                                                                                                                                                                                    The application is a simple Rust app with a single file main.rs that exports two endpoints:

                                                                                                                                                                                                    • /token : generate a token for a given Room name and Participant name.
                                                                                                                                                                                                    • /livekit/webhook : receive LiveKit webhook events.

                                                                                                                                                                                                    Let's see the code of the main.rs file:

                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    use axum::http::HeaderMap;\nuse axum::{\n    extract::Json, http::header::CONTENT_TYPE, http::Method, http::StatusCode, routing::post,\n    Router,\n};\nuse dotenv::dotenv;\nuse livekit_api::access_token::AccessToken; // (1)!\nuse livekit_api::access_token::TokenVerifier;\nuse livekit_api::access_token::VideoGrants;\nuse livekit_api::webhooks::WebhookReceiver;\nuse serde_json::{json, Value};\nuse std::env;\nuse tokio::net::TcpListener;\nuse tower_http::cors::{Any, CorsLayer};\n\n#[tokio::main]\nasync fn main() {\n    dotenv().ok(); // (2)!\n\n    let server_port = env::var(\"SERVER_PORT\").unwrap_or(\"6081\".to_string());\n\n    let cors = CorsLayer::new() // (3)!\n        .allow_methods([Method::POST])\n        .allow_origin(Any)\n        .allow_headers([CONTENT_TYPE]);\n\n    let app = Router::new() // (4)!\n        .route(\"/token\", post(create_token))\n        .route(\"/livekit/webhook\", post(receive_webhook))\n        .layer(cors);\n\n    let listener = tokio::net::TcpListener::bind(\"0.0.0.0:\".to_string() + &server_port)\n        .await\n        .unwrap();\n    axum::serve(listener, app).await.unwrap(); // (5)!\n}\n
                                                                                                                                                                                                    1. Import all necessary dependencies from the Rust LiveKit library.
                                                                                                                                                                                                    2. Load environment variables from .env file.
                                                                                                                                                                                                    3. Enable CORS support.
                                                                                                                                                                                                    4. Define /token and /livekit/webhook endpoints.
                                                                                                                                                                                                    5. Start the server listening on the specified port.

                                                                                                                                                                                                    The main.rs file imports the required dependencies and loads the necessary environment variables:

                                                                                                                                                                                                    • SERVER_PORT: the port where the application will be listening.
                                                                                                                                                                                                    • LIVEKIT_API_KEY: the API key of LiveKit Server.
                                                                                                                                                                                                    • LIVEKIT_API_SECRET: the API secret of LiveKit Server.

                                                                                                                                                                                                    Then CORS support is enabled and the endpoints are defined. Finally the axum application is initialized on the specified port.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#create-token-endpoint","title":"Create token endpoint","text":"

                                                                                                                                                                                                    The endpoint /token accepts POST requests with a payload of type application/json, containing the following fields:

                                                                                                                                                                                                    • roomName: the name of the Room where the user wants to connect.
                                                                                                                                                                                                    • participantName: the name of the participant that wants to connect to the Room.
                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<Value>) {\n    if let Some(payload) = payload {\n        let livekit_api_key = env::var(\"LIVEKIT_API_KEY\").unwrap_or(\"devkey\".to_string());\n        let livekit_api_secret = env::var(\"LIVEKIT_API_SECRET\").unwrap_or(\"secret\".to_string());\n\n        let room_name = match payload.get(\"roomName\") {\n            Some(value) => value,\n            None => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    Json(json!({ \"errorMessage\": \"roomName is required\" })),\n                );\n            }\n        };\n        let participant_name = match payload.get(\"participantName\") {\n            Some(value) => value,\n            None => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    Json(json!({ \"errorMessage\": \"participantName is required\" })),\n                );\n            }\n        };\n\n        let token = match AccessToken::with_api_key(&livekit_api_key, &livekit_api_secret) // (1)!\n            .with_identity(&participant_name.to_string()) // (2)!\n            .with_name(&participant_name.to_string())\n            .with_grants(VideoGrants { // (3)!\n                room_join: true,\n                room: room_name.to_string(),\n                ..Default::default()\n            })\n            .to_jwt() // (4)!\n        {\n            Ok(token) => token,\n            Err(_) => {\n                return (\n                    StatusCode::INTERNAL_SERVER_ERROR,\n                    Json(json!({ \"errorMessage\": \"Error creating token\" })),\n                );\n            }\n        };\n\n        return (StatusCode::OK, Json(json!({ \"token\": token }))); // (5)!\n    } else {\n        return (\n            StatusCode::BAD_REQUEST,\n            Json(json!({ \"errorMessage\": \"roomName and participantName are required\" })),\n        );\n    }\n}\n
                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    5. Finally, the token is sent back to the client.

                                                                                                                                                                                                    The endpoint first obtains the roomName and participantName parameters from the request body. If they are not available, it returns a 400 error.

                                                                                                                                                                                                    If required fields are available, a new JWT token is created. For that we use the LiveKit Rust SDK:

                                                                                                                                                                                                    1. A new AccessToken is created providing the LIVEKIT_API_KEY and LIVEKIT_API_SECRET.
                                                                                                                                                                                                    2. We set participant's name and identity in the AccessToken.
                                                                                                                                                                                                    3. We set the video grants in the AccessToken. room_join allows the user to join a room and room determines the specific room. Check out all Video Grants.
                                                                                                                                                                                                    4. We convert the AccessToken to a JWT token.
                                                                                                                                                                                                    5. Finally, the token is sent back to the client.
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/tutorials/application-server/rust/#receive-webhook","title":"Receive webhook","text":"

                                                                                                                                                                                                    The endpoint /livekit/webhook accepts POST requests with a payload of type application/webhook+json. This is the endpoint where LiveKit Server will send webhook events.

                                                                                                                                                                                                    main.rs
                                                                                                                                                                                                    async fn receive_webhook(headers: HeaderMap, body: String) -> (StatusCode, String) {\n    let livekit_api_key = env::var(\"LIVEKIT_API_KEY\").unwrap_or(\"devkey\".to_string());\n    let livekit_api_secret = env::var(\"LIVEKIT_API_SECRET\").unwrap_or(\"secret\".to_string());\n    let token_verifier = TokenVerifier::with_api_key(&livekit_api_key, &livekit_api_secret); // (1)!\n    let webhook_receiver = WebhookReceiver::new(token_verifier); // (2)!\n\n    let auth_header = match headers.get(\"Authorization\") { // (3)!\n        Some(header_value) => match header_value.to_str() {\n            Ok(header_str) => header_str,\n            Err(_) => {\n                return (\n                    StatusCode::BAD_REQUEST,\n                    \"Invalid Authorization header format\".to_string(),\n                );\n            }\n        },\n        None => {\n            return (\n                StatusCode::BAD_REQUEST,\n                \"Authorization header is required\".to_string(),\n            );\n        }\n    };\n\n    match webhook_receiver.receive(&body, auth_header) { // (4)!\n        Ok(event) => {\n            println!(\"LiveKit WebHook: {:?}\", event); // (5)!\n            return (StatusCode::OK, \"ok\".to_string());\n        }\n        Err(_) => {\n            return (\n                StatusCode::UNAUTHORIZED,\n                \"Error validating webhook event\".to_string(),\n            );\n        }\n    }\n}\n
                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    3. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    5. Consume the event as you wish.

                                                                                                                                                                                                    We declare as function parameters the map of headers (headers: HeaderMap) and the raw body (body: String) of the HTTP request. We will need both of them to validate and decode the incoming webhook event. We then:

                                                                                                                                                                                                    1. Create a TokenVerifier with the LIVEKIT_API_KEY and LIVEKIT_API_SECRET. This will validate the webhook event to confirm it is actually coming from our LiveKit Server.
                                                                                                                                                                                                    2. Create a WebhookReceiver with the TokenVerifier.
                                                                                                                                                                                                    3. Get the Authorization header from the HTTP request.
                                                                                                                                                                                                    4. Obtain the webhook event using the WebhookReceiver#receive method. It expects the raw string body of the request and the Authorization header.
                                                                                                                                                                                                    5. Consume the event as you wish (in this case, we just log it).

                                                                                                                                                                                                    Remember to return a 200 OK response at the end to let LiveKit Server know that the webhook was received correctly.

                                                                                                                                                                                                    Configure Webhooks

                                                                                                                                                                                                    If you are using a production deployment, remember to configure the webhook URL to point to your local application server as explained in the Send Webhooks to a Local Application Server section.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/","title":"Angular Components","text":""},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#introduction","title":"Introduction","text":"

                                                                                                                                                                                                    Angular Components are the simplest way to create real-time videoconferencing apps with Angular. There's no need to manage state or low-level events; Angular Components from OpenVidu handle all the complexity for you.

                                                                                                                                                                                                    This Angular library, offers developers a robust set of powerful and comprehensive videoconferencing components. These components are highly adaptable, extendable, and easily replaceable, allowing you to tailor them to your application's specific requirements.

                                                                                                                                                                                                    Angular Components

                                                                                                                                                                                                    The primary goal of the OpenVidu team is to minimize the developer's effort when creating videoconferencing applications. Angular Components significantly contribute to this objective for several reasons:

                                                                                                                                                                                                    • Rapid Development

                                                                                                                                                                                                      Abstracts the complexity of videoconferencing applications, allowing you to focus on customizations

                                                                                                                                                                                                    • Flexible Customization

                                                                                                                                                                                                      Offers maximum customization flexibility, allowing you to adapt, extend, and replace any component

                                                                                                                                                                                                    • Easy Maintenance

                                                                                                                                                                                                      Ensures your code remains up to date, making it easier to update your application with each new OpenVidu release

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#how-to-use","title":"How to use","text":"

                                                                                                                                                                                                    Using Angular Components in your application is straightforward. The official Angular Components Tutorials cover everything Angular Components offers, from customizing colors and branding logos to injecting new custom features.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#featured-components","title":"Featured Components","text":"
                                                                                                                                                                                                    • Videoconference

                                                                                                                                                                                                      The Videoconference component is the core of Angular Components. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • Panel

                                                                                                                                                                                                      The Panel components is the root of side panels in the videoconference. You can nest HTML and Angular components inside it or leave it empty to use the default setup.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#prefabricated-components","title":"Prefabricated Components","text":"

                                                                                                                                                                                                    Angular Components provides a wide range of prefabricated components that you can use to build your videoconferencing application in a matter of minutes. These components are designed for direct use without any extensions or modifications.

                                                                                                                                                                                                    Toolbar Layout Stream ChatPanel ParticipantsPanel ParticipantPanelItem ActivitiesPanel RecordingActivity BroadcastingActivity AdminLogin AdminDashboard"},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#directives","title":"Directives","text":"

                                                                                                                                                                                                    Angular Components provides two types of directives: Structural Directives and Attribute Directives.

                                                                                                                                                                                                    • Structural Directives: These directives manipulate the DOM by adding or removing elements from the view.

                                                                                                                                                                                                      They are distinguished by the asterisk (*) prefix and must be placed inside an HTML element within any Featured Component.

                                                                                                                                                                                                      For example, the *ovToolbar directive allows you to add a custom toolbar to the videoconference, replacing the default one.

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                    • Attribute Directives: Commonly known as Components Inputs, allow you to manipulate the appearance or behavior of an element.

                                                                                                                                                                                                      You can check the list of available structural directives in the Angular Components API Reference.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#events","title":"Events","text":"

                                                                                                                                                                                                    Each component in Angular Components emits a set of events that you can listen to in your application to trigger specific actions.

                                                                                                                                                                                                    These events are designed to provide you with the flexibility to customize your videoconferencing application according to your requirements.

                                                                                                                                                                                                    You can check out all component events in the Angular Components API Reference.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#applications","title":"Applications","text":"

                                                                                                                                                                                                    A practical example showcases the potential of Angular Components is our production-ready flagship application, OpenVidu Call. This application is built using Angular Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/angular-components/#references","title":"References","text":"
                                                                                                                                                                                                    • Angular Components API Reference
                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/react-components/","title":"React Components","text":""},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#introduction","title":"Introduction","text":"

                                                                                                                                                                                                    React Components are the simplest way to create real-time audio/video applications with React. There's no need to manage state or low level events, React Components from LiveKit handle all the complexity for you.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#featured-components","title":"Featured Components","text":"

                                                                                                                                                                                                    A curated set of components that we believe are essential and serve as a solid foundation for most applications.

                                                                                                                                                                                                    • LiveKitRoom

                                                                                                                                                                                                      It provides the Room context to all its children, serving as the root component of your application, and also exposes the Room state through a React context.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • RoomAudioRenderer

                                                                                                                                                                                                      It manages remote participants' audio tracks and ensures that microphones and screen sharing are audible. It also provides a way to control the volume of each participant.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    • TrackLoop

                                                                                                                                                                                                      Provides an easy way to loop through all participant camera and screen tracks. For each track, TrackLoop creates a TrackRefContext that you can use to render the track.

                                                                                                                                                                                                      See Reference

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#prefabricated-components","title":"Prefabricated Components","text":"

                                                                                                                                                                                                    Prefabricated are constructed using components and enhanced with additional functionalities, unique styles, and practical defaults. They are designed for immediate use and are not meant to be extended.

                                                                                                                                                                                                    AudioConference Chat ControlBar MediaDeviceMenu PreJoin VideoConference"},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#contexts","title":"Contexts","text":"

                                                                                                                                                                                                    Contexts are used to allow child components to access parent state without having to pass it down the component tree via props

                                                                                                                                                                                                    Participant Room Chat Feature Layout Pin TrackRef"},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#hooks","title":"Hooks","text":"

                                                                                                                                                                                                    Hooks are functions that let you use state and other React features without writing a class. They are functions that let you \u201chook into\u201d React state and lifecycle features from function components.

                                                                                                                                                                                                    React Components provides a set of hooks that you can use to interact with the components and the underlying LiveKit client.

                                                                                                                                                                                                    See Reference

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#applications","title":"Applications","text":"

                                                                                                                                                                                                    A practical example showcases the potential of React Components is the production-ready flagship application, LiveKit Meet. This application is built using React Components and demonstrates the power and flexibility of the library.

                                                                                                                                                                                                    "},{"location":"/3.0.0-beta3/docs/ui-components/react-components/#references","title":"References","text":"
                                                                                                                                                                                                    • React Components
                                                                                                                                                                                                    "}]} \ No newline at end of file diff --git a/3.0.0-beta3/sitemap.xml b/3.0.0-beta3/sitemap.xml index b0f462d0..fbe3b859 100644 --- a/3.0.0-beta3/sitemap.xml +++ b/3.0.0-beta3/sitemap.xml @@ -4,34 +4,6 @@ https://openvidu.io/3.0.0-beta3/ 2025-01-03 - - https://openvidu.io/3.0.0-beta3/account/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/pricing/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/support/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/blog/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/conditions/cookie-policy/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/conditions/privacy-policy/ - 2025-01-03 - - - https://openvidu.io/3.0.0-beta3/conditions/terms-of-service/ - 2025-01-03 - https://openvidu.io/3.0.0-beta3/docs/comparing-openvidu/ 2025-01-03 diff --git a/3.0.0-beta3/sitemap.xml.gz b/3.0.0-beta3/sitemap.xml.gz index 4053968ac1683a1311b4730c886cd7461e5bf05a..a19269b57367217fdf6ec302361d01899d1db1dd 100644 GIT binary patch literal 911 zcmV;A191EwiwFqFH+W|N19NF~Wo=<_E_iKh0M(jNkJ~m3fZzKo4tZCc_F7;q?o#Y! ze_$K>OiQ$_RTedgPMUu|De+}V@0uQl0iyj7JF+Z&CMl7k{P6kP=m|tH#RjUNjBXhw>43W`PqKN1a5~fPs8{DCz zP~>o+DV}wrAOwj>1ML-4C9*S#2IoXD9E<9JBy^n`D3vjkbru{QM)a)s5UN@86;lU) zOTfraK`mps0@36<+fNZVyP`%9;QKPhPQ~&7tykHqc#uaHvBQ|1I7&dn(!AA@P+*@L zFr)R-psdfnzS_+FA{KcSB96910ODkJ2`5N)0|=oIW#}`HEIo-d@9(%~i7De+!E{~- z-7)@F{bY@dDDN6bM+8Rom~@ zHJ3P|g8J{l1V#6kXd=V>9|6{tAx})vf-8dB6|Z4bmt)o(tJaDOZV^S)6w6+fdb%eX zvV~MF6?Q@B`^iC6Wv7cgdKRGB=Scr$qKN=m(Y$Xmxz{~y5>l=mhCs$@}-0|-AiC12jyR|gQTMkBFATr5VT0J-Bc?R z`7&0?;i9a`Vn#B=9%bopChKc`7R literal 931 zcmV;U16=$ciwFpSD0gQ9|8r?{Wo=<_E_iKh0M**Tj@vd60ML8BV&OY2Cr*L3*maOg zf1oXT9+4x7S&GAwBRT&24sEaNByCX?#cJfk+AGWA^N`exC_jGqJcfrEbMX|PHgC7P z%>zbD&d2^~^Xo4^neR6r4sRZ(918M->>SI}W?)V~HqG&P+!oI`LMmIzeN*fp|CHvs zvDs~Z*c{$G$fF+M^6LC}3}g@WC`ArK3FGYDwDr{Nx4Z4mw8*e;9-F$?{fD6NNbc}% z_wGBhduw)k+2y+J(n@n{=D#!u*3uOD^&3vvTM78`3S%CNq0SV{v$y#A7)Q4D&6ps|gfK6=Ed=S2xiShvW^@ZF zG6sZ#WufLB&KM}wIGkw8w>~kDl19=%N5iy`>?W}gf(pZV(=w2Pp)&)OI)|jsQlQg_ zkqw^`sxWo%y9S1Q3W5fRq=L@(Q-+!j8aqJj>m0jm)(7;_$f)8$pDbgCS?XxiK*M@? zZ#7ZiSQ>DnkJ?Z^O0Ew<6N{or8Ao3$0Ch3D$0>^407?|92Kv>btDjU3@2_0fh#41J z#k#0OcdoxpKY6F4%KH*zGXkS|$=7H;{`Rx6nAvyU$~*eR7@-YloG<5RX?6-4BYSlo zu^ot>H3B~~<_N)*y*^w=*`j&>es4Iah+WDu&}=PdjZ7JLQfca73UWb70W&Bmx4$ta z%+k4|T3?Z?PiTGcth0})t;>A=E(4HETH2NzE#?YEdZ4Xerm*#pdNb)yNjgVoPCn z!q`s%vZ;5vC}QNIk@V+n6?eHqD5Z0Ph(Wt{tSiF{C$oQNwNqgl4M=vLCB#@R0bYaI z4#4Zt1~}2gYmlyBhTWu@z4ZdV4g^zw_hT?%z0J4YZ?H1?iq08@^>wL0N{p%JS5nbh^q?r-{kmSJrA4WWQvcbK(DjIzJWU!yl%#lSJ}0 F004S6)kFXQ diff --git a/sitemap_index.xml b/sitemap_index.xml index 9f86c944..fe731fb4 100644 --- a/sitemap_index.xml +++ b/sitemap_index.xml @@ -1,5 +1,9 @@ + + https://openvidu.io/3.0.0-beta3/sitemap.xml.gz + 2025-01-03 + https://openvidu.io/3.0.0-beta2/sitemap.xml.gz 2025-01-03